0

我有一个查询,它搜索一个包含大约 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 分钟。我确信这可以解决,也许使用正确的索引,但我一直在尝试设置各种索引,但没有任何效果。

4

2 回答 2

1

您可以尝试将其转换为动态 SQL 并从部分构建。您在查询中的那些OR使其运行速度变慢。如果您一次只将一个参数传递给您的查询,那将会改进它。

如果您当时只搜索一个参数,您可能会做的另一件事是创建 2 个单独的存储过程,因为您将能够分别优化每一个。不要在开头创建一个带有 IF 的存储过程(如果 @param1 IS NOT NULL ... ELSE ...),因为 SQL Server 有时在为此类存储过程生成正确的执行计划时会遇到问题。

于 2013-10-06T09:28:15.397 回答
0

你的问题是数据量。索引可以在一定程度上有所帮助,但这里的数据总是会使查询变慢。

您需要对表进行分区以限制您处理的数据量,这将使您的查询运行得更快。

于 2013-10-06T09:23:41.733 回答