Databáze > Firebird a Interbase
Plan - vysvetlenie
Stanislav Hruška:
Povedal som si, že som už dosť veľký nato, aby som sa na to pozrel. Mám pre daný dopyt dva druhy skenovania:
* Unigue Scan - zásadne len na primárnych kľúčoch
* Range Scan (full match) - cudzie kľúče a môj indexNašťastie žiaden natural, či niečo podobné.
Rád by som vedel, v skratke, ako fungujú tieto dva skeny.
DEPOSITS má 16 740 000 záznamov. Najdlhšia tabuľka 4 650 záz. a dve so 4 000. Ostatné sú podstatne kratšie.
Predpokladám, že tu nemám šancu na nejaké zlepšenie/skrátenie času.
Ďakujem. Prikladám celý plán
--- Kód: --- -> Sort (record length: 892, key length: 252) -> Nested Loop Join (inner)
-> Nested Loop Join (inner)
-> Nested Loop Join (inner)
-> Filter
-> Hash Join (inner)
-> Aggregate
-> Sort (record length: 92, key length: 24)
-> Nested Loop Join (inner)
-> Filter
-> Table "FOCS" as "P FO" Access By ID
-> Bitmap
-> Index "FK_FOCS1" Range Scan (full match)
-> Filter
-> Table "DEPOSITS" as "P D" Access By ID
-> Bitmap
-> Index "I_DEPOSITS_FP" Range Scan (full match)
-> Record Buffer (record length: 57)
-> Filter
-> Aggregate
-> Sort (record length: 92, key length: 24)
-> Nested Loop Join (inner)
-> Filter
-> Table "FOCS" as "C FO" Access By ID
-> Bitmap
-> Index "FK_FOCS1" Range Scan (full match)
-> Filter
-> Table "DEPOSITS" as "C D" Access By ID
-> Bitmap
-> Index "I_DEPOSITS_FP" Range Scan (full match)
-> Nested Loop Join (inner)
-> Filter
-> Table "OWNER_FLAT" as "OWF" Access By ID
-> Bitmap
-> Index "PK_OWNER_FLAT" Unique Scan
-> Filter
-> Table "DEPOSITS" as "D" Access By ID
-> Bitmap And
-> Bitmap
-> Index "FK_DEPOSIT_OWF" Range Scan (full match)
-> Bitmap
-> Index "I_DEPOSITS_FP" Range Scan (full match)
-> Filter
-> Table "FOCS" as "FO" Access By ID
-> Bitmap
-> Index "PK_IDFOCS" Unique Scan
-> Filter
-> Table "BLOCKS" as "B" Access By ID
-> Bitmap
-> Index "FK_BLOCKS_FOCS" Range Scan (full match)
-> Filter
-> Table "OWNERS" as "O" Access By ID
-> Bitmap
-> Index "PK_OWNERS" Unique Scan
-> Filter
-> Table "SERVICEPARAMETERS" as "SP" Access By ID
-> Bitmap
-> Index "PK_SERVICEPARAMETERS" Unique Scan
-> Nested Loop Join (inner)
-> Filter
-> Table "FLATS" as "F" Access By ID
-> Bitmap
-> Index "PKFLATS" Unique Scan
-> Filter
-> Table "ENTRIES" as "E" Access By ID
-> Bitmap
-> Index "PKENTRIES" Unique Scan
-> Filter
-> Table "SERVICES" as "S" Access By ID
-> Bitmap
-> Index "PKSERVICES" Unique Scan
--- Konec kódu ---
Stanislav Hruška:
Ďalší experiment:
Pridal som index FKOWNER_FLAT + FKFOCS. Výsledok toho istého dopytu (139 500 záz.) je:
* Nárast DB z 1,72 na 1,83 GB = + 110 MB (6,4 %)
* Index je použitý. Namiesto posledného I_DEPOSITS_FP
* Skrátenie času zo 41,4 s na 37 = ~4.4 s (~10 %)Také skrátenie času odozvy si užívateľ ani neuvedomí. Dosť pochybujem o tom, že to stojí za to.
Váš názor je aký?
Stanislav Hruška:
Len pre zaujímavosť.
V jednom 36,6 s dopyte som vyhodil všetky väzby "navyše" v INNER JOIN. Zrazu som na 12,6 s :)
Ale ten 37,0 s dopyt neskrátim.
Dôvodom je skutočnosť, že tam mám dve CTE so Sum(DEPOSITS.DEPOSIT). Rozlišujú sa len dátumom. Jeden z nich je spätne napojený na DEPOSITS. Túto väzbu nemôžem zrušiť, lebo potrebujem jednotlivé položky DEPOSIT!
František:
ta Sum(DEPOSITS.DEPOSIT) sa meni v nejakej zavislosti? alebo je to hodnota, ktora by sa dala ulozit a aktualizovat? to by myslim vyrazne skratilo selekt
František:
alebo mam pre teba dalsi asi "spanielsku dedinu", ktoru som objavil iba pred par rokmi WINDOW DB funcie
https://biportal.cz/sql-funkce-na-poradi/
Navigace
[0] Seznam témat
[#] Další strana
Přejít na plnou verzi