我在按日期时间
列进行过滤时遇到问题。
我尝试了这两种方法:
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/