我有一个查询(由 LINQ to SQL 创建)来获取在某个日期范围内进行的“站点访问”列表,这些日期范围导致了订单(orderid 不为空)。
查询没有问题。我只需要有关为其创建正确索引的建议。我在生产站点上尝试不同的组合并设法搞砸了,以至于外键断开连接。在一些恐慌之后,我修复了这个问题 - 但我想我现在会在重新创建索引之前征求意见。
该表接近一百万行,我需要索引来帮助我。此查询仅用于报告,因此不必非常快,只是不要延迟其他用户的查询(它正在这样做)。
SELECT TOP 1000
t0.SiteVisitId, t0.OrderId, t0.Date,
t1.Domain, t0.Referer, t0.CampaignId
FROM
SiteVisit AS t0
LEFT OUTER JOIN KnownReferer AS t1 ON t1.KnownRefererId = t0.KnownRefererId
WHERE
t0.Date <= @p0
AND t0.Date >= @p1
AND t0.OrderId IS NOT NULL
ORDER BY
t0.Date DESC
@p0='2008-11-1 23:59:59:000', @p1='2008-10-1 00:00:00:000'
我目前有一个聚集索引SiteVisitId
,这是我的身份整数列。
我不知道以下哪个最有可能是最有效的:
- 创建索引
Date
- 创建一个索引
Date
和一个单独的索引OrderId
Date
在AND上创建“多列”索引OrderId
- 其他组合?
我还想知道是否应该创建一个单独的位列,hasOrder
而不是检查OrderId IS NOT NULL
这是否更有效。
仅供参考:KnownReferer 只是一个包含 100 个左右已知 HttpReferer 列表的表格,因此我可以轻松查看来自 google、yahoo 等的点击量。