我有一些我继承的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之间进行隐式转换。是因为它们的长度不同吗?
我对执行计划还不熟悉
是否有一种简单的方法可以确定exec计划中的哪个节点与查询的哪个部分相关? 是谓词,连接子句吗?
此致
标记
答案 0 :(得分:1)
某些变量可以进行整理:enter link description here
无论您需要验证排序规则,都可以在服务器,数据库,表和列级别指定。
首先,检查tempdb和供应商提供的数据库之间的排序规则。它应该匹配。如果没有,它将倾向于进行隐式转换。
假设您无法修改供应商提供的代码库,以下一项或多项措施可以帮助您: 1)预定义临时表,并为关键字段指定与使用中的数据库相同的排序规则,而不是tempdb。 2)进行字符串比较时提供校对。 3)如果对临时表使用“select into”,则指定键值的排序规则 4)确保表和列上的排序规则与数据库排序规则匹配(如果仅将供应商中的特定表导入现有数据库,则非常重要。)
如果您可以更改供应商提供的代码库,我建议您查看使所有char键长度相同而非varchar的成本。 Varchar的开销为10.需要注意的是,如果你创建一个非空的固定长度字符字段,它将被填充到右边(不可避免)。
理想情况下,您将拥有int键,并且仅使用varchar字段进行用户交互/查找:
create table Products(ProductID int not null identity(1,1)primary key clustered,ProductNumber varchar(50)not null)
alter table产品添加约束uckProducts_ProductNumber unique(ProductNumber)
然后在ProductID上进行所有连接,而不是ProductNumber。只需过滤ProductNumber。
非常好。