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」がコストにどのように影響するかということです。

御時間ありがとうございます。

4

1 に答える 1

1

最初に、あなたが書いた式に関するいくつかの観察:

  • 「B - 1」ではなく「B - 2」と書いている理由がわかりません。理論的な観点からは、リレーション S を読み取るには 1 つのバッファー ページが必要です (一度に 1 ページずつ読み取ることで実行できます)。

  • 必ずすべてのブラケットを使用してください。式を次のように書きます。
    NPDR(R x S) = |Pages(R)| + |Pages(R)| / (B-2) * |Pages(S)|

  • 数式内のすべての数値を切り上げる必要があります (ただし、これはつまらないものです)。

  • 一般的な BNLJ 式の説明:

    • 小さいリレーション (R) からできるだけ多くのタプルを読み込みます (B-1 または B-2 ページ分のタプル)。

    • B-2 ページ分のタプルのグループごとに、S リレーション全体 (|Pages(S)|) を読み取って、リレーション R の特定の範囲の結合を実行する必要があります。

    • 結合の最後に、リレーション R は 1 回だけ読み取られ、リレーション S はメモリ バッファーをいっぱいにした回数、つまり|Pages(R)| / (B-2)回数読み取られます。

今答え:

  • あなたの例では、選択基準がリレーション R (この場合はテーブル Country) に適用されます。これはWHERE county.state_code = @NOクエリの一部です。したがって、一般式は直接適用されません。

  • リレーション R (つまり、この例ではテーブル Country) から読み取る場合、選択基準に一致しないすべての非適格タプルを破棄できます。米国に 50 の州があり、すべての州の郡の数が同じであると仮定すると、テーブル Country 内のタプルの 2% のみが平均して適格であり、メモリに格納する必要があります。これにより、結合の内部ループの反復回数 (つまり、リレーション S / テーブル mcs をスキャンする必要がある回数) が削減されます。2% という数値は明らかに予想される平均値であり、実際の状態によって変化します。

  • したがって、問題の式は次のようになります。
    NPDR(R x S) = |Pages(County)| + |Pages(County)| / (B - 2) * |Counties in state @NO| / |Rows in table County| * |Pages(Mcd)|

于 2015-10-20T12:38:12.853 に答える