2012-01-10 40 views
3

我在Microsoft Access中運行以下2個查詢,結果相同,但第二個查詢在大約5秒內運行,而第一個查詢大約需要10分鐘。我完全迷失在這裏。第一個查詢連接另一個整數字段上的整數字段,第二個查詢將cint(text)字段連接到整數字段上,運行速度更快。爲什麼int字段上的Cint(char字段)連接比int int更快?

奔跑在10分鐘內:

我設置tblA.number =整數字段

SELECT A, B, sum(d) as C 
FROM tblA 
INNER JOIN (tblB INNER JOIN tblC ON tblB.A = tblC.A) 
    ON tblA.number = tbl B.B) 
GROUP BY A, B 
HAVING F like '*808*' 

奔跑在5秒內: - 注意到cint(tblA.A)

I set tblA.number = text field 
SELECT A, B, sum(d) as C 
FROM tblA 
INNER JOIN (tblB INNER JOIN tblC ON tblB.A = tblC.A) 
    ON cint(tblA.number) = tbl B.B) 
GROUP BY A, B 
HAVING F like '*808*' 
+0

如果您重複測試,您是否得到類似的結果(即沒有1次優化成本)? 'tblB'的定義是什麼? – 2012-01-10 22:23:55

+0

你確定在你的第一個查詢中你的tblA.number是一個數字嗎? – wickedone 2012-01-10 22:27:05

+0

'具有像'* 808 *'':是在這一節中的列A是你從一個數字到文本之間來回切換的同一個字段? – mwolfe02 2012-01-10 22:32:44

回答

0

這是不正常的情況。 ..除非只有文本字段的索引。

+0

沒有任何索引;不過,我將整數字段編入索引並且其運行速度與文本字段的速度相同。然而,沒有索引,我不知道爲什麼這個cint更快 – kdonah3 2012-01-10 22:31:48

0

浮現在腦海中的一些可能性:

  • 也許在第二個查詢的文本字段或表達式導致查詢優化器選擇一個不同的,更合適的聯接策略。
  • 也許查詢優化器在某種程度上能夠檢測到所有數字在第二種情況下都非常小,從而導致它使用比int更小的數據類型,從而導致更快的讀取。
  • 可能具有文本字段會導致數據在頁面中以不同方式對齊,從而導致更好的讀取和緩存性能。
  • 也許有一些背景活性的一個試驗

不幸的是在影響您的測試機器在一個非常消極的方式,也有很多的查詢規劃和優化的因素。有時候,我們無法理解事情發生的原因。

1

你是說tblA.number是一個char數據類型?

我認爲使用cint()會更快,因爲您將字符串轉換爲數字,然後與tblB.B列進行數字比較。

我無法想象任何人都會驚訝地發現,比較字符串(每個字符出現的字符)會比較兩個數字來運行任何事情。

在第一個示例中,由於數據類型不匹配,因此第一個tblA.number是一個字符串,因此它可能會將tblB.B列轉換爲該比較的字符串。

因此,將數字轉換爲字符串的速度可能較慢(需要爲字符串空間分配更多內存,然後在拋出字符串時出現垃圾收集問題)。因此,不僅要創建花費時間的字符串,而且要進行字符串比較會變得更慢。使用cint()將字符串轉換(轉換)爲數字(可能比字符串更快),然後進行數字比較(當然比字符串比較快)。

所以我不能肯定地說上述是原因,但它肯定不會是一個驚喜。如前所述,使用ShowPlan可以在這裏獲得更多信息。

+0

訪問中沒有showplan,但我懷疑你的答案是正確的。如果您比較兩種類型的字段,使得轉換顯式可能會改變操作的順序,以便使用其他方式無法使用的索引。 – Ben 2012-01-23 17:25:16

相關問題