2014-01-21 38 views
0

我正在查询两个表之间的连接,请检查下面的例如SQL-列数据类型差异和性能影响

您会注意到用于nTransactionId属性的数据类型之间存在差异。

Table_1 
Column Name   Data Type 
______________________________________ 
nTransactionld  numeric(18, O) 
sValue    varchar(50) 


Table_2 
Column Name   Data Type 
______________________________________ 
nTransactionld  bigint 
sValue    varchar(50) 

在使用数字(18,0)数据类型的“TABLE_1”表,并在“TABLE_2”表,数字(18,0)数据类型被使用。

由于这是可能用于外键关系的属性(请参阅下面的查询),这是否会导致一些性能问题。

SELECT * FROM dbo.Table_1 
INNER JOIN dbo.Table_2 
ON dbo.Table_1.nTransactionld =dbo.Table_2.nTransactionld 

我会感谢您的建议对这个

+0

不太确定的性能..但在存储大小方面,这可能会有所帮助:http://social.msdn.microsoft.com/Forums/sqlserver/en-US/d12a3913-b5ad-44e1-b627-c0f9cad3656c/numeric-vs-int-and-bigint?forum = transactsql –

+0

这是一个实际问题(在这种情况下为什么?)还是只是一个学术问题? – bhs

回答

0

NUMERIC(a.k.a DECIMAL)默认声明是18,0和需要9个字节来存储。 NUMERIC在9个字节处的最大精度为19,0,所以如果你不声明它,你就犯了一个1位数的错误。

Bigint适用于将近19位数...... 9,223,372,036,854,775,807,只需要8个字节。 DECIMAL要求的额外字节是找出小数点的位置。既然你不能在IDENTITY列中使用小数点,我想我会去找BIGINT

因此,戈登建议匹配主键和外键的数据类型是有意义的。

1

绝对如此。

在几乎所有的数据库中,外键都需要与它们引用的主键类型相同。正常的影响是索引不能用于join

也就是说,在某些情况下,某些数据库可能会进行一些转换。