Sup*_*ral 6 sql-server parallelism execution-plan sql-server-2008-r2
我有一个奇怪的查询计划问题。我有两个数据库(我们称它们为 DB1 和 DB2),它们都位于同一个 SQL-Server 实例中并且具有相同的架构。在那里,我们有几个表,dbo.CostCard其中有 43258326 行,并且dbo.CostType两个数据库都有 150 行。
过去几周,我们一直在针对 DB1 进行一些应用程序测试。作为这些测试的结果,两个表的数据都发生了变化。目前,表dbo.CostCard增加到43379268(增加120942行),表dbo.CostType增加到199(增加49行)。我们还实施了一个维护策略,该策略使用逻辑来根据碎片重新组织/重建索引,并在数据发生更改时更新统计信息,我们使用完整扫描进行更新。
目前,只有 DB1 具有此维护例程设置,我们注意到两个表的统计信息和索引都已正确更新。到现在为止还挺好!
现在到了奇怪的部分。我们有一个相当简单的声明,我们注意到性能下降非常大。这是声明:
SELECT DISTINCT TOP 100
n1t1.Description
FROM
CostCard AS n0t0
JOIN CostType AS n1t1
ON ( n0t0.CostType ) = ( n1t1.Code )
WHERE
( ( n1t1.Description ) LIKE ( '%legal research%' ) )
AND ( ( n1t1.Description ) IS NOT NULL )
ORDER BY
n1t1.Description
Run Code Online (Sandbox Code Playgroud)
我们注意到查询优化器正在为 DB1 创建一个串行计划(我们已经重新编译了很多次),我们知道统计信息和索引正在定期更新,并且正在使用并行计划(更好的计划,是的,我们也重新编译了很多次)用于过去几个月一直闲置的 DB2 !!!
这怎么可能?在过去的几周里,我一直在试图解决这个问题,但已经没有想法了。有人可以在这里解释一下吗?
PS:我附上了一个包含所有信息的压缩文件,包括查询计划和统计信息。
https://dl.dropboxusercontent.com/u/72497299/Terrible%20Bad%20Query%20Plan.zip
谢谢,真的,非常感谢任何帮助!!!
小智 1
不同的数据库怎么可能使用不同的查询计划?这一切都取决于设置的选项、统计信息、查询、索引等。我无法开始向你解释。
我建议你做的是,如果你知道它应该使用的计划,你可以给出查询提示(通常是一个坏主意)或者你可以重写你的查询。首先,您确实知道“IS NOT NULL”是不必要的。去掉它。另外,当进行“喜欢”时,最好在末尾加上百分号,例如“法律研究%”。
此外,您实际上不需要加入这里。你只需要得到一个存在...
你的“来自”表应该是你真正想要得到的。您想获取 CostType 描述,是吗?那么让我们从这里开始......
SELECT Ct.Description FROM CostType ct
WHERE EXISTS (SELECT 1 FROM CostCard cc WHERE cc.CostType = ct.Code)
AND Ct.Description like 'Legal Research%'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
630 次 |
| 最近记录: |