【问题标题】:SQL Server Implicit convert to varchar vs bigintSQL Server 隐式转换为 varchar 与 bigint
【发布时间】:2013-06-28 07:31:10
【问题描述】:

总之,是对 varchar 而不是 bigint 的性能稍有改进。

例如,我有一个像下面这样的两个表

物品

ID bigint PK;
item_code varchar(256);

SalesItem

ID bigint PK;
item_id varchar(256);

请注意item_id 不是外键,由于某些特殊情况,item_id 允许为varchar(256)

我试过这样的 SQL 语句

Select SalesItem.item_id
from SalesItem
left join Item on SalesItem.item_id = Item.id

这会导致 SQL Server 试图将 varchar 转换为 int 并且性能最差的隐式转换。

不知怎么的,我们把sql改成了下面的:

Select SalesItem.item_id
from SalesItem
left join Item on SalesItem.item_id = convert(varchar(256), Item.id)

表现不错,下降了近70%-80%

只是好奇'ON' 上的序列是否重要?我应该转换哪个?

我在item.id 上转换为varchar(256) 不是在salesitem.item_id 上转换为bigint 更好吗?

例如:

Select SalesItem.item_id
from SalesItem
left join Item on Item.id = convert(bigint, SalesItem.item_id)

请注意,上面的sql只是一个示例。

【问题讨论】:

  • 我认为,这是您必须像以前一样尝试自己并查看性能问题的方法。您拥有所有必需的表和足够的数据来查看差异。就像以前一样(您更改为 Varchar)现在将其更改为 bigint 并查看。而且,还要考虑另一件事,关于在 Join Column 上建立索引。
  • @N.p Subedi Ya,感谢您的建议。我测试了从 3 分钟到几秒钟的转换到主表的速度要快得多正确的 sql 将是 [Select salesitem.item_id from SalesItem left join Item on Item.id = convert(bigint, Salesitem.item_id)] 而不是我转换项目.id 到 varchar(256),我将 salesitem.item_id 转换为 bigint 要快得多。

标签: sql-server performance join implicit-conversion


【解决方案1】:

通常比较两个数字会比比较两个字符串更好。

也就是说,在您的情况下,当您将 SalesItem.item_id 转换为 bigint 时,选择可能会失败,因为它首先存储为 varchar,它也可能有一些字符,这无法转换为整数。

【讨论】:

  • 经过测试,如果我将其转换为大整数,它肯定会更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 2018-02-10
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多