2013-06-28 91 views
0

总而言之,对varchar而不是bigint的性能略有改善。SQL Server隐式转换为varchar vs 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' 事?我应该把它转换成什么?

而不是我转换为varchar(256)item.id是更好的,我转换为bigintsalesitem.item_id

对于如:

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

请大家注意,上面的SQL只是一个样本。

+0

我想,这就是你必须像以前一样尝试自己,并看到性能问题。您拥有所有必需的表格和足够的数据来查看差异。就像以前一样(你改成Varchar)现在改成bigint并看看。并且,考虑关于加入列索引的另一件事。 – 2013-06-28 07:58:04

+0

@ N.p Subedi雅,谢谢你的建议。我测试转换为主表是更快的艰难从3分钟到几秒 正确的SQL将是[从SalesItem左选择sales.temm.id左连接项Item.id =转换(bigint,Salesitem.item_id)],而不是我转换item.id到varchar(256),它将更快地将salesitem.item_id转换为bigint。 – Worgon

回答

1

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

说到你的情况,当将SalesItem.item_id转换为bigint时,select可能会失败,因为它首先存储为varchar,它也可能有一些字符,无法转换为整数。

+0

经过测试,如果我将其转换为大整数,速度肯定会更快。 – Worgon