【发布时间】:2012-09-18 12:57:21
【问题描述】:
我继承了一些 T-SQL (SQL Server 2008),并试图找出为什么某些查询运行速度非常慢。在Actual Execution Plan 中,我进行了三个聚集索引扫描,分别花费了我 19%、21% 和 26%,所以这似乎是我的问题的根源。
字段的内容通常是数字(但有些职位编号有字母前缀)
数据库设计(供应商提供)非常糟糕。在他们的应用程序中,工作编号的最大长度为 12 个字符,但在连接的表中,在某些地方它被定义为 varchar(50),在其他地方定义为 varchar(15)。我的参数是varchar(12),但如果我将其更改为varchar(50),我会得到同样的结果
节点包含这个:
Predicate: [Live_Costing].[dbo].[TSTrans].[JobNo] as [sts1].[JobNo]=CONVERT_IMPLICIT(varchar(50),[@JobNo],0)
sts1 是派生表,但它从中提取jobno 的表是varchar(50)
我不明白为什么它在 2 个 varchars 之间进行隐式转换。只是因为它们的长度不同吗?
我对执行计划还很陌生
有没有一种简单的方法可以确定执行计划中的哪个节点与查询的哪个部分相关? 是谓词,是连接子句吗?
问候
标记
【问题讨论】:
-
Probably a collation mismatch。尽管转换发生在参数而不是列上,但这看起来不会是您的问题的原因。
-
好吧,为了给你一个中肯而公平的答案,还需要一些更多的信息。也许你可以给我们一些关于执行计划的更多细节?也许您可以在某处发布一些图片或其中的xml?
-
这是一个巨大的查询。我会发布执行计划,但如果我编辑帖子,似乎没有办法添加附件(我可以找到)
-
编辑帖子时,您可以添加图片:)
-
当您说“sts1”是派生表时 - 这是在嵌套选择中吗?如果是这样,为什么连接上的谓词而不是嵌套选择/ CTE 中的谓词?要求 SQL 将所有数据放入派生表然后要求它在派生表之外执行过滤器似乎有点奇怪(除非数据有其他用途?)这将有助于查看 SQL 本身。