> =运算符在where子句中的巨大影响

时间:2014-04-02 10:55:08

标签: sql sql-server tsql

我已经问过几乎相同的question但是它没有得到满意的解答,我只是遇到了类似的情况。

select r.order_number, cl.COMMANDE, m.[order #]
from [Offline RN General] r 
left join mcdb_summary m ON r.order_number=m.[order #]
left join coclico cl ON cl.ORDER_ID=r.order_number
where r.[order_number] is not null and r.GroupID=358472  and converted='yes' and r.[Booking Date]>='20140401'

所以最后一个条件(r。[预订日期] > = ' 20140401')导致查询至少需要40秒才能完成,而没有那个条件或 - 奇怪 - 或者如果是r。[预订日期] < ' 20140401'它只需要2秒钟。 greater or equal less than

在第一种情况下,显然影响最大的是[mcdb_summary]。[suggest2]索引扫描 - 它之前由ssms建议 - 这是它的定义:

CREATE NONCLUSTERED INDEX [suggested2] ON [dbo].[mcdb_summary] 
(
    [cancelled] ASC
)
INCLUDE ( [order #],
[Product_Name]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

有人能指出我可能的原因并解决问题吗?

2 个答案:

答案 0 :(得分:1)

首先要尝试:

UPDATE STATISTICS [Offline RN General];

统计信息提供有关数据分布的信息(例如,日期X的行数,日期Y的数量等),这有助于查询引擎采取基于成本的"决策:执行索引搜索而不是索引扫描等。

您可以通过运行简单的SQL query

来查看这些统计信息
DBCC SHOW_STATISTICS('<tablename>', '<indexname>');

您可以详细了解统计信息are updated

答案 1 :(得分:0)

如果没有看到索引,我会确保所有可能的密钥都处于良好状态,以优化“R”表上的查询。

table                 index
[Offline RN General]  ( groupID, converted, order_number, [booking date]  )
mcdb_summary          ( [order #] )
coclico               ( order_id, commande )

此外,所有列(已转换)的确认都应该符合表格...我只能转换的GUESS在脱机RN常规表中。