sql - 如何提高 SQL Server 中日期时间过滤的性能?

标签 sql sql-server

我在按日期时间列进行过滤时遇到问题。

我尝试了这两种方法:

datefield < '2013-03-15 17:17:55.179'
datefield < CAST('2013-03-15 17:17:55.179' AS datetime)

我有一个包含超过 3.000.000 个主要对象的大型数据库。

所以我需要提高日期时间过滤的性能。我正在阅读有关 UNIX 时间戳的内容(将所有 datetime 转换为 UNIX 时间戳,然后按此 UNIX 字段进行过滤)。

我认为这是比按日期时间过滤更好的方法。但如果有人知道其他方式,我将不胜感激。

我的查询是:

SELECT TOP (100)  ev.Title as Event_name, po.Name as POI_name, 
po.Address, po.City, po.Region, po.Country, po.Latitude, po.Longitude, ev.Start_time, 
(Select ID_Category FROM SubCategory s where ev.ID_SubCategory = s.ID_SubCategory) as ID_Category, 
ev.ID_SubCategory, ev.ID_Event, ev.ID_Channel, IDChanelEvent, 
ev.FavoriteCount, po.gmtOffset, v.IsFavorite, v1.IsFavorite  
FROM Events ev 
JOIN POI po ON ev.ID_POI = po.ID_POI 
JOIN (SELECT et.id_event as joinIdEv FROM EventTagLink et, tags t 
 WHERE t.id_tag = et.id_tag 
 AND ( t.Title = N'music' ) 
 ) as joinEvents 
 ON joinEvents.joinIdEv = ev.ID_Event 
LEFT JOIN Viewed v ON v.ID_Event = ev.ID_Event AND v.ID_User = 1 AND v.IsFavorite = 1 LEFT join Viewed v1 ON v1.ID_Event = ev.ID_Event AND v1.ID_User = 1 AND v1.IsFavorite = 0
WHERE 
--ev.GmtStop_time > '2013-03-15 14:17:55.188' AND 
po.Latitude > 41.31423 AND po.Latitude < 61.60511 
AND  po.Longitude > -6.676602 AND po.Longitude < 17.04498  
AND ev.ID_SubCategory in (3, 12, 21, 4, 30, 13, 22, 6, 14, 40, 23, 7, 32, 15, 41, 8, 50, 33, 16, 42, 25, 9, 34, 17, 35, 18, 44, 27, 36, 19, 45, 28, 37, 46, 29, 38, 47, 39, 48, 49, 10, 1, 11, 2, 20) 
--AND ev.GmtStart_time< '2013-03-15 17:17:55.179'
AND v1.IsFavorite is null

按我发表评论的时间进行过滤。

如果我关闭这些过滤器,请求持续时间为几秒钟。如果我打开它们,则请求持续时间将超过 25 秒。

所以有很多关于执行计划、索引等的讨论。但是 UNIX 时间戳呢?这是我提出问题的主要原因。 它会提高日期时间过滤的性能吗?

最佳答案

当涉及到 msql 中日期时间的索引时,只是一个建议是索引占用空间会影响搜索时间(是的,这似乎很明显......但请继续阅读)。

在对日期时间建立索引时,例如“2015-06-05 22:47:20.102”,索引必须考虑日期时间中的每个位置。这在空间上变得非常大并且笨重。我利用的一个成功方法是创建一个新的日期时间列,并通过将时间四舍五入到小时来填充数据,然后在此新列上构建索引。示例“2015-06-05 22:47:20.102”转换为“2015-06-05 22:00:00.000”。通过采用这种方法,我们可以保留详细数据,并可以显示它或通过在这个新列上搜索来使用它,这使我们在返回结果的速度方面获得了大约 10 倍(至少)的返回。这是因为索引不必考虑分钟、秒和毫秒字段。

关于sql - 如何提高 SQL Server 中日期时间过滤的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17381875/

相关文章:

sql - 在BigQuery中格式化日期

mysql - SQL 查询返回 null Mysql

mysql - 如何在 MySQL 中的列的所有值上向左移动一个点 6 个空格?

sql-server - 我使用的是 SQL Server 还是 SQL Azure?

sql - SQL Server如何统计提交人数

c# - 将 sql 存储过程用于 yes no 输出

mysql - 如果连接表中存在指定值,如何使用 LEFT JOIN 选择行?

sql - 将临时表传递给另一个存储过程

SQL Server CTE 循环;将所有记录插入在一起

MySQL - 无法从 MSSQL 转换