2014-01-21 40 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

也就是說,在某些情況下,某些數據庫可能會進行一些轉換。