Mam trudności ze znalezieniem „świeckich” wyjaśnień dotyczących sposobu buforowania indeksów w PostgreSQL, dlatego chciałbym sprawdzić rzeczywistość jednego lub wszystkich z tych założeń:
- Indeksy PostgreSQL, takie jak wiersze, znajdują się na dysku, ale mogą być buforowane.
- Indeks może znajdować się całkowicie w pamięci podręcznej lub wcale.
- To, czy jest buforowane, zależy od tego, jak często jest używany (zgodnie z definicją w narzędziu do planowania zapytań).
- Z tego powodu większość „rozsądnych” indeksów będzie cały czas w pamięci podręcznej.
- Indeksy żyją w tej samej pamięci podręcznej (
buffer cache
?) Co wiersze, dlatego przestrzeń pamięci podręcznej używana przez indeks nie jest dostępna dla wierszy.
Moja motywacja do zrozumienia tego wynika z innego pytania, które zadałem, gdzie zasugerowano, że indeksy częściowe mogą być stosowane w tabelach, w których większość danych nigdy nie będzie dostępna.
Przed podjęciem tego chciałbym wyjaśnić, że zastosowanie częściowego indeksu daje dwie zalety:
- Zmniejszamy rozmiar indeksu w pamięci podręcznej, zwalniając więcej miejsca na same wiersze w pamięci podręcznej.
- Zmniejszamy rozmiar B-drzewa, co skutkuje szybszą odpowiedzią na zapytanie.
postgresql
performance
index-tuning
cache
dukedave
źródło
źródło
Odpowiedzi:
Grając trochę z pg_buffercache , mogę uzyskać odpowiedzi na niektóre z twoich pytań.
pg_buffercache
programami odpowiedź jest ostateczna TAK . Warto zauważyć, że dane tabeli tymczasowej nie są tutaj buforowane.EDYTOWAĆ
Znalazłem wspaniały artykuł Jeremiasza Peschki na temat przechowywania tabel i indeksów. Mając stamtąd informacje, mógłbym również odpowiedzieć (2) . Przygotowałem mały test, abyś mógł sam je sprawdzić.
Podsumowując, pokazuje to, że indeksy i tabele mogą być buforowane strona po stronie, dlatego odpowiedź na (2) brzmi NIE .
I ostatni, aby zilustrować tymczasowe tabele niebuforowane tutaj:
źródło
temp_buffers
) - dla całej tabeli, czy tylko części na dysku. Spodziewałbym się tego drugiego. To może być ciekawy test ..Strony indeksu są pobierane, gdy zapytanie zadecyduje, że przydadzą się one ograniczyć ilość danych w tabeli potrzebnych do odpowiedzi na zapytanie. Tylko bloki indeksu, do których nawigowano, zostały wczytane. Tak, przechodzą do tej samej puli buforów współdzielonych, w której przechowywane są dane tabeli. Oba są również wspierane przez pamięć podręczną systemu operacyjnego jako drugą warstwę buforowania.
Możesz łatwo mieć 0,1% indeksu w pamięci lub 100% tego. Pomysł, że większość „rozsądnych” indeksów będzie cały czas znajdowała się w pamięci podręcznej, upada mocno, gdy masz zapytania, które dotyczą tylko podzbioru tabeli. Typowym przykładem jest posiadanie danych zorientowanych czasowo. Często ci nawigują się po ostatnim końcu tabeli, rzadko oglądając starą historię. Tam możesz znaleźć wszystkie bloki indeksu potrzebne do nawigacji do ostatniego końca pamięci i wokół niego, podczas gdy bardzo niewiele potrzebowało nawigacji po wcześniejszych rekordach.
Skomplikowane części implementacji nie polegają na tym, jak bloki dostają się do bufora bufora. To zasady, kiedy wychodzą. Moje przemówienie w pamięci podręcznej bufora PostgreSQL i zawarte w nim przykładowe zapytania mogą pomóc ci zrozumieć, co się tam dzieje i zobaczyć, co naprawdę gromadzi się na serwerze produkcyjnym. To może być zaskakujące. W mojej książce o wysokiej wydajności PostgreSQL 9.0 jest o wiele więcej na wszystkie te tematy .
Częściowe indeksy mogą być pomocne, ponieważ zmniejszają rozmiar indeksu, a zatem są szybsze w nawigacji i pozostawiają więcej pamięci RAM do buforowania innych rzeczy. Jeśli nawigacja w indeksie jest taka, że dotykane części są zawsze w pamięci RAM, to i tak może nie kupić prawdziwej poprawy.
źródło