2010-06-14 90 views
1

這是在Microsoft SQL Server上。我們有一個查詢,我們試圖在包含數字數據的字段上連接兩個表。SQL Server加入問題

一個表的字段定義爲數字(18,2),另一個表的字段定義爲十進制(24,4)。在加入本機數據類型時,查詢會掛起,並在完成之前耗盡耐心(讓它運行6分鐘...)。所以我們試着將兩個字段都轉換爲數字(18,2),並在10秒內完成查詢。所以我們試着將兩個字段都轉換爲十進制(18,2),並且再次查詢掛起。有誰知道小數和數字數據類型之間的區別,它們會使它們的表現如此不同?

+0

你看過查詢計劃嗎? – 2010-06-14 14:19:01

+0

根據MS他們是相同的。您是否比較了查詢計劃? – Kenneth 2010-06-14 14:20:30

+0

這是哪個版本的SQL Server? – 2010-06-14 15:03:50

回答

1

DECIMAL和NUMERIC數據類型是SQL Server中的同一件事情。從BOL

引用:

具有固定 精度和標度

數字數據類型。

十進制[(p [,s])]和數字[(p [ ,s])]固定精度和刻度 數字。當使用最大精度爲 時,有效值爲 - 10^38 +1 到10^38 - 1。小數點的ISO同義詞 爲dec和dec(p,s)。 數字在功能上相當於 十進制。

因此,我很驚訝地聽到有所不同。我希望兩條路線的執行計劃相同,你可以檢查一下嗎?

0

我的猜測是,這不是兩個數據類型之間的特定差異的問題,而只是SQL Server需要隱式轉換它們以匹配連接操作的事實。

我不知道爲什麼會有你的第一個查詢和第二個,你顯式轉換的區別,但我可以看到爲什麼當你轉換爲不匹配的數據類型時可能會出現問題,那麼SQL Server必須隱式地轉換它們(如第三種情況)。也許在第一種情況下,SQL Server隱式地將兩者轉換爲十進制(24,4),以免丟失數據,並且該操作需要比轉換另一種方式更長的時間。你有沒有嘗試明確地將數字(18,2)轉換爲小數(24,4)?

1

爲什麼你使用兩個數據類型開始?如果它們包含相同類型的數據(並且加入它們意味着它們會這樣做),它們應該是相同的數據類型。解決這個問題,所有的問題都會消失。爲什麼浪費服務器資源不斷鑄造以匹配兩個應該定義相同的字段?

您當然可能需要調整任何插入或更新查詢的輸入變量以匹配您選擇的數據類型。