【发布时间】:2010-09-23 15:50:00
【问题描述】:
我有一个查询(由 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上创建一个单独的索引 - 在
DateANDOrderId上创建一个“多列”索引 - 其他组合?
我还想知道是否应该为hasOrder 创建一个单独的位列,而不是检查OrderId IS NOT NULL 是否更有效。
仅供参考:KnownReferer 只是一个包含 100 个左右已知 HttpReferer 列表的表格,因此我可以轻松查看来自 google、yahoo 等的点击量。
【问题讨论】:
标签: sql sql-server indexing