我有一个查询,它搜索一个包含大约 100 万条折扣记录的大表,但我遇到了这个表的索引问题。
SELECT TOP 1 D.Discount
FROM Discount D
WHERE (D.ProductGroupId = @ProductGroupId OR D.ProductId = @ProductId)
AND (D.CampaignId IS NULL AND (D.CustomerGroupId = @CustomerGroupId OR D.CustomerId = @CustomerId OR (D.CustomerId IS NULL AND D.CustomerGroupId IS NULL)))
AND getDate() BETWEEN D.StartDate AND D.EndDate
AND D.Quantity = 1
ORDER BY D.Discount DESC
产品/产品组、开始日期/结束日期和数量上的 where 子句都运行良好。这张表上没有任何特殊索引,我会在大约 2 秒内找到正确的折扣。(这不是那么快,但在这种情况下远非戏剧性)。
问题出在campaignId/CustomerGroupId/CustomerId 部分。添加此部分会使查询运行超过 2 分钟。我确信这可以解决,也许使用正确的索引,但我一直在尝试设置各种索引,但没有任何效果。