我有一个奇怪的查询计划问题。我有两个数据库(我们称它们为 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
谢谢,真的,非常感谢任何帮助!!!
我有以下查询:
SELECT
[ID] AS [NewID]
, (
CASE WHEN LEN([MiddleName]) > 0 THEN
[LastName] + ', ' + [FirstName] + ' ' + LEFT([MiddleName],1) + '.'
ELSE
[LastName] + ', ' + [FirstName]
END
) AS [Name]
, [Title] AS [ProfTitle]
, CONVERT(CHAR(10),[DepartureDate],111) AS [BorDepart]
, [LocationOfficeNumber] AS [OfficePhone]
, [Location]
, [LocationSection] AS [Sec]
, [PracticeGroup] AS [PracticeTL]
, [Email]
FROM [dbo].[Borrowers]
Run Code Online (Sandbox Code Playgroud)
有了这个,我想知道如何编写一个转换为这个输出的 FOR XML 查询:
<sydney>
<import>
<template id="Borrower" name="Borrowers">
<record searchfield="NewID" searchvalue="NewID">
<field id="NewID">
<![CDATA[NEWID]]>
</field>
<field …
Run Code Online (Sandbox Code Playgroud)