【问题标题】:T-SQL implicit conversion between 2 varchars2个varchars之间的T-SQL隐式转换
【发布时间】: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 本身。

标签: tsql implicit-conversion


【解决方案1】:

一些变量可以有排序规则:enter link description here

无论您需要验证排序规则,都可以在服务器、数据库、表和列级别指定。

首先,检查 tempdb 和供应商提供的数据库之间的排序规则。它应该匹配。如果没有,它将倾向于进行隐式转换。

假设您无法修改供应商提供的代码库,以下一项或多项应该可以帮助您: 1)预定义您的临时表并为键字段指定与正在使用的数据库中相同的排序规则,而不是 tempdb。 2) 在进行字符串比较时提供排序规则。 3) 如果对临时表使用“select into”,请指定键值的排序规则 4) 确保您的表和列的排序规则与您的数据库排序规则相匹配(如果您仅将特定表从供应商导入到现有数据库中,则非常重要。)

如果您可以更改供应商提供的代码库,我建议您查看使所有 char 键长度相同而不是 varchar 的成本。 Varchar 的开销为 10。需要注意的是,如果您创建一个不为 null 的固定长度字符字段,它将被填充到右侧(不可避免)。

理想情况下,您应该有 int 键,并且只使用 varchar 字段进行用户交互/查找:

创建表 Products(ProductID int not null identity(1,1) primary key clustered, ProductNumber varchar(50) not null)

更改表 Products 添加约束 uckProducts_ProductNumber unique(ProductNumber)

然后在 ProductID 而不是 ProductNumber 上执行所有联接。只需过滤 ProductNumber。

会很好的。

【讨论】:

    猜你喜欢
    • 2018-12-31
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多