2012-11-22 8 views
7

Próbuję obliczyć koszt (najbardziej efektywnego) zagnieżdżonego sprzężenia w pętli bloku pod względem NDPR (liczba odczytów na stronie dysku). Załóżmy, że masz zapytanie do formularza:Obliczanie kosztu blokowania zagnieżdżonych połączeń pętlowych

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 

gdzie @NO jest podstawiony za kod stanu przy każdym wykonaniu zapytania.

wiem, że można wyprowadzić NPDR z: NPDR(R x S) = |Pages(R)| + Pages(R)/B - 2 . |P ages(S)|

(gdzie mniejsza tabeli stosowane jako zewnętrzna, w celu wytworzenia mniej Odczyty Ergo. R = County, S = MCD).

wiem również, że wielkość page = 2048 bajtów

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 

co próbuję dowiedzieć się, w jaki sposób jest „WHERE county.state_code = @NO” wpływa na mój koszt?

Dzięki za poświęcony czas.

+2

Co jest NDPR (lub NPDR)? Zgaduję, że coś w rodzaju liczby brudnych stron czyta z formuły. – Laurence

+0

Tak, przepraszam. Powinienem to sprecyzować. NPDR = Liczba odczytów dysku na stronie. – JB2

Odpowiedz

1

pierwsze kilka uwag na temat wzoru napisałeś:

  • Nie jestem pewien, dlaczego to piszesz „B - 2” zamiast „B - 1”. Z teoretycznego punktu widzenia, potrzebujesz jednej strony bufora do czytania w relacji S (możesz to zrobić czytając jedną stronę na raz).

  • Upewnij się, że używasz wszystkich nawiasów. Chciałbym napisać formułę jako:
    NPDR(R x S) = |Pages(R)| + |Pages(R)|/(B-2) * |Pages(S)|

  • Te wszystkie liczby w formule musiałyby być zaokrąglane w górę (ale to nitpicking).

  • Wyjaśnienie dla generycznego wzoru BNLJ:

    • czytasz w tyle krotki z mniejszą zależnością (R), jak można zachować w pamięci (B-1 lub B-2 stron warto z krotek).

    • Dla każdej grupy B-2 stronach wartości krotek, to wtedy trzeba przeczytać całą relację S (| Strony (S) |) do wykonywania przyłączenia dla danego zakresu relacji R.

    • Po zakończeniu łączenia relacja R jest odczytywana dokładnie jeden raz, a relacja S jest odczytywana tyle razy, ile razy wypełniamy bufor pamięci, mianowicie: |Pages(R)|/(B-2).

Teraz odpowiedź:

  • W przykładzie a kryteria wyboru stosuje się do relacji R (stół kraj w tym przypadku). To jest część zapytania. Dlatego formuła ogólna nie ma zastosowania bezpośrednio.

  • Podczas odczytu z zależności R (tj., tabela Kraj w twoim przykładzie), możemy odrzucić wszystkie niekwalifikujące się krotki, które nie pasują do kryteriów wyboru. Zakładając, że w USA jest 50 stanów, a wszystkie stany mają taką samą liczbę okręgów, tylko 2% krotek w tabeli Kraj kwalifikuje się średnio i musi być przechowywany w pamięci. Zmniejsza to liczbę iteracji wewnętrznej pętli łączenia (tj. Liczbę razy, kiedy musimy skanować relację S/table mcs). Liczba 2% jest oczywiście tylko spodziewaną średnią i zmieni się w zależności od aktualnego stanu.

  • Formuła problemu staje się zatem:
    NPDR(R x S) = |Pages(County)| + |Pages(County)|/(B - 2) * |Counties in state @NO|/|Rows in table County| * |Pages(Mcd)|