【发布时间】: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