2012-11-22 63 views
7

我想根據NDPR(磁盤頁讀取次數)計算(最高效)塊嵌套循環連接的成本。假設您有一個查詢表單:計算塊嵌套循環連接的成本

SELECT COUNT(*) 
FROM county JOIN mcd 
ON count.state_code = mcd.state_code 
AND county.fips_code = mcd.fips_code 
WHERE county.state_code = @NO 

其中@NO在每次執行查詢時替換狀態碼。

我知道我可以使用導出NPDR:NPDR(R x S) = |Pages(R)| + Pages(R)/B - 2 . |P ages(S)|

(其中較小的表,以便產生較少頁用作外讀取埃爾戈: R =縣,S = MCD)。

我也知道,頁面大小= 2048個字節

Pointer = 8 byte 
Num. rows in mcd table = 35298 
Num. rows in county table = 3141 
Free memory buffer pages B = 100 
Pages(X) = (rowsize)(numrows)/pagesize 

什麼,我想弄清楚是怎麼「WHERE county.state_code = @NO」影響了我的成本是多少?

謝謝你的時間。

+2

什麼是NDPR(或NPDR)?我猜的是像公式中的髒頁讀取數量。 – Laurence

+0

是的,對不起。我應該指出這一點。 NPDR =頁面磁盤讀取次數。 – JB2

回答

1

首先關於你寫的公式一對夫婦的意見:

  • 我不知道爲什麼你寫的「B - 2」,而不是「B - 1」。從理論的角度來看,您需要一個單獨的緩衝頁面來讀取關係S(您可以通過一次讀取一頁來完成)。

  • 確保您使用所有括號。我會寫公式爲:
    NPDR(R x S) = |Pages(R)| + |Pages(R)|/(B-2) * |Pages(S)|

  • 公式中的所有數字都需要四捨五入(但這是挑剔的)。

  • 爲通用BNLJ公式的解釋:

    • 您閱讀從較小的關係(R)儘可能多的元組,你可以在內存中保留(B-1和B-2頁價值的元組)。

    • 對於每個組的B-2頁值得元組的,你就必須讀取整個小號關係(|頁數(S)|)來執行連接關係爲該特定範圍R.

    • 在連接結束時,關係R被精確讀取一次,關係S被讀取的次數與填充內存緩衝區的次數相同,即|Pages(R)|/(B-2)次。

現在答案:

  • 在您的例子一個選擇標準被應用到關係R(表Country在這種情況下)。這是查詢的WHERE county.state_code = @NO部分。因此,通用公式不適用於直接。

  • 當從關係式R(即,,在你的例子中爲table country),我們可以丟棄所有不符合選擇條件的非限定元組。假設在美國有50個州,並且所有州都有相同數量的縣,則表中的元組中只有2%的元素平均具有資格並需要存儲在內存中。這減少了連接內循環的迭代次數(即,我們需要掃描關係S /表mcs的次數)。 2%的數字顯然只是預期的平均值,並將根據實際給定的狀態而改變。因此

  • 的公式爲你的問題就變成了:
    NPDR(R x S) = |Pages(County)| + |Pages(County)|/(B - 2) * |Counties in state @NO|/|Rows in table County| * |Pages(Mcd)|