我在按照datetime
列进行过滤时遇到了问题。
我尝试了以下两种方法:
datefield < '2013-03-15 17:17:55.179'
datefield < CAST('2013-03-15 17:17:55.179' AS datetime)
我有一个超过 3,000,000 个主要对象的大型数据库。
因此,我需要改进我的 datetime
过滤性能。我读过关于 UNIX 时间戳的文章(将所有的 datetime
转换为 UNIX 时间戳,然后通过这个 UNIX 字段进行过滤)。
我认为这比按 datetime
进行过滤更好。但如果有人知道其他方法,我会很感激。
我的查询语句是:
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时间戳呢?这正是我提出这个问题的主要原因。使用datetime
过滤器是否会提高性能?
datefield
列是否创建了索引? - a1ex07WHERE
表达式中使用任何 函数(例如CAST
)来处理日期时间列。 - marc_s