2个varchars之间的T-SQL隐式转换

时间:2012-09-26 20:06:01

标签: tsql implicit-conversion

我有一些我继承的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计划中的哪个节点与查询的哪个部分相关? 是谓词,连接子句吗?

此致

标记

1 个答案:

答案 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。

非常好。