Thread View: pl.comp.bazy-danych
151 messages
151 total messages
Page 3 of 3
Started by Marek
Fri, 30 Jan 2015 13:19
Page 3 of 3 • 151 total messages
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: nkab
Date: Tue, 03 Feb 2015 09:44
Date: Tue, 03 Feb 2015 09:44
75 lines
3228 bytes
3228 bytes
W dniu piątek, 30 stycznia 2015 14:19:18 UTC+1 użytkownik Marek napisał: > Witam, > > Na etapie projektu powstała tabela > > CREATE TABLE tabela > ( > tabela_id SERIAL PRIMARY KEY, > > pola... > ); > > Jednakże okazało się iż tabela ta ma mieć dodatkowe pola zarówno > informacyjna jak i czasem biorące udział w wyszukiwaniu. Pól będzie > przybywać i mają być definiowane na bieżąco. Typ nieprzewidywalny - > niektóre tekstowe, niektóre liczbowe. Pomyślałem zatem, że mógłbym > wykorzystać pole typu tablicowego > > CREATE TABLE tabela > ( > tabela_id SERIAL PRIMARY KEY, > > pola... > uniwersalne text[]; > ); > > Zapis qusi-pól wyglądałby tak, że w polu "uniwersalne" trzymałbym > wartości. Kłopot w tym, że PostgreSQL nie ma tablic asocjacyjnych więc > musiałbym się posiłkować tabelą słownikową konwertującą nazwę na indeks: > > CREATE TABLE name_to_index > ( > name_to_index_id SERIAL PRIMARY KEY, > > nazwa_pola varchar(100), --nie indeksowane bo tabela będzie miała do > ok 20 rekordów > indeks_odpowiadajacy_w_polu_uniwersalne int > ); > > Oczywiście w w plpgsql napisałbym funkcję symulującą dostęp do tablicy > asocjacyjnej. Czy taka ideologia jest poprawna? Da się to lepiej > zorganizować? > > Czy da się indeksować w tablicy np. indeks 4 i 10ty np.? > > -- > Pozdrawiam, > Marek Wolałbym bardziej praktyczny opis problemu np: masz tablę t1 id p1 p2 ------------- 1 a111 a222 2 b111 b222 3 c111 c222 i teraz chcesz aby do tej t1 user sobie utowrzył dowolną kombinację indeksów do pól np: szukaj p2+p1 szukaj p1+p2 o to chodzi? Czy może user tworzy sobie własne pole p3, dodaje tam dane i teraz musi być możliwość dowolnego zaindeksowania pól t1 włącznie z dodanym polem p3 i oczywiście możliwość szukania danych wykorzystując utworzone przez usera dowolne kombinacje indeksacji pól w t1? Andrzej.
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: Marek
Date: Tue, 03 Feb 2015 22:50
Date: Tue, 03 Feb 2015 22:50
19 lines
1758 bytes
1758 bytes
W dniu 2015-02-03 o 10:44, nkab@toya.net.pl pisze: > Czy może user tworzy sobie własne pole p3, dodaje tam dane > i teraz musi być możliwość dowolnego zaindeksowania pól t1 włącznie > z dodanym polem p3 i oczywiście możliwość szukania danych wykorzystując utworzone przez usera dowolne kombinacje indeksacji pól w t1? Dokładnie o to mi chodziło :-) Najprościej byłoby dodać pole p3 w trakcie działania aplikacji ale to nie jest "bazodanowe" podejście. Zakłada się zazwyczaj, że tabela ma mieć N pól, a jeśli trzeba N+1 to programista musi to oprogramować. Jest to spore ograniczenie, które chciałbym w możliwie elegancki sposób obejść. Chciałbym tak napisać aplikację aby użytkownik sam sobie dodawał co mu potrzebne. -- Pozdrawiam, Marek
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: nkab
Date: Wed, 04 Feb 2015 09:46
Date: Wed, 04 Feb 2015 09:46
38 lines
2568 bytes
2568 bytes
W dniu wtorek, 3 lutego 2015 23:50:54 UTC+1 użytkownik Marek napisał:
> W dniu 2015-02-03 o 10:44, nkab@toya.net.pl pisze:
>
>
> > Czy może user tworzy sobie własne pole p3, dodaje tam dane
> > i teraz musi być możliwość dowolnego zaindeksowania pól t1 włącznie
> > z dodanym polem p3 i oczywiście możliwość szukania danych wykorzystując utworzone przez usera dowolne kombinacje indeksacji pól w t1?
>
> Dokładnie o to mi chodziło :-)
>
> Najprościej byłoby dodać pole p3 w trakcie działania aplikacji ale to
> nie jest "bazodanowe" podejście. Zakłada się zazwyczaj, że tabela ma
> mieć N pól, a jeśli trzeba N+1 to programista musi to oprogramować. Jest
> to spore ograniczenie, które chciałbym w możliwie elegancki sposób
> obejść. Chciałbym tak napisać aplikację aby użytkownik sam sobie dodawał
> co mu potrzebne.
>
> --
> Pozdrawiam,
> Marek
Takie podejście jest amatorskie aczkolwiek możliwe
do zrealizowania, ale pomyśl - dla każdego usera jego
prywatny indeks na serwerze, do tego jeszcze niezliczona
ilość wziętych z księżyca pól.
W php klucz indeksowy możesz włożyć do zmiennej:
$MyKey="(p2,p3,p1)";
mysql_query("CREATE INDEX nowy_index ON tabela $MyKey");
Andrzej.
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: artiun
Date: Wed, 04 Feb 2015 18:06
Date: Wed, 04 Feb 2015 18:06
49 lines
3411 bytes
3411 bytes
W dniu 2015-02-04 o 10:46, nkab@toya.net.pl pisze:
> W dniu wtorek, 3 lutego 2015 23:50:54 UTC+1 użytkownik Marek napisał:
>> W dniu 2015-02-03 o 10:44, nkab@toya.net.pl pisze:
>>
>>
>>> Czy może user tworzy sobie własne pole p3, dodaje tam dane
>>> i teraz musi być możliwość dowolnego zaindeksowania pól t1 włącznie
>>> z dodanym polem p3 i oczywiście możliwość szukania danych wykorzystując utworzone przez usera dowolne kombinacje indeksacji pól w t1?
>>
>> Dokładnie o to mi chodziło :-)
>>
>> Najprościej byłoby dodać pole p3 w trakcie działania aplikacji ale to
>> nie jest "bazodanowe" podejście. Zakłada się zazwyczaj, że tabela ma
>> mieć N pól, a jeśli trzeba N+1 to programista musi to oprogramować. Jest
>> to spore ograniczenie, które chciałbym w możliwie elegancki sposób
>> obejść. Chciałbym tak napisać aplikację aby użytkownik sam sobie dodawał
>> co mu potrzebne.
>>
>> --
>> Pozdrawiam,
>> Marek
>
> Takie podejście jest amatorskie aczkolwiek możliwe
> do zrealizowania, ale pomyśl - dla każdego usera jego
> prywatny indeks na serwerze, do tego jeszcze niezliczona
> ilość wziętych z księżyca pól.
>
>
>
>
> W php klucz indeksowy możesz włożyć do zmiennej:
>
> $MyKey="(p2,p3,p1)";
> mysql_query("CREATE INDEX nowy_index ON tabela $MyKey");
>
>
>
>
> Andrzej.
>
Nie macie pojęcia, albo mylicie coś. Indeks jest zakładany na bazie
administracyjnie, to o czym mówicie to filtry. Ktoś zaproponował podejście
tekstowe, tu też można zrobić indeksy (swego czasu rozwinęło się to w DBF -
stare jak i historia baz). Ma to sens (np. xml - ale nie na GB danych)
--
Artur
0 weeks 1 day 13 hours 57 minutes 42 seconds and 16 milliseconds.
"pl.comp.bazy-danych"
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: nkab
Date: Thu, 05 Feb 2015 09:38
Date: Thu, 05 Feb 2015 09:38
24 lines
2278 bytes
2278 bytes
W dniu środa, 4 lutego 2015 19:11:13 UTC+1 użytkownik artiun napisał: > Nie macie pojęcia, albo mylicie coś. Indeks jest zakładany na bazie > administracyjnie, to o czym mówicie to filtry. Ktoś zaproponował podejście > tekstowe, tu też można zrobić indeksy (swego czasu rozwinęło się to w DBF - > stare jak i historia baz). Chłopak się uczy i chce jak najwięcej poznać więc podsuwam mu rozwiązanie. Prędzej czy później i tak dojdzie do wniosku, że to pomyłka. Sam z przyzwyczajenia stosuję indeksy mimo, że wystarczyłoby zwykłe filtrowanie. > Ma to sens (np. xml - ale nie na GB danych) > Według mnie właśnie na GB danych ma sens stosowanie indeksów oczywiście ich odświeżanie przy insertach/apdejtach jest czasochłonne ale przy szukaniu są naprawdę błyskawiczne. A dżojna robiłeś bez indeksów? Andrzej.
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: Marek
Date: Thu, 05 Feb 2015 14:42
Date: Thu, 05 Feb 2015 14:42
26 lines
2007 bytes
2007 bytes
W dniu 2015-02-04 o 10:46, nkab@toya.net.pl pisze: > Takie podejście jest amatorskie aczkolwiek możliwe > do zrealizowania, No więc właśnie. Jednakże przy braku "profesjonalnej" opcji trzeba sobie jakoś radzić. Takie podejście gwarantuje optymalną wydajność i łatwość dostępu do tych danych bo 1. Zakładasz pola o takich typach jakich potrzebujesz. 2. Możesz budować indeksy do nich w razie potrzeb, JOINować etc 3. Wszystkie pola są w jednej tabeli więc dostępne w SELECT * bez skomplikowanych zapytań. > ale pomyśl - dla każdego usera jego > prywatny indeks na serwerze, do tego jeszcze niezliczona > ilość wziętych z księżyca pól. Nie, ilość userów nie ma tu znaczenia. Sprawa się upraszcza. Jeśli jeden z nich doda pole ceny artykułu w sklepie internetowym, to pozostali będą mieli je dostępne i będą mogli wypełniać wartościami dla poszczególnych produktów. -- Pozdrawiam, Marek
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: nkab
Date: Fri, 06 Feb 2015 08:44
Date: Fri, 06 Feb 2015 08:44
31 lines
2843 bytes
2843 bytes
W dniu czwartek, 5 lutego 2015 15:42:09 UTC+1 użytkownik Marek napisał: > W dniu 2015-02-04 o 10:46, nkab@toya.net.pl pisze: > > ale pomyśl - dla każdego usera jego > > prywatny indeks na serwerze, do tego jeszcze niezliczona > > ilość wziętych z księżyca pól. > > Nie, ilość userów nie ma tu znaczenia. Sprawa się upraszcza. Jeśli jeden > z nich doda pole ceny artykułu w sklepie internetowym, to pozostali będą > mieli je dostępne i będą mogli wypełniać wartościami dla poszczególnych > produktów. > No tak ale po dodaniu pola cena, którego jeszcze nie było trzeba utworzyć indeks, czyli do każdego pola plik indeksowy? Ja lubię konkrety. Tu na grupie już była dyskusja na ten temat i moja sugestia była taka aby utworzyć tradycyjnie tabele hierarchiczne grupujące treść od ogółu do szczegółu (komputery:piecyki/laptopy/tablety...) a w każdej wielkie pole na cechy/właściwości, w którym zastosować zapis typu JSON jak w CSS: cecha=wartość, czyli: "cena=123; color=czerwony kształt=wykrzywiony itd" (tu skrypt musi to w każdym polu ustawiać cechy w tej samej kolejności, każda nowa cecha dopisywana na końcu [co z literówkami]). Radzę sprawdzać w testach czy będą używane indeksy. Z dużym prawdopodobieństwem nie będą. Andrzej.
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: nkab
Date: Fri, 06 Feb 2015 08:49
Date: Fri, 06 Feb 2015 08:49
6 lines
1564 bytes
1564 bytes
Zapomniałem o jeszcze czymś ważnym. Czy zdajesz sobie sprawę jakie chamstwo grasuje w internecie? Andrzej.
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: Marek
Date: Fri, 06 Feb 2015 10:41
Date: Fri, 06 Feb 2015 10:41
14 lines
1575 bytes
1575 bytes
W dniu 2015-02-06 o 09:49, nkab@toya.net.pl pisze: > Zapomniałem o jeszcze czymś ważnym. > > Czy zdajesz sobie sprawę jakie chamstwo > grasuje w internecie? Masz na myśli, że ktoś złośliwie będzie dodawał pola? To akurat nie ma znaczenia również gdyż mowa jest o części redakcyjnej CMS. Sporadycznie będą powstawać nowe właściwości. -- Pozdrawiam, Marek
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: Marek
Date: Fri, 06 Feb 2015 10:50
Date: Fri, 06 Feb 2015 10:50
31 lines
2568 bytes
2568 bytes
W dniu 2015-02-06 o 09:44, nkab@toya.net.pl pisze: > > No tak ale po dodaniu pola cena, którego jeszcze nie było > trzeba utworzyć indeks, czyli do każdego pola plik indeksowy? Nie, tylko do tych pól, przy których tworzeniu kliknie się opcję "utwórz indeks" albo drugi scenariusz: jeśli dane pole ma być kluczem obcym do innej tabeli, to aplikacja sama wymusi utworzenie indeksu. To żaden problem. > Tu na grupie już była dyskusja na ten temat i moja sugestia > była taka aby utworzyć tradycyjnie tabele hierarchiczne grupujące > treść od ogółu do szczegółu (komputery:piecyki/laptopy/tablety...) > a w każdej wielkie pole na cechy/właściwości, w którym zastosować > zapis typu JSON jak w CSS: cecha=wartość, > czyli: "cena=123; color=czerwony kształt=wykrzywiony itd" > (tu skrypt musi to w każdym polu ustawiać cechy w tej samej kolejności, > każda nowa cecha dopisywana na końcu [co z literówkami]). > > Radzę sprawdzać w testach czy będą używane indeksy. > Z dużym prawdopodobieństwem nie będą. Z praktyki wiem, że będą. Np. zdarzyło się iż klient zażyczył sobie w trakcie działania aplikacji dorobienia powiązania karty katalogowej produktu z instrukcją obsługi (która nie zawsze istniała). I kilka podobnych przypadków. Wcale to nie takie rzadkie sytuacje. Tak więc notacja a'la JSON raczej nie wchodzi w grę. -- Pozdrawiam, Marek
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: R.e.m.e.K
Date: Wed, 11 Feb 2015 09:35
Date: Wed, 11 Feb 2015 09:35
24 lines
2587 bytes
2587 bytes
Dnia Wed, 11 Feb 2015 00:35:03 -0800 (PST), nkab@toya.net.pl napisał(a): > mało ludzi wie do czego są te indeksy i określenie indeks to za mało, > no i dlaczego to to nazywają indeks. Co to za brednie? Dlaczego robisz projekcje swojej niewiedzy na wiekszosc? Jestem gotow sie zalozyc, ze 90% uzytkownikow tej grupy wie co to indeks i czemu on sluzy. A jewsli Ty nie wiesz lub wiesz o tym malo to moze warto doczytac? http://en.wikipedia.org/wiki/Database_index > PS. > Fajny masz nick ale ta twoja retoryka sugeruje, > że działasz na czyjeś zlecenie. Tak, ruscy go kupili i ma za zadanie zniszczyc hamerykanskie sily zbrojne zakladajaxc bledne indeksy na tabeli ze wspolrzednymi ataku rakietowego typu ziemia-ziemia. Przez taki zabieg po pierwszej salwie od ruskich hamerykanski system odpali zapytanie, ktore wykona sie zbyt wolno i bedzie po ptokach. -- pozdro R.e.m.e.K
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: Wojciech Cieplak
Date: Thu, 12 Feb 2015 12:58
Date: Thu, 12 Feb 2015 12:58
4 lines
1960 bytes
1960 bytes
PS. Chętnie pomagam, ale żeby pomóc trzeba aby druga strona też znała podstawy i język w którym opiszę mu rozwiązanie jego problemu.
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Thu, 12 Feb 2015 19:04
Date: Thu, 12 Feb 2015 19:04
95 lines
6030 bytes
6030 bytes
W dniu 2015-02-12 o 10:34, nkab@toya.net.pl pisze: > Nie, id to sztuczny numer rekordu a indeks w pliku indeksowym > to fizyczny adres na dysku. Dyskowy system operacyjny (DOS) wie, > którą głowicę czytającą dysk uruchomić, na którym krążku magnetycznym, > na który sektor się ma ustawić głowica... Na dysku? Już nawet w DOS-ie w pewnym momencie przestało to być prawdą, bo dyski fizycznie były inaczej skonstruowane, a BIOS dostawał ich wirtualną adresację (bo nie był w stanie zaadresować takiej ilości sektorów). Więc choćby z tego powodu to nieprawda. A jeśli już mówić o adresie, to nawet w DBF był to numer rekordu (lub przesunięcie w ramach danej tabeli - pliku DBF), a nie adres na dysku. > Indeksy są dla zawodowców amatorom wystarczy order by. Doznałem olśnienia - już wiem czemu jest tylu amatorów na świecie :>. > Programista baz danych nie używa id, dla zawodowca id nie istnieje. > Id jest dla administratora bazy danych, daje informacje, że były > usuwane rekordy. Czy zawodowiec to taki gość, który doznaje zawodu, bo (jak rozpatruję sprawę niżej) ktoś mu usunął rekord/wiersz/krotkę, a on biedny nie wie co teraz z tym zrobić? > id nick > -------------- > 1 R.E.M.E.K > 2 nkab > 3 MM > 4 MAREK > > i teraz ktoś bez twojej wiedzy usunął nkab, co zrobisz > gdy w drugiej tabeli masz posty do tych ników połączonych > poprzez id, no co zrobisz? Widzisz, takie rzeczy to były możliwe tylko w DBF i podobnych systemach (gdzie pojęcie "system" jest nadużyciem w ich wypadku) obsługi baz danych. Obecnie RDBMS (Relationa DataBase Managament System - czyli po naszemu system zarządzania relacyjną bazą danych), jeśli tylko zdefiniuje mu się więzy integralności danych nie dopuści do takiej sytuacji. Owe więzy integralności (chyba od naszej ostatniej dyskusji nie doczytałeś nic na ten temat) polegają w uproszczeniu na tym, że RDBMS posiada informację, że rekordy z Twojej przykładowej tabeli są powiązane z inną tabelą i można je usunąć jedynie wspólnie (jeden z przypadków) albo tzw. nadrzędny rekord można usunąć jedynie, kiedy wszystkie powiązane z nim rekordy w dodatkowej tabeli zostaną usunięte wcześniej (oczywiście nie dotyczy to tylko usuwania i nie jest to jedyny sposób zapewnienia integralności, ale nie chcę komplikować). > Napisz koledze M.M. o indeksach tak aby on to > zrozumiał, żeby się połapał, że jak da: > > SELECT nick from t1 (bez indeksów) to da mu: > > R.E.M.E.K > nkab > MM > MAREK > > a po dodaniu indeksu dla pola nick > > SELECT nick from t1 (z indeksami) da mu: > > MAREK > nkab > MM > R.E.M.E.K > > i nie ma tu ORDER BY a jednak są w kolejności > alfabetycznej To ja ostrożnie zapytam - w jakim RDBMS? Nie znam PostgreSQL, ale w dość dobrze znanym mi MSSQL (lub SQL Server - jak kto woli) dodanie poleceniem *insert* zgodnie z powyższą, przypadkową kolejnością może ale nie musi dla *select* zwrócić w kolejności dodawania. Bo ta kolejność jest z definicji przypadkowa, co obejmuje też przypadek, że będzie akurat kolejnością dodawania. Co więcej - w MSSQL nie trzeba podawać w zapytaniu indeksów, bo jeśli takowe są założone dla tabeli, to optymalizator silnika serwera SQL je wykorzysta (o ile będzie to opłacalne). Co więcej - potrafi też sobie poradzić z wykorzystaniem indeksu złożonego (czyli p1 + p2) dla zaprezentowania w kolejności zgodnej z jednym z pól wchodzących w jego skład. Pomijam już fakt, że w jego przypadku indeksy tylko w jednym przypadku wskazują na położenie wiersza, a w pozostałych, gdy jest indeks klastrowy na tabeli, wskazują na wartość tego indeksu. Indeksy to już od dłuższego czasu nie pliki (bo baza danych jest plikiem). To po prostu zbiory danych (danymi są indeksy), zazwyczaj (zależy do RDBMS) niezajmujące spójnego obszaru. -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: Cezary Grądys
Date: Sat, 14 Feb 2015 07:01
Date: Sat, 14 Feb 2015 07:01
82 lines
3509 bytes
3509 bytes
W dniu 12.02.2015 o 16:21, IDKrzych pisze: > W SQL by mieć posortowane dane TRZEBA dodać klauzulę ORDER BY. > I koniec - nie ma wyjątków. > Indeksy też nic do tego nie mają. I nie do tego służą. > Indeksy nie służą do sortowania tylko do wyszukiwania i wyszczególniania > podzbiorów na podstawie zadanych warunków (a precyzyjniej do > usprawnienia tych czynności - bez indeksów działa to dużo wolniej). > Oczywista sprawa, w modelu relacyjnym kolejność wierszy, a nawet pól nie jest ważna!!! To, że baza zwraca w kolejności wprowadzenia, czy czasem posortuje (bo DISTINCT czy GROUP BY tego wymaga, żeby go zrobić) to jest efekt uboczny! Zwykły UPDATE zaburzy kolejność danych zwracanych przez select * FROM tabela. Prosty test (PostgreSQL): test=> select * from test; id | opis ----+------ 1 | 2 2 | 2 3 | 2 4 | 2 5 | 2 6 | 2 7 | 2 8 | 2 9 | 2 10 | 2 11 | 2 12 | 2 13 | 2 14 | 2 15 | 2 16 | 2 17 | 2 18 | 2 19 | 2 20 | 2 (20 rows) test=> update test set opis=3 where id=6; UPDATE 1 test=> select * from test; id | opis ----+------ 1 | 2 2 | 2 3 | 2 4 | 2 5 | 2 7 | 2 8 | 2 9 | 2 10 | 2 11 | 2 12 | 2 13 | 2 14 | 2 15 | 2 16 | 2 17 | 2 18 | 2 19 | 2 20 | 2 6 | 3 (20 rows) -- Cezary Grądys czarekgr@wa.onet.pl
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: nkab
Date: Mon, 16 Feb 2015 08:23
Date: Mon, 16 Feb 2015 08:23
7 lines
2439 bytes
2439 bytes
W dniu sobota, 14 lutego 2015 08:01:54 UTC+1 użytkownik Cezary Grądys napisał: Nadal nie wiesz o co chodzi z indeksami. Te twoje listingi pokazują, że zapytanie nie używa indeksu! Uaktywnij indeks i dopiero zobaczysz efekt . Andrzej.
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: nkab
Date: Mon, 16 Feb 2015 09:04
Date: Mon, 16 Feb 2015 09:04
17 lines
2861 bytes
2861 bytes
W dniu poniedziałek, 16 lutego 2015 09:23:39 UTC+1 użytkownik nk...@toya.net.pl napisał: > W dniu sobota, 14 lutego 2015 08:01:54 UTC+1 użytkownik Cezary Grądys napisał: > > Nadal nie wiesz o co chodzi z indeksami. > Te twoje listingi pokazują, że zapytanie nie używa indeksu! > Uaktywnij indeks i dopiero zobaczysz efekt . > Sorry, się pośpieszyłem. Po prostu w MySQL ten numer z gwiazdką nie przechodzi. Jeśli w postgre tak to działa ja na twoim rysunku no to rzeczywiście to działa tak jak powinno! Czyli postgre jest lepszym systemem. Jeszcze raz sorry. Andrzej.
Re: [OT] PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: wloochacz
Date: Tue, 17 Feb 2015 07:44
Date: Tue, 17 Feb 2015 07:44
17 lines
2507 bytes
2507 bytes
W dniu 2015-02-16 o 21:23, PaSkol pisze: /ciach/ Że też chce Ci się uprawiać tą spaloną bzdurami i życzeniowym podejściem ziemię... Przecież gość udowdnił po raz kolejny swoją totalną ignorancję i olewa wszystko co się do niego pisze. On wie lepiej. Tylko tu kaganek (oświaty) nie wystarczy, tu trzeba napalm spuścić aby wypalić do cna ten chory sen pijanego idioty. A teraz zgodnie z podejściem nkaba; ja tam nie wiem, ale jestem przekonany, że inaczej się nie da, bo tak jak mi sie wydaje jest najlepiej na świecie! -- wloochacz
Re: [OT] PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Tue, 17 Feb 2015 17:18
Date: Tue, 17 Feb 2015 17:18
30 lines
3311 bytes
3311 bytes
W dniu 2015-02-17 o 08:44, wloochacz pisze: > W dniu 2015-02-16 o 21:23, PaSkol pisze: > /ciach/ > Że też chce Ci się uprawiać tą spaloną bzdurami i życzeniowym podejściem > ziemię... > > Przecież gość udowdnił po raz kolejny swoją totalną ignorancję i olewa > wszystko co się do niego pisze. On wie lepiej. Ja tam go nawracać nie chcę, natomiast mam na uwadze postronnych. Tych co są tu obecnie i tych przyszłych co to przypadkiem natrafią na ten wątek i przyswoją nieprawdziwe informacje. Podobno cały ruch antyszczepionkowy wziął się z takiego przypadku, gdy jakiś niespełniony naukowiec spreparował badania i napisał esej, który udowadniał, ze szczepionki to ZUO. To chyba nawet w jakimś profesjonalnym periodyku medycznym wyszło i dopiero potem okazało się, że to ściema i periodyk dementował. Ale fakt, że opublikował jest faktem, który jest z kolei argumentem, że coś tu jest na rzeczy. O tym, że było dementi już niekoniecznie się wspomina. I tak sobie żyje ta urban legend narażając świat na wybuch epidemii. > A teraz zgodnie z podejściem nkaba; ja tam nie wiem, ale jestem > przekonany, że inaczej się nie da, bo tak jak mi sie wydaje jest > najlepiej na świecie! Ja mam na to zawsze dobrą odpowiedź: masz rację - wydaje Ci się ;). -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: M.M.
Date: Tue, 17 Feb 2015 20:46
Date: Tue, 17 Feb 2015 20:46
30 lines
3685 bytes
3685 bytes
On Saturday, February 14, 2015 at 8:01:54 AM UTC+1, Cezary Grądys wrote: > W dniu 12.02.2015 o 16:21, IDKrzych pisze: > > > W SQL by mieć posortowane dane TRZEBA dodać klauzulę ORDER BY. > > I koniec - nie ma wyjątków. > > Indeksy też nic do tego nie mają. I nie do tego służą. > > Indeksy nie służą do sortowania tylko do wyszukiwania i wyszczególniania > > podzbiorów na podstawie zadanych warunków (a precyzyjniej do > > usprawnienia tych czynności - bez indeksów działa to dużo wolniej). > > > > Oczywista sprawa, w modelu relacyjnym kolejność wierszy, a nawet pól nie > jest ważna!!! Jak to nie jest ważna? Jest ważna dla wydajności w przypadku gdy zbiory danych są przechowywane na dyskach talerzowych. Choćby z tego powodu został wprowadzony indeks klastrowy. Kolejność jest na tyle ważna, że czasami trzyma się 2-3 kopie danych, tylko po to aby w każdej kopii zachować określony porządek sortowania. > To, że baza zwraca w kolejności wprowadzenia, czy czasem > posortuje (bo DISTINCT czy GROUP BY tego wymaga, żeby go zrobić) to jest > efekt uboczny! > Zwykły UPDATE zaburzy kolejność danych zwracanych przez select * FROM > tabela. Ten przykład dowodzi tylko tego, ze pozwoliłeś bazie na zwrócenie danych w dowolnym porządku i w dowolnym porządku Ci zwróciła. TO nie ma nic wspólnego z porządkiem na dysku. Pozdrawiam
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Wed, 18 Feb 2015 07:34
Date: Wed, 18 Feb 2015 07:34
14 lines
2621 bytes
2621 bytes
W dniu 2015-02-17 o 21:46, M.M. pisze: > On Saturday, February 14, 2015 at 8:01:54 AM UTC+1, Cezary Grądys wrote: >> Oczywista sprawa, w modelu relacyjnym kolejność wierszy, a nawet pól nie >> jest ważna!!! > Jak to nie jest ważna? Jest ważna dla wydajności w przypadku gdy > zbiory danych są przechowywane na dyskach talerzowych. Choćby z > tego powodu został wprowadzony indeks klastrowy. Kolejność jest > na tyle ważna, że czasami trzyma się 2-3 kopie danych, tylko po to > aby w każdej kopii zachować określony porządek sortowania. Czy można prosić o jakiś link na poparcie tych informacji. -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: M.M.
Date: Wed, 18 Feb 2015 10:50
Date: Wed, 18 Feb 2015 10:50
17 lines
3010 bytes
3010 bytes
On Wednesday, February 18, 2015 at 8:34:12 AM UTC+1, PaSkol wrote: > W dniu 2015-02-17 o 21:46, M.M. pisze: > > On Saturday, February 14, 2015 at 8:01:54 AM UTC+1, Cezary Grądys wrote: > >> Oczywista sprawa, w modelu relacyjnym kolejność wierszy, a nawet pól nie > >> jest ważna!!! > > Jak to nie jest ważna? Jest ważna dla wydajności w przypadku gdy > > zbiory danych są przechowywane na dyskach talerzowych. Choćby z > > tego powodu został wprowadzony indeks klastrowy. Kolejność jest > > na tyle ważna, że czasami trzyma się 2-3 kopie danych, tylko po to > > aby w każdej kopii zachować określony porządek sortowania. > > Czy można prosić o jakiś link na poparcie tych informacji. > > -- > PaSkol (paskol.robi.to) To ogólnie dostępna wiedza. Wpisz w google.
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Wed, 18 Feb 2015 18:36
Date: Wed, 18 Feb 2015 18:36
9 lines
2270 bytes
2270 bytes
W dniu 2015-02-18 o 11:50, M.M. pisze: > To ogólnie dostępna wiedza. Wpisz w google. _Co_ takiego mam wpisać w Google, aby dostać materiał potwierdzający, że indeks klastrowy został wprowadzony ponieważ zbiory danych są przechowywane na dyskach talerzowych. -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: M.M.
Date: Thu, 19 Feb 2015 13:05
Date: Thu, 19 Feb 2015 13:05
22 lines
3485 bytes
3485 bytes
On Wednesday, February 18, 2015 at 7:36:13 PM UTC+1, PaSkol wrote: > W dniu 2015-02-18 o 11:50, M.M. pisze: > > To ogólnie dostępna wiedza. Wpisz w google. > > _Co_ takiego mam wpisać w Google, aby dostać materiał potwierdzający, że > indeks klastrowy został wprowadzony ponieważ zbiory danych są > przechowywane na dyskach talerzowych. > > -- > PaSkol (paskol.robi.to) Właściwie to się nie tylko dysków talerzowych tyczy... Zawsze, gdy wyszukanie danych spod 'losowego' adresu jest znacznie wolniejsze od odczytu sekwencyjnego, warto zastanowić się nad reorganizacją danych w tabelach. Ja wpisałem tak w google: sql indeks klastrowy Fragment z pierwszej strony w googlu: Clustered Index swoją strukturą najbardziej przypomina książkę telefoniczną z ułożonymi alfabetycznie wpisami. Indeks ten nie jest odrębnym obiektem składowanym na dysku twardym. Jego podstawowym zadaniem jest narzucanie tabelom, w jaki sposób mają zapisywać wiersze na kolejnych stronach. Istotną informacją jest fakt, iż po utworzeniu indeksu grupującego, struktura stron tabeli podlega reorganizacji wg wskazań indeksu. Pozdrawiam
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Thu, 19 Feb 2015 21:28
Date: Thu, 19 Feb 2015 21:28
35 lines
3889 bytes
3889 bytes
W dniu 2015-02-19 o 14:05, M.M. pisze: > Właściwie to się nie tylko dysków talerzowych tyczy... Zawsze, gdy > wyszukanie danych spod 'losowego' adresu jest znacznie wolniejsze od > odczytu sekwencyjnego, warto zastanowić się nad reorganizacją > danych w tabelach. Rzecz w tym, że wybór jest zawsze pomiędzy stertą i uporządkowanym ułożeniem danych. Zauważ jednak, że o ile indeks klastrowy przyspiesza wyszukiwanie, to koszt jego utrzymania jest duży - wymaga bowiem relokacji i to całego wiersza, ponieważ jest de facto porządkiem tabeli, a nie "adresów" wierszy w tabeli. Dlatego najczęściej jest zakładany na narastającej wartości, dzięki czemu praktycznie znika problem relokacji (i ów koszt). Każdy kolejny wiersz jest dodawany na końcu i pozostaje w zgodzie z indeksem. A ponieważ owa narastająca wartość jest zazwyczaj także sztucznym kluczem głównym tabeli więc zysk się powiększa - wszelkie złączenia są najbardziej wydajne jak to tylko możliwe, bo po dokonaniu złączenia jest się właśnie w miejscu, z którego można pobrać dane. Bywa jednak i tak, że klucz nie jest sztuczny, ale naturalny (np. kod paskowy albo jakiś symbol zrozumiały dla człowieka). Wówczas konieczne są dodatkowe zabiegi, które pozwolą zachować dużą wydajność wyszukiwania po takim indeksie, bo następuje jego defragmentacja oraz rosną puste przestrzenie w stronach danych (tych o których mowa w przytoczonym przez Ciebie fragmencie). W temacie indeksu klastrowego należy także nadmienić, że ewentualna potrzeba jego relokacji wymusza niepełność stron danych w pliku bazy. W każdej musi bowiem zostać trochę miejsca na relokowane wiersze (jeśli relokacja jest niewielka, bo czasem kończy się to powstaniem nowej strony, a oddaniem dotychczasowej do ponownego użycia). -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: wloochacz
Date: Fri, 20 Feb 2015 10:41
Date: Fri, 20 Feb 2015 10:41
42 lines
4166 bytes
4166 bytes
W dniu 2015-02-19 o 22:28, PaSkol pisze: > W dniu 2015-02-19 o 14:05, M.M. pisze: >> Właściwie to się nie tylko dysków talerzowych tyczy... Zawsze, gdy >> wyszukanie danych spod 'losowego' adresu jest znacznie wolniejsze od >> odczytu sekwencyjnego, warto zastanowić się nad reorganizacją >> danych w tabelach. No w końcu! :) Jak sam zauważyłeś, talerz o który m pisałeś wcześniej nie ma tu nic do gadania. > Rzecz w tym, że wybór jest zawsze pomiędzy stertą i uporządkowanym > ułożeniem danych. Zauważ jednak, że o ile indeks klastrowy przyspiesza > wyszukiwanie, to koszt jego utrzymania jest duży - wymaga bowiem > relokacji i to całego wiersza, ponieważ jest de facto porządkiem tabeli, > a nie "adresów" wierszy w tabeli. > > Dlatego najczęściej jest zakładany na narastającej wartości, dzięki > czemu praktycznie znika problem relokacji (i ów koszt). > Każdy kolejny > wiersz jest dodawany na końcu i pozostaje w zgodzie z indeksem. A > ponieważ owa narastająca wartość jest zazwyczaj także sztucznym kluczem > głównym tabeli więc zysk się powiększa - wszelkie złączenia są > najbardziej wydajne jak to tylko możliwe, bo po dokonaniu złączenia jest > się właśnie w miejscu, z którego można pobrać dane. > > Bywa jednak i tak, że klucz nie jest sztuczny, ale naturalny (np. kod > paskowy albo jakiś symbol zrozumiały dla człowieka). Wówczas konieczne > są dodatkowe zabiegi, które pozwolą zachować dużą wydajność wyszukiwania > po takim indeksie, bo następuje jego defragmentacja oraz rosną puste > przestrzenie w stronach danych (tych o których mowa w przytoczonym przez > Ciebie fragmencie). Dodam coś; i dlatego nie powinno się zakładać indeksów klastrowych na typach GUID/UUID - to bez sensu. A ludkowie często tak robią... > W temacie indeksu klastrowego należy także nadmienić, że ewentualna > potrzeba jego relokacji wymusza niepełność stron danych w pliku bazy. W > każdej musi bowiem zostać trochę miejsca na relokowane wiersze (jeśli > relokacja jest niewielka, bo czasem kończy się to powstaniem nowej > strony, a oddaniem dotychczasowej do ponownego użycia). -- wloochacz
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Fri, 20 Feb 2015 10:50
Date: Fri, 20 Feb 2015 10:50
65 lines
5457 bytes
5457 bytes
W dniu 2015-02-20 o 08:28, nkab@toya.net.pl pisze: > W dniu wtorek, 17 lutego 2015 17:52:52 UTC+1 użytkownik PaSkol napisał: >> Mogą? One są wdrożone. Sprawdź sobie inne RDBMS oprócz tego, którego >> używasz. I zapoznaj się z organizacją takiego pliku bazy danych, bo z >> pewnością nie jest taka, jak sobie wyobrażasz. > > Niestety ale to tobie wydaje się - wszystkie bazy danych mają > oddzielne pliki dla rekordów i osobne dla indeksów. Tak? A dla ilu baz (RDBMS) to sprawdzałeś? Bo ja dla SQL Serwera i (kiedyś) Firebirda oraz Oracla. Wszystkie one mają jeden plik na dane bazy (a w nich tabele i indeksy, zapewne przechowywane w stronach) i ewentualnie dodatkowe pliki na potrzeby zarządzania bazą (logi transakcji czy metadane). Czyli ewidentnie _są_wdrożone_ i tym samym nie "wszystkie bazy danych mają oddzielne pliki dla rekordów i osobne dla indeksów" (chyba PostgreSQL ma z kolei taką strukturę). > Przestań literaturę traktować jak jakąś biblię i zacznij > sam analizować a wszystko będzie się bardziej oczywiste. Jesteś ostatnią osobą, która może udzielać takich rad, bo sam nie dokonałeś żadnej analizy, tylko stwierdziłeś, że skoro jest tak w jednym systemie, to jest tak w innych. I w przeciwieństwie do Ciebie nie traktuje literatury bezkrytycznie, bo uniemożliwia mi to praktyka w jakiej sprawdzam poznane tam teorie. Rzecz w tym, że Ty nawet nie masz zamiaru rozpoznawać dowolnego tematu - siadasz i robisz. I potem wychodzą takie kwiatki jak ignorowanie i deprecjonowanie "order by". > Prawdziwa historia była inna - naukowiec pokazał jak można > zniszczyć własne państwo - zaś ostatnie zadnie dopisał złośliwy > komuch, który chciał ośmieszyć naukowca. Już wiem - Ty po prostu nie rozumiesz tego co czytasz, albo po prostu masz halucynacje, być może wynikające ze wzburzenia. Ale w tej materii jestem laikiem, więc może zgłoś się do specjalisty. > Ja piszę całe systemy od początku do końca, z których użytkownicy > są bardzo zadowoleni, ty natomiast zajmujesz tylko małym fragmentem > tego co ja robię na co dzień. W odróżnieniu od ciebie ja jestem > profesjonalistą a korzystanie z indeksów to mam w małym paluszku. Skąd wiesz czym się zajmuję? Skąd przypuszczenie, że zadowolenie klientów przekłada się na bycie profesjonalistą. Pani z warzywniaka też ma zadowolonych klientów, bo ma dobre ceny jak na jakość towarów jakie sprzedaje. Gdzie dowód, że masz indeksy w małym paluszku (chociaż chyba się zgodzę, bo z tego co dotychczas napisałeś, raczej nie w głowie). Gdzie dowód, że to Ty a nie ja jesteś profesjonalistą. > Was dwóch wkurza, że jest tu ktoś, kto prostymi metodami przekazuje > innym swoją wiedzę praktyczną. To was dwóch wkurza, ale mnie to lata > i powiewa. Złóżcie raport swojemu mocodawcy, że nkab znowu nadaje. > Z analitykiem nie wygracie. Nas dwóch? Mówisz o Wloochaczu? Porównaj sobie te pisane przez Ciebie "całe systemy od początku do końca" z jego systemem. Nadal uważasz się za profesjonalistę? I nic Ci nie da wmawianie nam, że prostymi metodami przekazujesz wiedzę praktyczną. Ty przekazujesz to co Ci się wydaje. To nie jest _WIEDZA_, to jakieś bzdety. I banalnym jest wykazać, że bzdetami są, Ty zaś nie jesteś w stanie podać kontrargumentów, które by temu przeczyły. -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Fri, 20 Feb 2015 10:52
Date: Fri, 20 Feb 2015 10:52
8 lines
2204 bytes
2204 bytes
W dniu 2015-02-20 o 11:41, wloochacz pisze: > Dodam coś; i dlatego nie powinno się zakładać indeksów klastrowych na > typach GUID/UUID - to bez sensu. A ludkowie często tak robią... Dokładnie - masakra :). -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: M.M.
Date: Fri, 20 Feb 2015 16:50
Date: Fri, 20 Feb 2015 16:50
88 lines
5973 bytes
5973 bytes
On Thursday, February 19, 2015 at 10:28:54 PM UTC+1, PaSkol wrote: > W dniu 2015-02-19 o 14:05, M.M. pisze: > > Właściwie to się nie tylko dysków talerzowych tyczy... Zawsze, gdy > > wyszukanie danych spod 'losowego' adresu jest znacznie wolniejsze od > > odczytu sekwencyjnego, warto zastanowić się nad reorganizacją > > danych w tabelach. > > Rzecz w tym, że wybór jest zawsze pomiędzy stertą i uporządkowanym > ułożeniem danych. No tak. > Zauważ jednak, że o ile indeks klastrowy przyspiesza > wyszukiwanie, to koszt jego utrzymania jest duży - wymaga bowiem > relokacji i to całego wiersza, ponieważ jest de facto porządkiem tabeli, > a nie "adresów" wierszy w tabeli. Generalnie, utrzymanie porządku danych na dowolnym nośniku może być związane z dużym kosztem. Jeśli często wstawiasz rekord o 'losowych wartościach klucza', często usuwasz losowy rekord, często modyfikujesz wartości rekordu związane z kluczem, to może nawet baza RAM nie wytrzymać. Nigdy nie spotkałem się z opcją, która wymusza porządek raz na jakiś czas, np. raz na dobę, albo po przekroczeniu N modyfikacji - bazy są wyposażone w takie mechanizmy? > Dlatego najczęściej jest zakładany na narastającej wartości, dzięki > czemu praktycznie znika problem relokacji (i ów koszt). Lecz im bardziej ten koszt znika, tym mniej taki indeks jest potrzebny :) > Każdy kolejny > wiersz jest dodawany na końcu i pozostaje w zgodzie z indeksem. A > ponieważ owa narastająca wartość jest zazwyczaj także sztucznym kluczem > głównym tabeli W praktyce data często narasta. > więc zysk się powiększa - wszelkie złączenia są > najbardziej wydajne jak to tylko możliwe, bo po dokonaniu złączenia jest > się właśnie w miejscu, z którego można pobrać dane. To przy założeniu, że pozycję rekordu można wyliczyć z wzoru head + (id - id_poczatkowe) * sizeof(rekord). Jeśli usuniesz jeden rekord ze środka, to albo: 1) tracisz taką możliwość 2) musisz zmienić wszystkie id własne i obce! > Bywa jednak i tak, że klucz nie jest sztuczny, ale naturalny (np. kod > paskowy albo jakiś symbol zrozumiały dla człowieka). Może robię źle, ale zawsze używam klucza int64, robię to z automatu, bez zastanowienia. > Wówczas konieczne > są dodatkowe zabiegi, które pozwolą zachować dużą wydajność wyszukiwania > po takim indeksie, Po prostu uaktualnia się indeks btree, hash, czy co tam jeszcze... > bo następuje jego defragmentacja Nie wiem co to jest defragmentacja indeksu. > oraz rosną puste przestrzenie w stronach danych (tych o których > mowa w przytoczonym przez Ciebie fragmencie). Nie wiem o co chodzi, gdy użyje się narastającego klucza, to w wyniku usunięcia rekordu, też powstaje 'pusta przestrzeń'. > > W temacie indeksu klastrowego należy także nadmienić, że ewentualna > potrzeba jego relokacji wymusza niepełność stron danych w pliku bazy. Nie rozumiem. > W > każdej musi bowiem zostać trochę miejsca na relokowane wiersze (jeśli > relokacja jest niewielka, bo czasem kończy się to powstaniem nowej > strony, a oddaniem dotychczasowej do ponownego użycia). Też nie rozumiem. Chodzi o ulożenie danych w taki sposób, aby był sprzyjający szybkiemu odczytowi. Czy trzeba wnikać w to, ile pustego miejsca zostaje na stronie? Chyba normalnie dane zapisuje się pod narastającymi wskaźnikami? Ale to wszystko i tak bierze w łeb, gdy dane leżą na rozproszonych maszynach.... Pozdrawiam
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Fri, 20 Feb 2015 19:15
Date: Fri, 20 Feb 2015 19:15
112 lines
7828 bytes
7828 bytes
W dniu 2015-02-20 o 17:50, M.M. pisze: > Nigdy nie spotkałem się z opcją, która > wymusza porządek raz na jakiś czas, np. raz na dobę, albo po > przekroczeniu N modyfikacji - bazy są wyposażone w takie mechanizmy? Takimi indeksami są te MSSQL dotyczące wyszukiwania tekstowego (full-text search). We wcześniejszych wersjach trzeba je było aktualizować osobno, obecnie chyba jest to automatyczne, ale nie potwierdzę w 100% ponieważ nie używam tej funkcjonalności. >> Dlatego najczęściej jest zakładany na narastającej wartości, dzięki >> czemu praktycznie znika problem relokacji (i ów koszt). > Lecz im bardziej ten koszt znika, tym mniej taki indeks jest potrzebny :) Niekoniecznie, bo indeks ten jest (jak już pisałem) przydatny w złączeniach. Natomiast do wyszukiwania (jakiegokolwiek) można zastosować indeksy nieklastrowe. W większości przypadków są one wystarczające wydajnościowo. >> więc zysk się powiększa - wszelkie złączenia są >> najbardziej wydajne jak to tylko możliwe, bo po dokonaniu złączenia jest >> się właśnie w miejscu, z którego można pobrać dane. > To przy założeniu, że pozycję rekordu można wyliczyć z wzoru > head + (id - id_poczatkowe) * sizeof(rekord). Jeśli usuniesz jeden > rekord ze środka, to albo: > 1) tracisz taką możliwość > 2) musisz zmienić wszystkie id własne i obce! Nie, nie o to chodzi. Szukając klucza o wartości 100, w przypadku indeksu klastrowego przeszukiwana jest de facto tabela, tylko że wiadomo, iż ona "narasta" czyli trzeba przejść przez max. 100 wierszy. To nigdy nie jest wyliczana pozycja m.in. z tego powodu, który podałeś, ale także dlatego, że masz pola (kolumny) o dynamicznej wielkości (np. varchar), co pozwala upakować na stronie danych więcej tychże danych (czasem strona - której wielkość jest przecież stała - ma więcej wierszy niż inna strona tej samej tabeli). Dlatego gdy znajdziesz 100, to tuż za nim jest cała reszta potrzebnego Ci wiersza. O to mi chodziło, gdy pisałem o "miejscu". Pisząc o Id (bo widzę, że traktujesz je w innym, także występującym po taką nazwą znaczeniu) miałem na myśli kolumnę o nazwie Id, a nie wewnętrzny (internal) identyfikator wiersza w tabeli. Czyli nie wystąpi tutaj konieczność readresacji, bo to wartości klucza. Tu od razu zastrzegam, że piszę z pamięci, a od pewnego czasu nie siedzę zbyt intensywnie w bazach danych, więc mogło mi się już coś zatrzeć w pamięci. Co z kolei jest widomym powodem, że pora sobie trochę te wiadomości odświeżyć, więc być może wrzucę coś na bloga w tym temacie (gdybyż jeszcze ten czas). >> Bywa jednak i tak, że klucz nie jest sztuczny, ale naturalny (np. kod >> paskowy albo jakiś symbol zrozumiały dla człowieka). > Może robię źle, ale zawsze używam klucza int64, robię to z automatu, bez > zastanowienia. Zapewne w większości przypadków nie będzie to szczególnie kosztowne. A po to mamy tuning bazy danych, aby kiedy już koszt stanie się uciążliwy, po prostu ten tuning przeprowadzić. >> bo następuje jego defragmentacja > Nie wiem co to jest defragmentacja indeksu. Dane jak i indeksy (a indeks klastrowy jest przecież integralny z danymi) są przechowywane na stronach. Bywa (znów piszę z pamięci, ale chyba tak właśnie to działa), że zamiast relokować wiersze lepiej jest zostawić część na obecnej stronie, a te wstawiane wrzucić na nową i umieścić ją tuż za tamtą w logicznym łańcuchu stron. Układ fizyczny tych stron będzie inny niż logiczny, więc mogą być od siebie oddalone w rzeczywistym pliku bazy o spory odstęp. Więc jest defragmentacja. >> oraz rosną puste przestrzenie w stronach danych (tych o których >> mowa w przytoczonym przez Ciebie fragmencie). > Nie wiem o co chodzi, gdy użyje się narastającego klucza, to > w wyniku usunięcia rekordu, też powstaje 'pusta przestrzeń'. Ta pusta przestrzeń może powstać, kiedy w powyższym przykładzie część wierszy pozostaje na stronie, część jest usuwana i przenoszona na inną stronę, choć dochodzi np. kilka wierszy. Dlaczego tak się dzieje? >> W temacie indeksu klastrowego należy także nadmienić, że ewentualna >> potrzeba jego relokacji wymusza niepełność stron danych w pliku bazy. > Nie rozumiem. Otóż strony pozostają niepełne właśnie ze względu na to, że może zajść potrzeba dodania pomiędzy znajdujące się na nich wiersze tego, który zgodnie z porządkiem powinien być tam umieszczony. I wówczas gdy strona nie jest w całości zapełniona, można taki wiersz dorzucić w owo puste miejsce (lub relokować w ramach strony istniejące tam wiersze, by wstawić ów nowy pomiędzy nie). SQL Serwer ma zdefiniowane jak tą pustą przestrzenią zarządzać, więc czasem dokłada do niej wiersze, a czasem z tego rezygnuje, jeśli z oszacowań wychodzi mu, że lepiej wstawić pomiędzy strony kolejną, a tamto puste miejsce pozostawić na przyszłe potrzeby. > Chodzi o ulożenie danych w taki sposób, aby był sprzyjający szybkiemu > odczytowi. Czy trzeba wnikać w to, ile pustego miejsca zostaje na > stronie? Czasem trzeba, bywa bowiem, że posiadana przestrzeń ma konkretny koszt (np. w chmurze) i konieczne staje się odpowiednie dostosowanie owej pustej przestrzeni. Jest to nieustanna walka pomiędzy wydajnością i zajętością bazy. > Ale to wszystko i tak bierze w łeb, gdy dane leżą > na rozproszonych maszynach.... Nie wiem, nie mam doświadczenia w tej materii, o ile rozumiemy rozproszenie danych tej samej tabeli czy bazy (czy to byłyby partycje na oddzielnych maszynach? tego nie trenowałem). -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: M.M.
Date: Sat, 21 Feb 2015 11:53
Date: Sat, 21 Feb 2015 11:53
188 lines
11720 bytes
11720 bytes
On Friday, February 20, 2015 at 8:15:24 PM UTC+1, PaSkol wrote: > W dniu 2015-02-20 o 17:50, M.M. pisze: > > Nigdy nie spotkałem się z opcją, która > > wymusza porządek raz na jakiś czas, np. raz na dobę, albo po > > przekroczeniu N modyfikacji - bazy są wyposażone w takie mechanizmy? > > Takimi indeksami są te MSSQL dotyczące wyszukiwania tekstowego > (full-text search). We wcześniejszych wersjach trzeba je było > aktualizować osobno, obecnie chyba jest to automatyczne, ale nie > potwierdzę w 100% ponieważ nie używam tej funkcjonalności. Przeszukiwanie pełnotekstowe to jeszcze inne zagadnienie. > >> Dlatego najczęściej jest zakładany na narastającej wartości, dzięki > >> czemu praktycznie znika problem relokacji (i ów koszt). > > Lecz im bardziej ten koszt znika, tym mniej taki indeks jest potrzebny :) > > Niekoniecznie, bo indeks ten jest (jak już pisałem) przydatny w > złączeniach. Natomiast do wyszukiwania (jakiegokolwiek) można zastosować > indeksy nieklastrowe. W większości przypadków są one wystarczające > wydajnościowo. Nie rozumiem dlaczego niekoniecznie. Nie rozumiem też, dlaczego indeks klastrowy miałby być lepszy w złączeniach niż zwykły. > > >> więc zysk się powiększa - wszelkie złączenia są > >> najbardziej wydajne jak to tylko możliwe, bo po dokonaniu złączenia jest > >> się właśnie w miejscu, z którego można pobrać dane. > > To przy założeniu, że pozycję rekordu można wyliczyć z wzoru > > head + (id - id_poczatkowe) * sizeof(rekord). Jeśli usuniesz jeden > > rekord ze środka, to albo: > > 1) tracisz taką możliwość > > 2) musisz zmienić wszystkie id własne i obce! > > Nie, nie o to chodzi. Szukając klucza o wartości 100, w przypadku > indeksu klastrowego przeszukiwana jest de facto tabela, tylko że > wiadomo, iż ona "narasta" czyli trzeba przejść przez max. 100 wierszy. To zależy od implementacji indeksu. Nie mam bladego pojęcia, jakie są implementacje w popularnych bazach. W przypadku wyszukiwania binarnego, maksymalna ilość wierszy, które trzeba poddać analizie, zależy od ilości wszystkich rekordów w tabeli, a nie od wartości klucza. > To nigdy nie jest wyliczana pozycja m.in. z tego powodu, który podałeś, > ale także dlatego, że masz pola (kolumny) o dynamicznej wielkości (np. > varchar), co pozwala upakować na stronie danych więcej tychże danych Tak, to dodatkowy powód, ale tylko w pewnych implementacjach. Pole może mieć stałą dlugość, może zawierać tylko odnośnik do innego pliku, albo do innej przestrzeni adresowej w tym samym pliku. Rozwiązań jest sporo, nie wiem jak to jest rozwiązane w popularnych bazach. Tak czy inaczej, rozmowa na ten temat chyba nic istotnego dla programisty-użytkownika baz danych nie wnosi? > (czasem strona - której wielkość jest przecież stała - ma więcej wierszy > niż inna strona tej samej tabeli). Dlatego gdy znajdziesz 100, to tuż za > nim jest cała reszta potrzebnego Ci wiersza. O to mi chodziło, gdy > pisałem o "miejscu". > Pisząc o Id (bo widzę, że traktujesz je w innym, także występującym po > taką nazwą znaczeniu) miałem na myśli kolumnę o nazwie Id, a nie > wewnętrzny (internal) identyfikator wiersza w tabeli. Czyli nie wystąpi > tutaj konieczność readresacji, bo to wartości klucza. Mam zasadnicze pytanie dla dalszej rozmowy, czy warto tak szczegółową wiedzę posiadać, czy lepiej traktować indeks, pole, tabelę, klucz, jako (prawie) czarne skrzynki? > Tu od razu zastrzegam, że piszę z pamięci, a od pewnego czasu nie siedzę > zbyt intensywnie w bazach danych, więc mogło mi się już coś zatrzeć w > pamięci. Co z kolei jest widomym powodem, że pora sobie trochę te > wiadomości odświeżyć, więc być może wrzucę coś na bloga w tym temacie > (gdybyż jeszcze ten czas). Właśnie, gdy traktujemy bazę jako zestaw czarnych skrzynek, to czasu mamy więcej. > >> Bywa jednak i tak, że klucz nie jest sztuczny, ale naturalny (np. kod > >> paskowy albo jakiś symbol zrozumiały dla człowieka). > > Może robię źle, ale zawsze używam klucza int64, robię to z automatu, bez > > zastanowienia. > > Zapewne w większości przypadków nie będzie to szczególnie kosztowne. A > po to mamy tuning bazy danych, aby kiedy już koszt stanie się uciążliwy, > po prostu ten tuning przeprowadzić. Mogę poprosić o jakiś przykład, gdy to będzie bardzo kosztowne? > >> bo następuje jego defragmentacja > > Nie wiem co to jest defragmentacja indeksu. > > Dane jak i indeksy (a indeks klastrowy jest przecież integralny z > danymi) Nie wiem co to jest indeks integralny z danymi. Masz na myśli to, że dane są uporządkowane, więc można zastosować wyszukiwanie binarne (np. z aproksymacją liniową), więc nie potrzeba żadnych dodatkowych informacji? Jeśli tak, to zwróć uwagę, że nie na wszystkich nośnikach takie wyszukiwanie jest optymalne. > są przechowywane na stronach. Bywa (znów piszę z pamięci, ale > chyba tak właśnie to działa), że zamiast relokować wiersze lepiej jest > zostawić część na obecnej stronie, a te wstawiane wrzucić na nową i > umieścić ją tuż za tamtą w logicznym łańcuchu stron. Zależy dlaczego lepiej. Dla przeglądania sekwencyjnego gorzej, ponieważ trzeba więcej danych przejrzeć. Dla wyszukiwania losowego chyba lepiej, bo wystarczy jedną stronę wycztać. Dla wstawiania może być lepiej, ale pod warunkiem, że zostawi się dużo wolnego miejsca. > Układ fizyczny tych > stron będzie inny niż logiczny, więc mogą być od siebie oddalone w > rzeczywistym pliku bazy o spory odstęp. Więc jest defragmentacja. Ja chyba w ogóle nie rozumiem jak używasz określenia indeks :) Z tego co piszesz, to po prostu kolejne ( w sensie sortowania ) dane nie są pod kolejnymi adresami (w sensie sekwencyjnego odczytu). > > >> oraz rosną puste przestrzenie w stronach danych (tych o których > >> mowa w przytoczonym przez Ciebie fragmencie). > > Nie wiem o co chodzi, gdy użyje się narastającego klucza, to > > w wyniku usunięcia rekordu, też powstaje 'pusta przestrzeń'. > > Ta pusta przestrzeń może powstać, kiedy w powyższym przykładzie część > wierszy pozostaje na stronie, część jest usuwana i przenoszona na inną > stronę, choć dochodzi np. kilka wierszy. Dlaczego tak się dzieje? > > >> W temacie indeksu klastrowego należy także nadmienić, że ewentualna > >> potrzeba jego relokacji wymusza niepełność stron danych w pliku bazy. > > Nie rozumiem. > > Otóż strony pozostają niepełne właśnie ze względu na to, że może zajść > potrzeba dodania pomiędzy znajdujące się na nich wiersze tego, który > zgodnie z porządkiem powinien być tam umieszczony. I wówczas gdy strona > nie jest w całości zapełniona, można taki wiersz dorzucić w owo puste > miejsce (lub relokować w ramach strony istniejące tam wiersze, by > wstawić ów nowy pomiędzy nie). SQL Serwer ma zdefiniowane jak tą pustą > przestrzenią zarządzać, więc czasem dokłada do niej wiersze, a czasem z > tego rezygnuje, jeśli z oszacowań wychodzi mu, że lepiej wstawić > pomiędzy strony kolejną, a tamto puste miejsce pozostawić na przyszłe > potrzeby. To pewnie jest dobry kompromis pomiędzy wydajnym odczytem sekwencyjnym, a wydajnymi modyfikacjami. Czy postgres też ma coś takiego? > > Chodzi o ulożenie danych w taki sposób, aby był sprzyjający szybkiemu > > odczytowi. Czy trzeba wnikać w to, ile pustego miejsca zostaje na > > stronie? > > Czasem trzeba, bywa bowiem, że posiadana przestrzeń ma konkretny koszt > (np. w chmurze) i konieczne staje się odpowiednie dostosowanie owej > pustej przestrzeni. Jest to nieustanna walka pomiędzy wydajnością i > zajętością bazy. Rozumiem. Ale też pomiędzy wydajnością modyfikacji a wydajnością sekwencyjnego odczytu. > > Ale to wszystko i tak bierze w łeb, gdy dane leżą > > na rozproszonych maszynach.... > > Nie wiem, nie mam doświadczenia w tej materii, o ile rozumiemy > rozproszenie danych tej samej tabeli czy bazy (czy to byłyby partycje na > oddzielnych maszynach? tego nie trenowałem). To jest jeszcze trudniejsze, niż rozstrzyganie czy rozproszenie jest na poziomie tabeli czy bazy. Do identyfikacji rekordów można mieć parę uporządkowaną: (klucz_wlasny, tabela). Można mieć N maszyn. Można obliczyć numer maszyny: i = funkcję hash(klucz_wlasny, tabela) % N. W ten sposób tabela może być tylko stringiem do obliczania numeru maszyny i numeru zbioru danych na danej maszynie. Tabela jako taka może w ogole nie istnieć. Tak samo prosto można podejść do indeksów. Do identyfikacji rekordu w indeksie też wystarczy taka para: (klucz, nazwa_indeksu). Rekordem indeksu to może być trójka: ( rodzic, lewy, prawy ) - i mamy drzewo poszukiwań binarnych. Niby wszystko pięknie, ale jaka robi się sieczka na takim prostym rozwiązaniu? Praktycznie nie ma szans na to, aby wykorzystać pamięc cache (w celu przyspieszenia). W dodatku ile jest maleńkich transferów po sieci? Wniosek z tego taki, że zwykle trzeba wyrzeźbić swoje, specjalistyczne rozwiązanie i dostosować rozkład danych i do sprzętu, i do algorytmów. Pozdrawiam
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Sat, 21 Feb 2015 16:41
Date: Sat, 21 Feb 2015 16:41
130 lines
8948 bytes
8948 bytes
W dniu 2015-02-21 o 12:53, M.M. pisze: >>>> Dlatego najczęściej jest zakładany na narastającej wartości, dzięki >>>> czemu praktycznie znika problem relokacji (i ów koszt). >>> Lecz im bardziej ten koszt znika, tym mniej taki indeks jest potrzebny :) >> >> Niekoniecznie, bo indeks ten jest (jak już pisałem) przydatny w >> złączeniach. Natomiast do wyszukiwania (jakiegokolwiek) można zastosować >> indeksy nieklastrowe. W większości przypadków są one wystarczające >> wydajnościowo. > Nie rozumiem dlaczego niekoniecznie. Nie rozumiem też, dlaczego > indeks klastrowy miałby być lepszy w złączeniach niż zwykły. No przecież sam przytoczyłeś: "...Clustered Index swoją strukturą najbardziej przypomina książkę telefoniczną z ułożonymi alfabetycznie wpisami. Indeks ten nie jest odrębnym obiektem składowanym na dysku twardym. Jego podstawowym zadaniem jest narzucanie tabelom, w jaki sposób mają zapisywać wiersze na kolejnych stronach. Istotną informacją jest fakt, iż po utworzeniu indeksu grupującego, struktura stron tabeli podlega reorganizacji wg wskazań indeksu..." Więc łącząc jakąś tabelę z tą tabelą po takim indeksie, od razu dostajemy też dane, zamiast najpierw dowiedzieć się, gdzie te dane są i dopiero po nie sięgnąć. >> Nie, nie o to chodzi. Szukając klucza o wartości 100, w przypadku >> indeksu klastrowego przeszukiwana jest de facto tabela, tylko że >> wiadomo, iż ona "narasta" czyli trzeba przejść przez max. 100 wierszy. > To zależy od implementacji indeksu. Nie mam bladego pojęcia, jakie > są implementacje w popularnych bazach. W przypadku wyszukiwania > binarnego, maksymalna ilość wierszy, które trzeba poddać analizie, > zależy od ilości wszystkich rekordów w tabeli, a nie od wartości klucza. Ale tu jest mowa o konkretnym indeksie _klastrowym_ i to w kontekście MSSQL-a (ten cytat, który przytaczałeś dotyczy właśnie jego). >> To nigdy nie jest wyliczana pozycja m.in. z tego powodu, który podałeś, >> ale także dlatego, że masz pola (kolumny) o dynamicznej wielkości (np. >> varchar), co pozwala upakować na stronie danych więcej tychże danych > Tak, to dodatkowy powód, ale tylko w pewnych implementacjach. Pole > może mieć stałą dlugość Jeśli ma _stałą_ długość to nie jest varcharem - na tym polega właściwość varchara, że nie zajmuje z góry ustalonego miejsca. > Tak czy inaczej, rozmowa na ten temat chyba nic istotnego dla > programisty-użytkownika baz danych nie wnosi? Zależy jakie masz oczekiwania wobec pisanego oprogramowania. Jeśli wydajność nie jest tu kluczowa, to można sobie tym głowy nie zawracać. Z drugiej strony, jeśli od razu projektujesz bazę wykorzystując taką wiedzę, to potem nie będziesz musiał jej reorganizować. > Mam zasadnicze pytanie dla dalszej rozmowy, czy warto tak szczegółową > wiedzę posiadać, czy lepiej traktować indeks, pole, tabelę, klucz, jako > (prawie) czarne skrzynki? Odpowiedź jest taka sama jak poprzednia. >> Tu od razu zastrzegam, że piszę z pamięci, a od pewnego czasu nie siedzę >> zbyt intensywnie w bazach danych, więc mogło mi się już coś zatrzeć w >> pamięci. Co z kolei jest widomym powodem, że pora sobie trochę te >> wiadomości odświeżyć, więc być może wrzucę coś na bloga w tym temacie >> (gdybyż jeszcze ten czas). > Właśnie, gdy traktujemy bazę jako zestaw czarnych skrzynek, to czasu > mamy więcej. Zależy który czas jest dla nas cenniejszy: nasz czy wszystkich użytkowników naszego - być może zbyt wolnego - oprogramowania. >> Zapewne w większości przypadków nie będzie to szczególnie kosztowne. A >> po to mamy tuning bazy danych, aby kiedy już koszt stanie się uciążliwy, >> po prostu ten tuning przeprowadzić. > Mogę poprosić o jakiś przykład, gdy to będzie bardzo kosztowne? Int64 w stosunku do Int32, jeżeli zakres wartości nie ma szans sięgnąć max tego drugiego, jest marnowaniem pamięci potrzebnej na przetwarzanie złączeń. Dla Int32 da się załadować więcej tych wartości do cache niż przy Int64. > Nie wiem co to jest indeks integralny z danymi. To jest właśnie indeks klastrowy - dane w tabeli są układane w kolejności odpowiadającej regule indeksu (zgodnie z zacytowanym tekstem). >> są przechowywane na stronach. Bywa (znów piszę z pamięci, ale >> chyba tak właśnie to działa), że zamiast relokować wiersze lepiej jest >> zostawić część na obecnej stronie, a te wstawiane wrzucić na nową i >> umieścić ją tuż za tamtą w logicznym łańcuchu stron. > Zależy dlaczego lepiej. Dla przeglądania sekwencyjnego gorzej, ponieważ > trzeba więcej danych przejrzeć. Dla wyszukiwania losowego chyba lepiej, > bo wystarczy jedną stronę wycztać. Dla wstawiania może być lepiej, > ale pod warunkiem, że zostawi się dużo wolnego miejsca. Wiesz, projektanci baz wybrali nie bez powodu takie "poszatkowane" rozwiązanie. Zapewne statystycznie jest ono najlepsze. >> Układ fizyczny tych >> stron będzie inny niż logiczny, więc mogą być od siebie oddalone w >> rzeczywistym pliku bazy o spory odstęp. Więc jest defragmentacja. > Ja chyba w ogóle nie rozumiem jak używasz określenia indeks :) > Z tego co piszesz, to po prostu kolejne ( w sensie sortowania ) dane nie > są pod kolejnymi adresami (w sensie sekwencyjnego odczytu). Nie mam tyle czasu, aby to dogłębnie wytłumaczyć, a rzecz sprowadza się do sposobu reprezentowania danych w samym pliku bazy. Tutaj odsyłam do pozycji "Microsoft SQL Server 2008 od środka: Zapytania w języku T-SQL" (przedostatnia pozycja działu Literatura na moim blogu). Z tym, że nie wiem czy taka wiedza jest Ci potrzebna, jeżeli używasz Posgresa. >> Otóż strony pozostają niepełne właśnie ze względu na to, że może zajść >> potrzeba dodania pomiędzy znajdujące się na nich wiersze tego, który >> zgodnie z porządkiem powinien być tam umieszczony. I wówczas gdy strona >> nie jest w całości zapełniona, można taki wiersz dorzucić w owo puste >> miejsce (lub relokować w ramach strony istniejące tam wiersze, by >> wstawić ów nowy pomiędzy nie). SQL Serwer ma zdefiniowane jak tą pustą >> przestrzenią zarządzać, więc czasem dokłada do niej wiersze, a czasem z >> tego rezygnuje, jeśli z oszacowań wychodzi mu, że lepiej wstawić >> pomiędzy strony kolejną, a tamto puste miejsce pozostawić na przyszłe >> potrzeby. > To pewnie jest dobry kompromis pomiędzy wydajnym odczytem sekwencyjnym, a > wydajnymi modyfikacjami. Czy postgres też ma coś takiego? Nie wiem, nie znam tej bazy, musiałbyś sprawdzić, wydaje mi się, że to baza w której tabele są w plikach, więc tutaj stronicowanie tabeli może być inaczej zrealizowane (może nie opłaca się jej stronicować?) -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: M.M.
Date: Sat, 21 Feb 2015 19:22
Date: Sat, 21 Feb 2015 19:22
186 lines
12278 bytes
12278 bytes
On Saturday, February 21, 2015 at 5:41:09 PM UTC+1, PaSkol wrote: > W dniu 2015-02-21 o 12:53, M.M. pisze: > >>>> Dlatego najczęściej jest zakładany na narastającej wartości, dzięki > >>>> czemu praktycznie znika problem relokacji (i ów koszt). > >>> Lecz im bardziej ten koszt znika, tym mniej taki indeks jest potrzebny :) > >> > >> Niekoniecznie, bo indeks ten jest (jak już pisałem) przydatny w > >> złączeniach. Natomiast do wyszukiwania (jakiegokolwiek) można zastosować > >> indeksy nieklastrowe. W większości przypadków są one wystarczające > >> wydajnościowo. > > Nie rozumiem dlaczego niekoniecznie. Nie rozumiem też, dlaczego > > indeks klastrowy miałby być lepszy w złączeniach niż zwykły. > > No przecież sam przytoczyłeś: > > "...Clustered Index swoją strukturą najbardziej przypomina książkę > telefoniczną z ułożonymi alfabetycznie wpisami. Indeks ten nie jest > odrębnym obiektem składowanym na dysku twardym. Jego podstawowym > zadaniem jest narzucanie tabelom, w jaki sposób mają zapisywać wiersze > na kolejnych stronach. Istotną informacją jest fakt, iż po utworzeniu > indeksu grupującego, struktura stron tabeli podlega reorganizacji wg > wskazań indeksu..." > Więc łącząc jakąś tabelę z tą tabelą po takim indeksie, od razu > dostajemy też dane, zamiast najpierw dowiedzieć się, gdzie te dane są i > dopiero po nie sięgnąć. Wybacz, ale nadal nie rozumiem, co ma wspólnego przytoczony przeze mnie tekst z szybszymi złączeniami. Uporządkowanie danych pomaga wtedy, gdy po odczycie rekordu o numerze (fizycznym) N, jest duże prawdopodobieństwo odczytania rekordu o numerze N+1. W jakich złączeniach tak jest? > >> Nie, nie o to chodzi. Szukając klucza o wartości 100, w przypadku > >> indeksu klastrowego przeszukiwana jest de facto tabela, tylko że > >> wiadomo, iż ona "narasta" czyli trzeba przejść przez max. 100 wierszy. > > To zależy od implementacji indeksu. Nie mam bladego pojęcia, jakie > > są implementacje w popularnych bazach. W przypadku wyszukiwania > > binarnego, maksymalna ilość wierszy, które trzeba poddać analizie, > > zależy od ilości wszystkich rekordów w tabeli, a nie od wartości klucza. > > Ale tu jest mowa o konkretnym indeksie _klastrowym_ i to w kontekście > MSSQL-a (ten cytat, który przytaczałeś dotyczy właśnie jego). Nie rozumiem. Dlaczego MSSQL miałby przeglądać maksymalnie 100 rekordów gdy id jest równe 100, w przypadku clustered? Sorry, ale nic kompletnie nie kumam. > > >> To nigdy nie jest wyliczana pozycja m.in. z tego powodu, który podałeś, > >> ale także dlatego, że masz pola (kolumny) o dynamicznej wielkości (np. > >> varchar), co pozwala upakować na stronie danych więcej tychże danych > > Tak, to dodatkowy powód, ale tylko w pewnych implementacjach. Pole > > może mieć stałą dlugość > > Jeśli ma _stałą_ długość to nie jest varcharem - na tym polega > właściwość varchara, że nie zajmuje z góry ustalonego miejsca. varchar może mieć dowolną długość, ale implementacja varchara może być taka, że pole ma stałą długość. Po prostu string może być w innym pliku, a w varchar może być odnośnik do niego. > > Tak czy inaczej, rozmowa na ten temat chyba nic istotnego dla > > programisty-użytkownika baz danych nie wnosi? > > Zależy jakie masz oczekiwania wobec pisanego oprogramowania. Jeśli > wydajność nie jest tu kluczowa, to można sobie tym głowy nie zawracać. Z > drugiej strony, jeśli od razu projektujesz bazę wykorzystując taką > wiedzę, to potem nie będziesz musiał jej reorganizować. Właśnie nie jestem przekonany czy jakakolwiek wiedza wystarczy do zapewnienia właściwej wydajności. Co na pewno warto zrobić? 1) warto założyć indeksy 2) warto niektóre zapytania przeanalizować 3) warto usunąć testy poprawności danych - wiadomo kosztem jakiego ryzyka 4) warto kupić sobie kontroler z bateryjnym podtrzymywaniem bufora zapisu 5) warto kupić dużo ram na bufor odczytu 6) warto kupić macierz ssd A jak to nadal nie pomaga, to co Ci da informacja, ze varchar jest tak czy inaczej zaimplementowany? > > Mam zasadnicze pytanie dla dalszej rozmowy, czy warto tak szczegółową > > wiedzę posiadać, czy lepiej traktować indeks, pole, tabelę, klucz, jako > > (prawie) czarne skrzynki? > > Odpowiedź jest taka sama jak poprzednia. Moim zdaniem poprzednia odpowiedź nie ma praktycznego sensu. Drobiazgami raczej nie podniesiesz istotnie wydajności bazy. > >> Tu od razu zastrzegam, że piszę z pamięci, a od pewnego czasu nie siedzę > >> zbyt intensywnie w bazach danych, więc mogło mi się już coś zatrzeć w > >> pamięci. Co z kolei jest widomym powodem, że pora sobie trochę te > >> wiadomości odświeżyć, więc być może wrzucę coś na bloga w tym temacie > >> (gdybyż jeszcze ten czas). > > Właśnie, gdy traktujemy bazę jako zestaw czarnych skrzynek, to czasu > > mamy więcej. > > Zależy który czas jest dla nas cenniejszy: nasz czy wszystkich > użytkowników naszego - być może zbyt wolnego - oprogramowania. Tak, ale ile czasu użytkowników zaoszczędzą te duperele, w porównaniu z oszczędnością jaką może dać powyższe 6 punktów? Wyciśniesz chociaż 5% dzięki temu? > > >> Zapewne w większości przypadków nie będzie to szczególnie kosztowne. A > >> po to mamy tuning bazy danych, aby kiedy już koszt stanie się uciążliwy, > >> po prostu ten tuning przeprowadzić. > > Mogę poprosić o jakiś przykład, gdy to będzie bardzo kosztowne? > > Int64 w stosunku do Int32, jeżeli zakres wartości nie ma szans sięgnąć > max tego drugiego, jest marnowaniem pamięci potrzebnej na przetwarzanie > złączeń. Dla Int32 da się załadować więcej tych wartości do cache niż > przy Int64. Ale rozmawialiśmy int64 vs kod paskowy, a nie int64 vs int32. A co do int32, to dzisiejsze kompy są szybkie, int32 naprawdę łatwo wyczerpać. > > Nie wiem co to jest indeks integralny z danymi. > > To jest właśnie indeks klastrowy - dane w tabeli są układane w > kolejności odpowiadającej regule indeksu (zgodnie z zacytowanym tekstem). Rozumiem, że taka jest Twoja definicja, a w bazach danych może być różnie. > >> są przechowywane na stronach. Bywa (znów piszę z pamięci, ale > >> chyba tak właśnie to działa), że zamiast relokować wiersze lepiej jest > >> zostawić część na obecnej stronie, a te wstawiane wrzucić na nową i > >> umieścić ją tuż za tamtą w logicznym łańcuchu stron. > > Zależy dlaczego lepiej. Dla przeglądania sekwencyjnego gorzej, ponieważ > > trzeba więcej danych przejrzeć. Dla wyszukiwania losowego chyba lepiej, > > bo wystarczy jedną stronę wycztać. Dla wstawiania może być lepiej, > > ale pod warunkiem, że zostawi się dużo wolnego miejsca. > > Wiesz, projektanci baz wybrali nie bez powodu takie "poszatkowane" > rozwiązanie. Zapewne statystycznie jest ono najlepsze. Zapewne. Rzadko kto ma bazę, która jest modyfikowana raz na miliardy odczytów. > >> Układ fizyczny tych > >> stron będzie inny niż logiczny, więc mogą być od siebie oddalone w > >> rzeczywistym pliku bazy o spory odstęp. Więc jest defragmentacja. > > Ja chyba w ogóle nie rozumiem jak używasz określenia indeks :) > > Z tego co piszesz, to po prostu kolejne ( w sensie sortowania ) dane nie > > są pod kolejnymi adresami (w sensie sekwencyjnego odczytu). > > Nie mam tyle czasu, aby to dogłębnie wytłumaczyć, a rzecz sprowadza się > do sposobu reprezentowania danych w samym pliku bazy. Tutaj odsyłam do > pozycji "Microsoft SQL Server 2008 od środka: Zapytania w języku T-SQL" > (przedostatnia pozycja działu Literatura na moim blogu). Z tym, że nie > wiem czy taka wiedza jest Ci potrzebna, jeżeli używasz Posgresa. Mam książkę postgres wysokowydajny. Przeczytałem tylko początkowe rozdziały. Raczej piszą o detalach (jak tuning algorytmu windy, czy dobór systemu pliku) albo o sprawach oczywistych (jak przydział pamięci na bufor plików w systemie albo w bazie - żeby nie dublować). Nie mam czasu aby doczytać tę pozycję do końca. > >> Otóż strony pozostają niepełne właśnie ze względu na to, że może zajść > >> potrzeba dodania pomiędzy znajdujące się na nich wiersze tego, który > >> zgodnie z porządkiem powinien być tam umieszczony. I wówczas gdy strona > >> nie jest w całości zapełniona, można taki wiersz dorzucić w owo puste > >> miejsce (lub relokować w ramach strony istniejące tam wiersze, by > >> wstawić ów nowy pomiędzy nie). SQL Serwer ma zdefiniowane jak tą pustą > >> przestrzenią zarządzać, więc czasem dokłada do niej wiersze, a czasem z > >> tego rezygnuje, jeśli z oszacowań wychodzi mu, że lepiej wstawić > >> pomiędzy strony kolejną, a tamto puste miejsce pozostawić na przyszłe > >> potrzeby. > > To pewnie jest dobry kompromis pomiędzy wydajnym odczytem sekwencyjnym, a > > wydajnymi modyfikacjami. Czy postgres też ma coś takiego? > > Nie wiem, nie znam tej bazy, musiałbyś sprawdzić, wydaje mi się, że to > baza w której tabele są w plikach, więc tutaj stronicowanie tabeli może > być inaczej zrealizowane (może nie opłaca się jej stronicować?) Też nie wiem, dla mnie to raczej czarne skrzynki. Gdy czasami próbuję coś zoptymalizować, to mam bardzo dziwne zachowania. Np. 60 zapytań trwa w w granicach 1.5-2 sekundy, a zapytanie 61 trwa 120 sekund. Zapytania są takie same, różnią się tylko offsetem po którym leżą dane. Rozumiem, że z wydłużeniem offsetu rośnie czas, ale nagły skok z 2 sekund do 120? Nawet nie wiem jak zabrać się za optymalizację tego, ani co wpisać w google. Pozdrawiam
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: irq
Date: Sat, 21 Feb 2015 23:27
Date: Sat, 21 Feb 2015 23:27
13 lines
2856 bytes
2856 bytes
W dniu sobota, 21 lutego 2015 20:22:19 UTC+1 użytkownik M.M. napisał: > Gdy czasami próbuję > coś zoptymalizować, to mam bardzo dziwne zachowania. Np. 60 zapytań > trwa w w granicach 1.5-2 sekundy, a zapytanie 61 trwa 120 sekund. > Zapytania są takie same, różnią się tylko offsetem po którym leżą > dane. Rozumiem, że z wydłużeniem offsetu rośnie czas, ale nagły skok z > 2 sekund do 120? Nawet nie wiem jak zabrać się za optymalizację > tego, ani co wpisać w google. > auto_explain ? http://www.postgresql.org/docs/current/static/auto-explain.html
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: artiun
Date: Sun, 22 Feb 2015 07:18
Date: Sun, 22 Feb 2015 07:18
111 lines
7418 bytes
7418 bytes
W dniu 2015-02-12 o 20:04, PaSkol pisze: > W dniu 2015-02-12 o 10:34, nkab@toya.net.pl pisze: >> Nie, id to sztuczny numer rekordu a indeks w pliku indeksowym >> to fizyczny adres na dysku. Dyskowy system operacyjny (DOS) wie, >> którą głowicę czytającą dysk uruchomić, na którym krążku magnetycznym, >> na który sektor się ma ustawić głowica... > > Na dysku? Już nawet w DOS-ie w pewnym momencie przestało to być prawdą, bo > dyski fizycznie były inaczej skonstruowane, a BIOS dostawał ich wirtualną > adresację (bo nie był w stanie zaadresować takiej ilości sektorów). Więc > choćby z tego powodu to nieprawda. Bzdura. Jeśli nie, czekam na dowód. Dyski rosły, a DOS miał ograniczenia, powodem była krótkowzroczność, nie niemożność. > > A jeśli już mówić o adresie, to nawet w DBF był to numer rekordu (lub > przesunięcie w ramach danej tabeli - pliku DBF), a nie adres na dysku. Swiat się zmienia, adres łatwo zmienić. Piszecie sobie coś... Czy to będzie miało odbicie w realnym świecie? To są dywagacje, udawanie czegoś czego nie widzicie. W innym wypadku nie mielibyście czasu na to, a weekend i tak by wam tego spokoju nie zapewnił. >> Indeksy są dla zawodowców amatorom wystarczy order by. Delikatny będę: Pojebało Cię? > > Doznałem olśnienia - już wiem czemu jest tylu amatorów na świecie :>. > >> Programista baz danych nie używa id, dla zawodowca id nie istnieje. >> Id jest dla administratora bazy danych, daje informacje, że były >> usuwane rekordy. > > Czy zawodowiec to taki gość, który doznaje zawodu, bo (jak rozpatruję sprawę > niżej) ktoś mu usunął rekord/wiersz/krotkę, a on biedny nie wie co teraz z > tym zrobić? > >> id nick >> -------------- >> 1 R.E.M.E.K >> 2 nkab >> 3 MM >> 4 MAREK >> >> i teraz ktoś bez twojej wiedzy usunął nkab, co zrobisz >> gdy w drugiej tabeli masz posty do tych ników połączonych >> poprzez id, no co zrobisz? > > Widzisz, takie rzeczy to były możliwe tylko w DBF i podobnych systemach > (gdzie pojęcie "system" jest nadużyciem w ich wypadku) obsługi baz danych. > Obecnie RDBMS (Relationa DataBase Managament System - czyli po naszemu > system zarządzania relacyjną bazą danych), jeśli tylko zdefiniuje mu się > więzy integralności danych nie dopuści do takiej sytuacji. Owe więzy > integralności (chyba od naszej ostatniej dyskusji nie doczytałeś nic na ten > temat) polegają w uproszczeniu na tym, że RDBMS posiada informację, że > rekordy z Twojej przykładowej tabeli są powiązane z inną tabelą i można je > usunąć jedynie wspólnie (jeden z przypadków) albo tzw. nadrzędny rekord > można usunąć jedynie, kiedy wszystkie powiązane z nim rekordy w dodatkowej > tabeli zostaną usunięte wcześniej (oczywiście nie dotyczy to tylko usuwania > i nie jest to jedyny sposób zapewnienia integralności, ale nie chcę > komplikować). > > > Napisz koledze M.M. o indeksach tak aby on to > > zrozumiał, żeby się połapał, że jak da: > > > > SELECT nick from t1 (bez indeksów) to da mu: > > > > R.E.M.E.K > > nkab > > MM > > MAREK > > > > a po dodaniu indeksu dla pola nick > > > > SELECT nick from t1 (z indeksami) da mu: > > > > MAREK > > nkab > > MM > > R.E.M.E.K > > > > i nie ma tu ORDER BY a jednak są w kolejności > > alfabetycznej > > To ja ostrożnie zapytam - w jakim RDBMS? Nie znam PostgreSQL, ale w dość > dobrze znanym mi MSSQL (lub SQL Server - jak kto woli) dodanie poleceniem > *insert* zgodnie z powyższą, przypadkową kolejnością może ale nie musi dla > *select* zwrócić w kolejności dodawania. Bo ta kolejność jest z definicji > przypadkowa, co obejmuje też przypadek, że będzie akurat kolejnością dodawania. > > Co więcej - w MSSQL nie trzeba podawać w zapytaniu indeksów, bo jeśli takowe > są założone dla tabeli, to optymalizator silnika serwera SQL je wykorzysta > (o ile będzie to opłacalne). Co więcej - potrafi też sobie poradzić z > wykorzystaniem indeksu złożonego (czyli p1 + p2) dla zaprezentowania w > kolejności zgodnej z jednym z pól wchodzących w jego skład. Pomijam już > fakt, że w jego przypadku indeksy tylko w jednym przypadku wskazują na > położenie wiersza, a w pozostałych, gdy jest indeks klastrowy na tabeli, > wskazują na wartość tego indeksu. > > Indeksy to już od dłuższego czasu nie pliki (bo baza danych jest plikiem). > To po prostu zbiory danych (danymi są indeksy), zazwyczaj (zależy do RDBMS) > niezajmujące spójnego obszaru. > Nie ma sensu. Zostaw - jeśli ktoś nie umie dodać 2 i dwa to niech będzie order by i filtry. Inna rzecz: ktoś kiedyś mnie zapytał -"a jak to robi google" - o wyszukiwanie chodziło. Zabili mnie tym pytaniem :) Odpowiedziałem: mają kasę, której wy nie macie - było po rozmowie. -- Artur 0 weeks 0 days 2 hours 54 minutes 20 seconds and 92 milliseconds. "pl.comp.bazy-danych"
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Sun, 22 Feb 2015 08:15
Date: Sun, 22 Feb 2015 08:15
38 lines
3901 bytes
3901 bytes
W dniu 2015-02-22 o 08:18, artiun pisze: >> Na dysku? Już nawet w DOS-ie w pewnym momencie przestało to być >> prawdą, bo >> dyski fizycznie były inaczej skonstruowane, a BIOS dostawał ich wirtualną >> adresację (bo nie był w stanie zaadresować takiej ilości sektorów). Więc >> choćby z tego powodu to nieprawda. > Bzdura. Jeśli nie, czekam na dowód. Dyski rosły, a DOS miał > ograniczenia, powodem była krótkowzroczność, nie niemożność. http://en.wikipedia.org/wiki/Cylinder-head-sector http://www.tldp.org/HOWTO/Large-Disk-HOWTO-4.html W pewnym momencie dyski nadal posiadały 4 głowice odczytujące (dwa talerze), a w BIOS było wpisane że jest ich 16. I system operacyjny przez przerwanie BIOS (13h) chcąc się dostać do konkretnego miejsca na dysku adresował je przez jedną z 16 głowic. W tym drugim linku masz pierwszą pozycję, która tłumaczy, jaki był maksymalny rozmiar dysku, który potrafił zaadresować taki BIOS, dlatego jeśli rozmiar nie dał się zaadresować na 4 głowicach, trzeba było "kombinować" właśnie poprzez "udawanie", że głowic jest więcej niż w rzeczywistości. >> A jeśli już mówić o adresie, to nawet w DBF był to numer rekordu (lub >> przesunięcie w ramach danej tabeli - pliku DBF), a nie adres na dysku. > Swiat się zmienia, adres łatwo zmienić. Piszecie sobie coś... Czy to > będzie miało odbicie w realnym świecie? To są dywagacje, udawanie czegoś > czego nie widzicie. W innym wypadku nie mielibyście czasu na to, a > weekend i tak by wam tego spokoju nie zapewnił. > >>> Indeksy są dla zawodowców amatorom wystarczy order by. > Delikatny będę: Pojebało Cię? Mnie? Bo jeśli odpowiadasz nkabowi, to kiepskie sobie wybrałeś miejsce - przecież nie będzie czytał odpowiedzi na mój post, aby się zorientować, że ktoś tu z nim uderza w polemikę. -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Sun, 22 Feb 2015 09:10
Date: Sun, 22 Feb 2015 09:10
141 lines
8923 bytes
8923 bytes
W dniu 2015-02-21 o 20:22, M.M. pisze: > Wybacz, ale nadal nie rozumiem, co ma wspólnego przytoczony przeze mnie > tekst z szybszymi złączeniami. Uporządkowanie danych pomaga wtedy, gdy > po odczycie rekordu o numerze (fizycznym) N, jest duże prawdopodobieństwo > odczytania rekordu o numerze N+1. W jakich złączeniach tak jest? Dla mnie szybkość złączenia, to szybkość z jaką otrzymam dane, które to złączenie mi zapewnia. A wyjaśniłem wszak dlaczego dane w przypadku indeksu klastrowego uzyskuje się szybciej. >> Ale tu jest mowa o konkretnym indeksie _klastrowym_ i to w kontekście >> MSSQL-a (ten cytat, który przytaczałeś dotyczy właśnie jego). > Nie rozumiem. Dlaczego MSSQL miałby przeglądać maksymalnie 100 rekordów > gdy id jest równe 100, w przypadku clustered? Sorry, ale nic kompletnie > nie kumam. Ustawia się na początku indeksu (pomińmy rozważania na poziomie b-drzewa, traktujmy indeks logicznie). Pobiera pierwsza wartość i porównuje z oczekiwaną. Jeśli jest to wartość 1 to musi przejść przez kolejne 100 rekordów (bo dane są ułożone w kolejności), aby otrzymać ten, którego Id = 100. Prościej już nie mogę tego wytłumaczyć. W MSSQL silnik bazy danych nie wylicza sobie bezpośrednio pozycji rekordu, on potrafi przeskakiwać kolejne rekordy (bo wie jaki jest rozmiar każdego z nich z osobna), aby dotrzeć do oczekiwanej wartości. Nie wylicza też z powodów, o których już sam pisałeś - mogą być dziury w wartościach klucza. Nie ma wyjścia - trzeba przeszukać całość, ale można tylko wybrane fragmenty. Pod adresem, z którego przytoczono fragment o indeksach klastrowych jest podany przykład takiej struktury w świecie rzeczywistym: to książka telefoniczna, w której abonenci są ułożeni alfabetycznie. Odszukanie konkretnego nazwiska polega zatem na przejrzeniu kilku stron poczynając od tej, na której zaczynają się nazwiska na daną literę. >> Jeśli ma _stałą_ długość to nie jest varcharem - na tym polega >> właściwość varchara, że nie zajmuje z góry ustalonego miejsca. > varchar może mieć dowolną długość, ale implementacja varchara może > być taka, że pole ma stałą długość. Po prostu string może być w > innym pliku, a w varchar może być odnośnik do niego. No to ja RDBMS, który w taki sposób (i tak rezerwując określoną długość) implementuje varchar, bym nie używał. A to że varchar może być w oddzielnym pliku niczego nie zmienia. W tym oddzielnym pliku (w MSSQL oddzielnym obszarze danych - LOB) on także będzie mieć tylko taką długość jak trzeba. > Właśnie nie jestem przekonany czy jakakolwiek wiedza wystarczy do > zapewnienia właściwej wydajności. Co na pewno warto zrobić? Oczywiście, że wystarczy. Świadczy o tym choćby fakt, że są ludzie całkiem dobrze żyjący ze świadczenia usług optymalizacji (strojenia) baz danych. Bo okazuje się, że niefrasobliwość programistów prowadzi w konsekwencji do eskalacji potrzeb sprzętowych. > 1) warto założyć indeksy Owszem ale nie we wszystkich przypadkach, a w dodatku ze względu na różność indeksów czasem warto założyć taki konkretny (np. zawierający dodatkowo daną, która jest wyszukiwana, aby nie trzeba było po nią sięgać do tabeli). > 2) warto niektóre zapytania przeanalizować No i? Jak potem bez odpowiedniej wiedzy dojdziesz, dlaczego działają raz wolno a raz szybko (jak pytasz poniżej)? > 3) warto usunąć testy poprawności danych - wiadomo kosztem jakiego ryzyka Owszem można nie testować danych na poziomie bazy (bo można, a czasami wręcz lepiej zrobić to wcześniej). > 4) warto kupić sobie kontroler z bateryjnym podtrzymywaniem bufora zapisu A to akurat z wydajnością niewiele ma wspólnego > 5) warto kupić dużo ram na bufor odczytu > 6) warto kupić macierz ssd Jak pisałem - w końcu może się okazać, że to za mało. Poza tym - chmura. > A jak to nadal nie pomaga, to co Ci da informacja, ze varchar jest tak > czy inaczej zaimplementowany? A po co w ogóle wprowadzono varchar? Gdyby nie było potrzebne, to by go po prostu nie było. Okazało się jednak, że jest wręcz nieodzowne. Zatem varchar, który varcharem nie jest to jak mieć randkę z transwestytą, choć zamierzaliśmy z kobietą. >>> Mam zasadnicze pytanie dla dalszej rozmowy, czy warto tak szczegółową >>> wiedzę posiadać, czy lepiej traktować indeks, pole, tabelę, klucz, jako >>> (prawie) czarne skrzynki? >> >> Odpowiedź jest taka sama jak poprzednia. > Moim zdaniem poprzednia odpowiedź nie ma praktycznego sensu. Drobiazgami > raczej nie podniesiesz istotnie wydajności bazy. Nie mam na myśli podniesienie, mam na myśli obniżenie. Po prostu już na wstępie masz bazę, która wymaga większych zasobów niż to konieczne. >> Zależy który czas jest dla nas cenniejszy: nasz czy wszystkich >> użytkowników naszego - być może zbyt wolnego - oprogramowania. > Tak, ale ile czasu użytkowników zaoszczędzą te duperele, w porównaniu z > oszczędnością jaką może dać powyższe 6 punktów? Wyciśniesz chociaż 5% > dzięki temu? Jak napisałem - chodzi o to, aby nie doprowadzić do całkowicie niewydajnej bazy danych (gdzie np. 50% obszaru zajmują puste miejsca, a indeksy są dublowane). >>>> Zapewne w większości przypadków nie będzie to szczególnie kosztowne. A >>>> po to mamy tuning bazy danych, aby kiedy już koszt stanie się uciążliwy, >>>> po prostu ten tuning przeprowadzić. >>> Mogę poprosić o jakiś przykład, gdy to będzie bardzo kosztowne? >> >> Int64 w stosunku do Int32, jeżeli zakres wartości nie ma szans sięgnąć >> max tego drugiego, jest marnowaniem pamięci potrzebnej na przetwarzanie >> złączeń. Dla Int32 da się załadować więcej tych wartości do cache niż >> przy Int64. > Ale rozmawialiśmy int64 vs kod paskowy, a nie int64 vs int32. A co do > int32, to dzisiejsze kompy są szybkie, int32 naprawdę łatwo wyczerpać. Nie odebrałem tego w ten sposób. Czyli chciałbym przechowywać kod paskowy na Int64? A co z zerami wiodącymi w takim kodzie. Kod paskowy przechowuje się jako tekst - niestety. Stąd zresztą podałem go w przykładzie. Nie bardzo też widzę związek z szybkością komputerów i wyczerpaniem Int32. To przecież zależy od rodzaju danych (ich zakresu). > >>> Nie wiem co to jest indeks integralny z danymi. >> >> To jest właśnie indeks klastrowy - dane w tabeli są układane w >> kolejności odpowiadającej regule indeksu (zgodnie z zacytowanym tekstem). > Rozumiem, że taka jest Twoja definicja, a w bazach danych może być > różnie. Nie - taka jest definicja indeksu klastrowego. Zajrzyj pod link, który sam odnalazłeś. Skojarz go z książką telefoniczną. -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: artiun
Date: Sun, 22 Feb 2015 11:05
Date: Sun, 22 Feb 2015 11:05
59 lines
5789 bytes
5789 bytes
W dniu 2015-02-22 o 09:15, PaSkol pisze: > W dniu 2015-02-22 o 08:18, artiun pisze: >>> Na dysku? Już nawet w DOS-ie w pewnym momencie przestało to być >>> prawdą, bo >>> dyski fizycznie były inaczej skonstruowane, a BIOS dostawał ich wirtualną >>> adresację (bo nie był w stanie zaadresować takiej ilości sektorów). Więc >>> choćby z tego powodu to nieprawda. >> Bzdura. Jeśli nie, czekam na dowód. Dyski rosły, a DOS miał >> ograniczenia, powodem była krótkowzroczność, nie niemożność. > > http://en.wikipedia.org/wiki/Cylinder-head-sector > http://www.tldp.org/HOWTO/Large-Disk-HOWTO-4.html > > W pewnym momencie dyski nadal posiadały 4 głowice odczytujące (dwa talerze), > a w BIOS było wpisane że jest ich 16. I system operacyjny przez przerwanie > BIOS (13h) chcąc się dostać do konkretnego miejsca na dysku adresował je > przez jedną z 16 głowic. W tym drugim linku masz pierwszą pozycję, która > tłumaczy, jaki był maksymalny rozmiar dysku, który potrafił zaadresować taki > BIOS, dlatego jeśli rozmiar nie dał się zaadresować na 4 głowicach, trzeba > było "kombinować" właśnie poprzez "udawanie", że głowic jest więcej niż w > rzeczywistości. > Jeśli tak, o kłócił się nie będę. Mam co prawda kilka rozebranych na półce. Chyba jest nawet Maxtor 512MB. Nie miał 16 talerzy (inne też). Zresztą wszystkie miały po 2 głowice (mogę, bo mam dołączyć zdjęcia :) ). Jak to jest robione sprzętowo nie obchodziło mnie. Stare dyski miały zworki - by puszczać je powyżej 2GB (mogę się mylić jeśli idzie o GB). Tak czy inaczej, zaczynając studia w Opolu miałem okazję zobaczyć Odrę, kajdanki i aluminiowe pulpity. Na uczelni dostępne były wtedy 2xAT i 6xXT. Jak kończyłem to już wszystko stało na 386 i Pentium. A RAm był liczony w MB :) Z kumplem (par pokoi dalej) graliśmy w Doom'a - do czasu, "Opole - piastonalia", jakieć coś powiesiło sie na kablu/przewodzie (urwał). Śmisznie było (on kolorowy monitor, ja odcienie szarości, dostał czasem w plecy :)) >>> A jeśli już mówić o adresie, to nawet w DBF był to numer rekordu (lub >>> przesunięcie w ramach danej tabeli - pliku DBF), a nie adres na dysku. >> Swiat się zmienia, adres łatwo zmienić. Piszecie sobie coś... Czy to >> będzie miało odbicie w realnym świecie? To są dywagacje, udawanie czegoś >> czego nie widzicie. W innym wypadku nie mielibyście czasu na to, a >> weekend i tak by wam tego spokoju nie zapewnił. >> >>>> Indeksy są dla zawodowców amatorom wystarczy order by. >> Delikatny będę: Pojebało Cię? > > Mnie? Bo jeśli odpowiadasz nkabowi, to kiepskie sobie wybrałeś miejsce - > przecież nie będzie czytał odpowiedzi na mój post, aby się zorientować, że > ktoś tu z nim uderza w polemikę. > To przepraszam. Jeśli rozmawiamy o różnicach między ORDER BY a indeksem to nie ma znaczenia z pkt usera, czy to będzie osobny plik (jak np w dbf), czy zawarty w bazie jak np (sqlite - tylko przykład bo firebird tak roboi). Z punktu widzenia - nawet dla admina bazy - nie ma to znaczenia jak dana baza jest skonstruowana. :) o swoich animozjach do MS SQL'a nie będę pisał, co rusz musiałem go ogarniać. -- Artur 0 weeks 0 days 6 hours 33 minutes 46 seconds and 925 milliseconds. "pl.comp.bazy-danych"
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: M.M.
Date: Sun, 22 Feb 2015 12:49
Date: Sun, 22 Feb 2015 12:49
267 lines
14374 bytes
14374 bytes
On Sunday, February 22, 2015 at 10:10:11 AM UTC+1, PaSkol wrote: > W dniu 2015-02-21 o 20:22, M.M. pisze: > > Wybacz, ale nadal nie rozumiem, co ma wspólnego przytoczony przeze mnie > > tekst z szybszymi złączeniami. Uporządkowanie danych pomaga wtedy, gdy > > po odczycie rekordu o numerze (fizycznym) N, jest duże prawdopodobieństwo > > odczytania rekordu o numerze N+1. W jakich złączeniach tak jest? > > Dla mnie szybkość złączenia, to szybkość z jaką otrzymam dane, które to > złączenie mi zapewnia. A wyjaśniłem wszak dlaczego dane w przypadku > indeksu klastrowego uzyskuje się szybciej. Myślę że się mylisz, myślę że jest podobnie. Zakładam że autorzy silników baz danych nie dali dupy. Mamy tabelę która ma powiedzmy 10^9 rekordów. Chcemy rekord: select * from tabela where pole=coś. Stosujemy b-tree do ineksowania. Root mamy w RAM - więc koszt odpada. Breanchfactor przy stronie 4kb jaki może być? Może być 500? Mamy 500^x = 10^9. Przy tysiącu byłoby x=3. Czyli przy 500 spodziewamy się jakiś 4-5 dostępów do dysku. Stosujemy clustered. Bierzemy: start = select cos from tabela order by cos limit 1 i end = select cos from tabela order by desc cos limit 1 Ze start i end liczymy prostą ax+b. Szykamy punktu podziału... Mamy złożoność \Theta(\log \log n), dla 10^9 wychodzi 4,9019458471 Widzisz pewne podobieństwo? A jeśli w danych nie ma rozkładu jednostajnego to co? To dobra baza danych powinna się zorientować, ze trzeba stosować zwykłe wyszukiwanie binarne. Więc wychodzi = LOG(10^9;2) = 29,897352854 Czyli wolniej. Więc baza powinna założyć zwykłe b-tree pomimo clustered. Chętnie dowiem się co pomylilem w powyższym rozumowaniu. > >> Ale tu jest mowa o konkretnym indeksie _klastrowym_ i to w kontekście > >> MSSQL-a (ten cytat, który przytaczałeś dotyczy właśnie jego). > > Nie rozumiem. Dlaczego MSSQL miałby przeglądać maksymalnie 100 rekordów > > gdy id jest równe 100, w przypadku clustered? Sorry, ale nic kompletnie > > nie kumam. > > Ustawia się na początku indeksu (pomińmy rozważania na poziomie > b-drzewa, traktujmy indeks logicznie). Nie wiem na czym polega traktowanie indesku logicznie. > Pobiera pierwsza wartość i > porównuje z oczekiwaną. Jeśli jest to wartość 1 to musi przejść przez > kolejne 100 rekordów (bo dane są ułożone w kolejności), Jeśli ma indeks, to nie musi. Często trafia w rekord z tą stówą już po 3-5 'dostępach do dysku'. Piszę w cudzyslowie, bo może być wszystko w RAM. > aby otrzymać > ten, którego Id = 100. Prościej już nie mogę tego wytłumaczyć. Ale nie wiem po co mi to tłumaczysz, jeśli można to zrobić szybciej - z indeksem. > W MSSQL > silnik bazy danych nie wylicza sobie bezpośrednio pozycji rekordu, on > potrafi przeskakiwać kolejne rekordy (bo wie jaki jest rozmiar każdego z > nich z osobna), aby dotrzeć do oczekiwanej wartości. Nie wylicza też z > powodów, o których już sam pisałeś - mogą być dziury w wartościach > klucza. Nie ma wyjścia - trzeba przeszukać całość, ale można tylko > wybrane fragmenty. Chyba piszesz o dwoch rzeczach, a ja nie chwytam kiedy o której. Raz piszesz że przeskakuje, drugi raz że musi szykać calość. Sorrki, nie kumam. > Pod adresem, z którego przytoczono fragment o indeksach klastrowych jest > podany przykład takiej struktury w świecie rzeczywistym: to książka > telefoniczna, w której abonenci są ułożeni alfabetycznie. Odszukanie > konkretnego nazwiska polega zatem na przejrzeniu kilku stron poczynając > od tej, na której zaczynają się nazwiska na daną literę. Ale można pszeszukiwać inaczej, zwłaszcza gdy szuka algorytm na kompie, a nie czlowiek w książce. > > >> Jeśli ma _stałą_ długość to nie jest varcharem - na tym polega > >> właściwość varchara, że nie zajmuje z góry ustalonego miejsca. > > varchar może mieć dowolną długość, ale implementacja varchara może > > być taka, że pole ma stałą długość. Po prostu string może być w > > innym pliku, a w varchar może być odnośnik do niego. > > No to ja RDBMS, który w taki sposób (i tak rezerwując określoną długość) > implementuje varchar, bym nie używał. A to że varchar może być w > oddzielnym pliku niczego nie zmienia. W tym oddzielnym pliku (w MSSQL > oddzielnym obszarze danych - LOB) on także będzie mieć tylko taką > długość jak trzeba. Ja w C++ takie sztuczki używałem. Miałem pliki o stałej długości rekordu. W rekordzie czasami używalem wskaźnika do danych w innym pliku. Biło to wydajnościowo na głowę bazy danych, ale zabierało masę czasu przy projektowaniu i implementacji. Teraz czasy się zmieniły, można kupić tani komputer który ma 1TB RAM i dwa procesory 8 rdzeniowe. > > Właśnie nie jestem przekonany czy jakakolwiek wiedza wystarczy do > > zapewnienia właściwej wydajności. Co na pewno warto zrobić? > > Oczywiście, że wystarczy. Świadczy o tym choćby fakt, że są ludzie > całkiem dobrze żyjący ze świadczenia usług optymalizacji (strojenia) baz > danych. Bo okazuje się, że niefrasobliwość programistów prowadzi w > konsekwencji do eskalacji potrzeb sprzętowych. Mógłby odpowiedzieć, że są ludzie calkiem dobrze żyjący ze sprzedaży systemów na grę w lotto. Ale nie odpowiem tak, odpowiem, że zaciekawiasz mnie. Ja nie jestem specem od baz danych. Nagle moja baza danych działa zbyt wolno. Więc po kolei: 1) zakładam indeksy 2) dokupuję ram i cała baza mieści się w buforze 3) dokupuję kontroler z bateryjnym podtrzymywaniem bufora zapisu 4) wyłączam więzy integralności 5) lekko denormalizuję bazę 6) robię kilka przebórek niektórych zapytań sql 7) kupuję dysk ssd na pci i tam trzymam krytyczne dla wydajności tabele 8) robię replikację i powielam wszystko na kilka maszyn Co więcej (i rzecz jasna taniej) zrobi osoba dobrze żyjąca ze strojenia baz danych? > > 1) warto założyć indeksy > > Owszem ale nie we wszystkich przypadkach, a w dodatku ze względu na > różność indeksów czasem warto założyć taki konkretny (np. zawierający > dodatkowo daną, która jest wyszukiwana, aby nie trzeba było po nią > sięgać do tabeli). Czy móglbyś jakoś wykazać, ze to jest duża optymalizacja, a nie uganianie się za pojedynczymi milisekundami? > > 2) warto niektóre zapytania przeanalizować > > No i? Jak potem bez odpowiedniej wiedzy dojdziesz, dlaczego działają raz > wolno a raz szybko (jak pytasz poniżej)? Ja jak dojdę? Metodą intuicji, prób i błędów. Zwykle robię coś na 2-3 sposoby i wybieram ten który najszybciej działa. Jeśli cała baza jest w ram, jeśli zapytanie tylko odczytuje dane, to co ekspert zrobi lepiej? Ma lepiej wypracowaną intuicję i sprawdzi jeszcze 2 sposoby? Nie jestem do końca przekonany, możesz podać jakiś przykład dwóch rozwiązań? Jedno rozwiązanie typowe dla przeciętnego programisty, a drugie od eksperta? > > 3) warto usunąć testy poprawności danych - wiadomo kosztem jakiego ryzyka > > Owszem można nie testować danych na poziomie bazy (bo można, a czasami > wręcz lepiej zrobić to wcześniej). Jeśli testujesz klucze obce to i tak i tak musi być dostęp do danych. No chyba że w programie masz kopię kluczy. > > 4) warto kupić sobie kontroler z bateryjnym podtrzymywaniem bufora zapisu > > A to akurat z wydajnością niewiele ma wspólnego Jak dasz buforowany zapis bez podtrzymywania bateryjnego, to w wyniku awarii zasilania co będzie? > > 5) warto kupić dużo ram na bufor odczytu > > 6) warto kupić macierz ssd > > Jak pisałem - w końcu może się okazać, że to za mało. Poza tym - chmura. Chmura jest cholernie droga, poza sytuacjami, gdy na krótką chwilę potrzebujesz wiele sprzętu, a potem na długi okres prawie całkowicie go zwalniasz. > > A jak to nadal nie pomaga, to co Ci da informacja, ze varchar jest tak > > czy inaczej zaimplementowany? > > A po co w ogóle wprowadzono varchar? Gdyby nie było potrzebne, to by go > po prostu nie było. Okazało się jednak, że jest wręcz nieodzowne. Zatem > varchar, który varcharem nie jest to jak mieć randkę z transwestytą, > choć zamierzaliśmy z kobietą. Ale nie piszemy o przydatności w ogóle varchar, tylko o optymalizacji takich drobiazgów jak varchar. > >>> Mam zasadnicze pytanie dla dalszej rozmowy, czy warto tak szczegółową > >>> wiedzę posiadać, czy lepiej traktować indeks, pole, tabelę, klucz, jako > >>> (prawie) czarne skrzynki? > >> > >> Odpowiedź jest taka sama jak poprzednia. > > Moim zdaniem poprzednia odpowiedź nie ma praktycznego sensu. Drobiazgami > > raczej nie podniesiesz istotnie wydajności bazy. > > Nie mam na myśli podniesienie, mam na myśli obniżenie. Po prostu już na > wstępie masz bazę, która wymaga większych zasobów niż to konieczne. I z powodu varchar nie podniesiesz istotnie wydajności tamtymi 6 punktami? Chciałbym to zobaczyć. > >> Zależy który czas jest dla nas cenniejszy: nasz czy wszystkich > >> użytkowników naszego - być może zbyt wolnego - oprogramowania. > > Tak, ale ile czasu użytkowników zaoszczędzą te duperele, w porównaniu z > > oszczędnością jaką może dać powyższe 6 punktów? Wyciśniesz chociaż 5% > > dzięki temu? > > Jak napisałem - chodzi o to, aby nie doprowadzić do całkowicie > niewydajnej bazy danych (gdzie np. 50% obszaru zajmują puste miejsca, a > indeksy są dublowane). Nie wiem czy pustym obszarem możemy dziś się nadal martwić. Dziś w kiosku można kupić komputer który ma 1TB RAM i 16 fizycznych rdzeni. A dublowane indeksy, to raczej przedszkole, do tego eksperta chyba nie trzeba? > >>>> Zapewne w większości przypadków nie będzie to szczególnie kosztowne. A > >>>> po to mamy tuning bazy danych, aby kiedy już koszt stanie się uciążliwy, > >>>> po prostu ten tuning przeprowadzić. > >>> Mogę poprosić o jakiś przykład, gdy to będzie bardzo kosztowne? > >> > >> Int64 w stosunku do Int32, jeżeli zakres wartości nie ma szans sięgnąć > >> max tego drugiego, jest marnowaniem pamięci potrzebnej na przetwarzanie > >> złączeń. Dla Int32 da się załadować więcej tych wartości do cache niż > >> przy Int64. > > Ale rozmawialiśmy int64 vs kod paskowy, a nie int64 vs int32. A co do > > int32, to dzisiejsze kompy są szybkie, int32 naprawdę łatwo wyczerpać. > > Nie odebrałem tego w ten sposób. Czyli chciałbym przechowywać kod > paskowy na Int64? Rozmawialiśmy o indeksach naturalnycyh, jak pesel, kod paskowy, albo nazwa systematyczna gatunku. Odpowiedziałem, że pomimo istnienia indeksów naturalnych, używam klucza własnego int64. Może robię głupio, oczekiwałem krytyki w kierunku klucz narutalny vs sztuczny int64. > A co z zerami wiodącymi w takim kodzie. Kod paskowy > przechowuje się jako tekst - niestety. Stąd zresztą podałem go w > przykładzie. Więc może rozwiązanie: 'zawsze klucz sztuczny na int32 lub int64' - jest jednak dobre? > Nie bardzo też widzę związek z szybkością komputerów i > wyczerpaniem Int32. To przecież zależy od rodzaju danych (ich zakresu). Na wolnych kompach trzeba dłużej liczyć, aby wyczerpać int32. > >>> Nie wiem co to jest indeks integralny z danymi. > >> > >> To jest właśnie indeks klastrowy - dane w tabeli są układane w > >> kolejności odpowiadającej regule indeksu (zgodnie z zacytowanym tekstem). > > Rozumiem, że taka jest Twoja definicja, a w bazach danych może być > > różnie. > > Nie - taka jest definicja indeksu klastrowego. Zajrzyj pod link, który > sam odnalazłeś. Skojarz go z książką telefoniczną. Ok. Generalnie posdumowując całość, chciałbym się naocznie przekonać o tym co piszesz. Tak w teoretycznej rozmowie jakoś nie mogę uwierzyć. Pozdrawiam
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: wloochacz
Date: Sun, 22 Feb 2015 16:34
Date: Sun, 22 Feb 2015 16:34
39 lines
3538 bytes
3538 bytes
W dniu 2015-02-22 o 08:18, artiun pisze: >> > > Nie ma sensu. Zostaw - jeśli ktoś nie umie dodać 2 i dwa to niech będzie > order by i filtry. Od tygodni to powtarzam :) > Inna rzecz: ktoś kiedyś mnie zapytał -"a jak to robi google" - o > wyszukiwanie chodziło. Zabili mnie tym pytaniem :) Dlaczego? Mam wrażenie, że podchodzisz do tematu zbyt technicznie. Innymi słowy - za dużo wiesz i za dużo widziałeś :) Daj to do zrobienia komuś, kto nie wie jak to działa w google (nawet w przybliżeniu) i pewnie to zrobi. Pewnie implementacja nie rzuci nikogo na kolana, ale będzie działać :) A przecież o to właśnie klientowi chodzi, prawda? Ma działać i ma w dupie jak to jest zrobione. > Odpowiedziałem: mają > kasę, której wy nie macie - było po rozmowie. Wyślij ich do mnie, zapewniam Cię że nie będzie po rozmowie ;-) Ja podchodzę do tego w inny sposób; po pierwsze, nigdy nie mówić NIE (da się), bo wszystko jest kwestią czasu, czytaj kasy. Poza tym zauważ (co prawda nie znam kontekstu, czyli co ta za system, jakie obciążenie ile i jakie dane, itd.), że zabawa z LIKE + CONVERT/CAST da radę w zadowalającym czasie dla typowych zestawów (kilka do kilkudziesięciu tyś rekordów) danych w dzisiejszym systemie ERP. I da się to zaprogramować uniwersalnie. Sprawdziłem, zaimplementowałem i wdrożyłem - jest OK. Czasem wymagana jest preselekcja danych do wyszukiwania (aby odrzucić nieistotne rekordu, np. archiwalne), ale i tak jest lepiej niż standardowe formularze do wyszukiwania. -- wloochacz
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: artiun
Date: Sun, 22 Feb 2015 17:05
Date: Sun, 22 Feb 2015 17:05
45 lines
4364 bytes
4364 bytes
W dniu 2015-02-22 o 17:34, wloochacz pisze: > W dniu 2015-02-22 o 08:18, artiun pisze: >>> >> >> Nie ma sensu. Zostaw - jeśli ktoś nie umie dodać 2 i dwa to niech będzie >> order by i filtry. > Od tygodni to powtarzam :) > >> Inna rzecz: ktoś kiedyś mnie zapytał -"a jak to robi google" - o >> wyszukiwanie chodziło. Zabili mnie tym pytaniem :) > Dlaczego? > > Mam wrażenie, że podchodzisz do tematu zbyt technicznie. Innymi słowy - za > dużo wiesz i za dużo widziałeś :) > > Daj to do zrobienia komuś, kto nie wie jak to działa w google (nawet w > przybliżeniu) i pewnie to zrobi. > Pewnie implementacja nie rzuci nikogo na kolana, ale będzie działać :) > A przecież o to właśnie klientowi chodzi, prawda? Ma działać i ma w dupie > jak to jest zrobione. > >> Odpowiedziałem: mają >> kasę, której wy nie macie - było po rozmowie. > Wyślij ich do mnie, zapewniam Cię że nie będzie po rozmowie ;-) > Ja podchodzę do tego w inny sposób; po pierwsze, nigdy nie mówić NIE (da > się), bo wszystko jest kwestią czasu, czytaj kasy. > > Poza tym zauważ (co prawda nie znam kontekstu, czyli co ta za system, jakie > obciążenie ile i jakie dane, itd.), że zabawa z LIKE + CONVERT/CAST da radę > w zadowalającym czasie dla typowych zestawów (kilka do kilkudziesięciu tyś > rekordów) danych w dzisiejszym systemie ERP. I da się to zaprogramować > uniwersalnie. > > Sprawdziłem, zaimplementowałem i wdrożyłem - jest OK. Czasem wymagana jest > preselekcja danych do wyszukiwania (aby odrzucić nieistotne rekordu, np. > archiwalne), ale i tak jest lepiej niż standardowe formularze do wyszukiwania. > W końcu ktoś z sensem. Nie bacząc na siebie :), co sensu nie wyklucza - napisał. Sprzeczał bym się jedynie w kwestiach kasy (taki stereotyp - nie najważniejsza), dla mnie sumienie, sen. -- Artur 0 weeks 0 days 12 hours 50 minutes 9 seconds and 148 milliseconds. "pl.comp.bazy-danych"
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Sun, 22 Feb 2015 18:08
Date: Sun, 22 Feb 2015 18:08
192 lines
11777 bytes
11777 bytes
W dniu 2015-02-22 o 13:49, M.M. pisze: > On Sunday, February 22, 2015 at 10:10:11 AM UTC+1, PaSkol wrote: >> W dniu 2015-02-21 o 20:22, M.M. pisze: >>> Wybacz, ale nadal nie rozumiem, co ma wspólnego przytoczony przeze mnie >>> tekst z szybszymi złączeniami. Uporządkowanie danych pomaga wtedy, gdy >>> po odczycie rekordu o numerze (fizycznym) N, jest duże prawdopodobieństwo >>> odczytania rekordu o numerze N+1. W jakich złączeniach tak jest? >> >> Dla mnie szybkość złączenia, to szybkość z jaką otrzymam dane, które to >> złączenie mi zapewnia. A wyjaśniłem wszak dlaczego dane w przypadku >> indeksu klastrowego uzyskuje się szybciej. > Myślę że się mylisz, myślę że jest podobnie. Zakładam że autorzy silników > baz danych nie dali dupy. Mamy tabelę która ma powiedzmy 10^9 rekordów. > Chcemy rekord: > > select * from tabela where pole=coś. Ale podajesz zapytanie, w którym nie ma złączenia (join). Więc to zupełnie inna sytuacja. A nawet gdyby "pole" było kluczem i to w indeksie klastrowym, to - powtarzam do znudzenia - znajdując wartość klucza masz już załadowane także dane. To jak z książką telefoniczną, wybierasz strony na K i odnajdując Kowalskiego masz od razu jego numer telefonu, adres i co tam jeszcze w książce jest. Ale szukając - załóżmy (bo nie wiem czy tak jest w książce tel.) - po numerze korzystasz z indeksu na końcu książki telefonicznej, gdzie jest napisane, że kowalski jest na stronie 147 i tam sobie doszukujesz. Czyli w drugim przypadku najpierw indeks wg telefonów, a potem jeszcze przeniesienie się na konkretną stronę (w bazie będzie od razu do właściwego rekordu). Czyli tu są dwa działania, a tam jedno (bo ustawienie się na stronach od K to przejście przez stosowny poziom b-drzewa). > Czyli wolniej. Więc baza powinna założyć zwykłe b-tree pomimo > clustered. Clustered to jest b-tree (skoro każdy indeks to b-tree). Tylko że na jego końcu (liściach) są dane, a nie wskazania na dane. > Chętnie dowiem się co pomylilem w powyższym rozumowaniu. Jest ono nieistotne. Szukając po kluczu, który posłużył do ułożenia indeksu klastrowego, po prostu przeszukujesz też niejako dane. Proponuję zapoznać się najpierw co to dokładnie jest indeks klastrowy i skąd taka jego siła. >> Ustawia się na początku indeksu (pomińmy rozważania na poziomie >> b-drzewa, traktujmy indeks logicznie). > Nie wiem na czym polega traktowanie indesku logicznie. Logicznie tj. nie fizycznie. Logicznie czyli jako mechanizm, który w szybki sposób pozwala dotrzeć do szukanej wartości. >> Pobiera pierwsza wartość i >> porównuje z oczekiwaną. Jeśli jest to wartość 1 to musi przejść przez >> kolejne 100 rekordów (bo dane są ułożone w kolejności), > Jeśli ma indeks, to nie musi. Często trafia w rekord z tą stówą już > po 3-5 'dostępach do dysku'. Piszę w cudzyslowie, bo może być > wszystko w RAM. "Przejść" w sensie wyłuskania danych z indeksu klastrowego. Szukał setnego, musiał (po standardowym przejściu przez poziomy b-drzewa) pominąć te dane, które są wcześniej. >> W MSSQL >> silnik bazy danych nie wylicza sobie bezpośrednio pozycji rekordu, on >> potrafi przeskakiwać kolejne rekordy (bo wie jaki jest rozmiar każdego z >> nich z osobna), aby dotrzeć do oczekiwanej wartości. Nie wylicza też z >> powodów, o których już sam pisałeś - mogą być dziury w wartościach >> klucza. Nie ma wyjścia - trzeba przeszukać całość, ale można tylko >> wybrane fragmenty. > Chyba piszesz o dwoch rzeczach, a ja nie chwytam kiedy o której. Raz > piszesz że przeskakuje, drugi raz że musi szykać calość. Sorrki, nie > kumam. Bo po prostu nie rozumiesz co to jest indeks klastrowy. >> Pod adresem, z którego przytoczono fragment o indeksach klastrowych jest >> podany przykład takiej struktury w świecie rzeczywistym: to książka >> telefoniczna, w której abonenci są ułożeni alfabetycznie. Odszukanie >> konkretnego nazwiska polega zatem na przejrzeniu kilku stron poczynając >> od tej, na której zaczynają się nazwiska na daną literę. > Ale można pszeszukiwać inaczej, zwłaszcza gdy szuka algorytm na kompie, a > nie czlowiek w książce. Rzecz w tym, że algorytm szuka dokładnie tak samo jak człowiek. Dlatego właśnie podaje się analogię do książki telefonicznej. Książka _jest_ indeksem klastrowym. >> No i? Jak potem bez odpowiedniej wiedzy dojdziesz, dlaczego działają raz >> wolno a raz szybko (jak pytasz poniżej)? > Ja jak dojdę? Metodą intuicji, prób i błędów. Zwykle robię coś na 2-3 > sposoby i wybieram ten który najszybciej działa. Jeśli cała baza jest w > ram, jeśli zapytanie tylko odczytuje dane, to co ekspert zrobi > lepiej? Ma lepiej wypracowaną intuicję i sprawdzi jeszcze 2 sposoby? Ekspert nie będzie się opierał na intuicji. Sprawdzi na jakich danych operuje zapytanie. Jeśli okaże się, np. że zamiast varcharów stosowane są chary, ale i tak wszystkie wartości w nich umieszczane zajmują max 50% założonej dla nich przestrzeni, to sprawdzi co tak naprawdę ma być tam przechowywane, dostosuje rozmiar varchara i zamieni chary na varchary. Doprowadzi to do sytuacji, gdzie wczytanie 1000 rekordów nie będzie wymagało odczytu tylu stron co poprzednio (bo więcej rekordów zmieści się na stronie). To jest realne zmniejszenie ilości odczytów z dysku. To jest także lepsze wykorzystanie bufora na dane. >>> 3) warto usunąć testy poprawności danych - wiadomo kosztem jakiego ryzyka >> Owszem można nie testować danych na poziomie bazy (bo można, a czasami >> wręcz lepiej zrobić to wcześniej). > Jeśli testujesz klucze obce to i tak i tak musi być dostęp do danych. No > chyba że w programie masz kopię kluczy. Co to znaczy testować klucze obce? Czy o to nie dbają więzy integralności (constraints)? Ja pisząc o testowaniu miałem na myśli sprawdzane poprawności danych na poziomie aplikacji (nie wpisujemy reguł do bazy - choć ona to umożliwia). >>> 4) warto kupić sobie kontroler z bateryjnym podtrzymywaniem bufora zapisu >> >> A to akurat z wydajnością niewiele ma wspólnego > Jak dasz buforowany zapis bez podtrzymywania bateryjnego, to w wyniku > awarii zasilania co będzie? Buforowany zapis? Wg mnie to strzelanie bazie danych w kolano, bo uniemożliwiamy jej zapewnienie transakcyjności. To już lepsze są ssd i podtrzymywanie zasilania serwera. Chyba, że czegoś nie rozumiem. >>> A jak to nadal nie pomaga, to co Ci da informacja, ze varchar jest tak >>> czy inaczej zaimplementowany? >> >> A po co w ogóle wprowadzono varchar? Gdyby nie było potrzebne, to by go >> po prostu nie było. Okazało się jednak, że jest wręcz nieodzowne. Zatem >> varchar, który varcharem nie jest to jak mieć randkę z transwestytą, >> choć zamierzaliśmy z kobietą. > Ale nie piszemy o przydatności w ogóle varchar, tylko o optymalizacji > takich drobiazgów jak varchar. To wyjaśniłem już wyżej. >> Nie mam na myśli podniesienie, mam na myśli obniżenie. Po prostu już na >> wstępie masz bazę, która wymaga większych zasobów niż to konieczne. > I z powodu varchar nie podniesiesz istotnie wydajności tamtymi 6 punktami? > Chciałbym to zobaczyć. Być może podniesiesz, ale trzeba brać pod uwagę efekt skali. Może się okazać, że do obsługi 10 razy większej ilości użytkowników trzeba znowu rozbudować sprzęt, aby przechowywał on niepotrzebną do niczego przestrzeń. I nie wystarczy 1 TB RAM. > A dublowane indeksy, to raczej przedszkole, do tego eksperta chyba nie trzeba? Ale nie takie oczywiste dublowane indeksy, ale takie, które niczego nie wnoszą, bo choć opierają się na innej regule, to i tak optymalizator ich nie wykorzystuje, bo ma dwa lepsze do tego celu. >> Nie odebrałem tego w ten sposób. Czyli chciałbym przechowywać kod >> paskowy na Int64? > Rozmawialiśmy o indeksach naturalnycyh, jak pesel, kod paskowy, albo > nazwa systematyczna gatunku. Odpowiedziałem, że pomimo istnienia > indeksów naturalnych, używam klucza własnego int64. Może robię > głupio, oczekiwałem krytyki w kierunku klucz narutalny vs sztuczny int64. Klucze naturalne stosuje się rzadko, zazwyczaj tylko wtedy, gdy daje to uzasadniony zysk wydajnościowy. Ze znanych mi przypadków taki klucz założono na kodzie towaru, bo kartoteka szła w miliony, a czas wystawiania dokumentu na podstawie tegoż symbolu był wybitnie istotny (sprzedaż miała się odbywać szybko, klienci nie lubią czekać). > Więc może rozwiązanie: 'zawsze klucz sztuczny na int32 lub int64' - > jest jednak dobre? W większości przypadków tak, z tym że int64 tylko wtedy, gdy zakładamy, że przekroczymy zakres int32. >> Nie bardzo też widzę związek z szybkością komputerów i >> wyczerpaniem Int32. To przecież zależy od rodzaju danych (ich zakresu). > Na wolnych kompach trzeba dłużej liczyć, aby wyczerpać int32. Ale klucz sztuczny nie jest wyliczany. On narasta i to w długich okresach czasu, więc co ma do tego szybkość komputera? > Generalnie posdumowując całość, chciałbym się naocznie przekonać o tym > co piszesz. Tak w teoretycznej rozmowie jakoś nie mogę uwierzyć. Poleciłbym Ci tę prezentację (https://www.youtube.com/watch?v=HqzsH_49b-U), ale jak widzę coś się w niej zepsuło, a szkoda, bo z tego co pamiętam była dokładnie na omawiany temat. Możesz ewentualnie zajrzeć tutaj, choć jest bardziej o tym jak działa estymacja optymalizatora bazy danych (https://www.youtube.com/watch?v=FbEHdkxR2XI). -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: M.M.
Date: Sun, 22 Feb 2015 18:51
Date: Sun, 22 Feb 2015 18:51
289 lines
16394 bytes
16394 bytes
On Sunday, February 22, 2015 at 7:08:44 PM UTC+1, PaSkol wrote: > W dniu 2015-02-22 o 13:49, M.M. pisze: > > On Sunday, February 22, 2015 at 10:10:11 AM UTC+1, PaSkol wrote: > >> W dniu 2015-02-21 o 20:22, M.M. pisze: > >>> Wybacz, ale nadal nie rozumiem, co ma wspólnego przytoczony przeze mnie > >>> tekst z szybszymi złączeniami. Uporządkowanie danych pomaga wtedy, gdy > >>> po odczycie rekordu o numerze (fizycznym) N, jest duże prawdopodobieństwo > >>> odczytania rekordu o numerze N+1. W jakich złączeniach tak jest? > >> > >> Dla mnie szybkość złączenia, to szybkość z jaką otrzymam dane, które to > >> złączenie mi zapewnia. A wyjaśniłem wszak dlaczego dane w przypadku > >> indeksu klastrowego uzyskuje się szybciej. > > Myślę że się mylisz, myślę że jest podobnie. Zakładam że autorzy silników > > baz danych nie dali dupy. Mamy tabelę która ma powiedzmy 10^9 rekordów. > > Chcemy rekord: > > > > select * from tabela where pole=coś. > > Ale podajesz zapytanie, w którym nie ma złączenia (join). Więc to > zupełnie inna sytuacja. Analogiczne, wręcz takie samo wyszukanie zachodzi przy złączeniach. > A nawet gdyby "pole" było kluczem i to w indeksie klastrowym, Właśnie, o to mi chidzło. > to - powtarzam do znudzenia - znajdując wartość klucza masz już > załadowane także dane. Chwila. Są rożne odmiany b-tree. Jeśli zakłądamy zwykły indeks (nie klastrowy) oparty o b-tree, to też w tym indeksie mogą być dane. Jedne rodzaje b-tree trzymają dane w liściach, aby, tak jak napisałeś, mieć od razu wartość danych. Inne rodzeje trzymają tylko odnośniki, aby maksmyalizować brenchfactor. Nie mam pojęcia jakich rodzajów używają popularne bazy danych. > To jak z książką telefoniczną, > wybierasz strony na K i odnajdując Kowalskiego masz od razu jego numer > telefonu, adres i co tam jeszcze w książce jest. Nie wiem czy nie jestem w blędzie, ale tak właśnie rozumiem indeks klastrowy. > Ale szukając - załóżmy > (bo nie wiem czy tak jest w książce tel.) - po numerze korzystasz z > indeksu na końcu książki telefonicznej, gdzie jest napisane, że kowalski > jest na stronie 147 i tam sobie doszukujesz. Tak z kolei sobie wyobrażam nie-klastrowe indeksy. > Czyli w drugim przypadku > najpierw indeks wg telefonów, a potem jeszcze przeniesienie się na > konkretną stronę (w bazie będzie od razu do właściwego rekordu). Po pierwsze, potem tak nie musi być, bo są odmiany b-tree z danymi w liściach. Po drugie, nawet jeśli potem tak jest, to koszt jest równoważny jednemu dostępowi do dysku - czyli jest pomijalnie mały. > Czyli > tu są dwa działania, a tam jedno (bo ustawienie się na stronach od K to > przejście przez stosowny poziom b-drzewa). Ale to drugie działanie ma koszt prawie zerowy. To o czym piszesz, ma kolosalne znaczenie przy sekwencyjnym dostępie, a nie przy złączeniach. > > Czyli wolniej. Więc baza powinna założyć zwykłe b-tree pomimo > > clustered. > > Clustered to jest b-tree (skoro każdy indeks to b-tree). Tylko że na > jego końcu (liściach) są dane, a nie wskazania na dane. Nie wiem czy tak można powiedzieć... b-tree to struktura danych. Clustered to opcja przy zakładaniu indeksu. Sorry, ja widzę dwie całkiem różne rzeczy. > > > Chętnie dowiem się co pomylilem w powyższym rozumowaniu. > > Jest ono nieistotne. Szukając po kluczu, który posłużył do ułożenia > indeksu klastrowego, po prostu przeszukujesz też niejako dane. Proponuję > zapoznać się najpierw co to dokładnie jest indeks klastrowy i skąd taka > jego siła. Niezgodzę się, powody opisałem powyżej: b-tree też może mieć kopię danychy, a ta kopia w niewielkim stopniu wpływa na wydajność. > >> Ustawia się na początku indeksu (pomińmy rozważania na poziomie > >> b-drzewa, traktujmy indeks logicznie). > > Nie wiem na czym polega traktowanie indesku logicznie. > > Logicznie tj. nie fizycznie. Logicznie czyli jako mechanizm, który w > szybki sposób pozwala dotrzeć do szukanej wartości. Hmmm no dobra. > > >> Pobiera pierwsza wartość i > >> porównuje z oczekiwaną. Jeśli jest to wartość 1 to musi przejść przez > >> kolejne 100 rekordów (bo dane są ułożone w kolejności), > > Jeśli ma indeks, to nie musi. Często trafia w rekord z tą stówą już > > po 3-5 'dostępach do dysku'. Piszę w cudzyslowie, bo może być > > wszystko w RAM. > > "Przejść" w sensie wyłuskania danych z indeksu klastrowego. Szukał > setnego, musiał (po standardowym przejściu przez poziomy b-drzewa) > pominąć te dane, które są wcześniej. Czyli musiał przejść przez b-drzewo a nie przez dane - to się zgodzę. Przez dane przeskakuje dzięki b-tree. > > >> W MSSQL > >> silnik bazy danych nie wylicza sobie bezpośrednio pozycji rekordu, on > >> potrafi przeskakiwać kolejne rekordy (bo wie jaki jest rozmiar każdego z > >> nich z osobna), aby dotrzeć do oczekiwanej wartości. Nie wylicza też z > >> powodów, o których już sam pisałeś - mogą być dziury w wartościach > >> klucza. Nie ma wyjścia - trzeba przeszukać całość, ale można tylko > >> wybrane fragmenty. > > Chyba piszesz o dwoch rzeczach, a ja nie chwytam kiedy o której. Raz > > piszesz że przeskakuje, drugi raz że musi szykać calość. Sorrki, nie > > kumam. > > Bo po prostu nie rozumiesz co to jest indeks klastrowy. Pisałem jak ja rozumiem. Jest to indeks, który dodatkowo wymusza fizyczną reorganizację danych w tabeli. > >> Pod adresem, z którego przytoczono fragment o indeksach klastrowych jest > >> podany przykład takiej struktury w świecie rzeczywistym: to książka > >> telefoniczna, w której abonenci są ułożeni alfabetycznie. Odszukanie > >> konkretnego nazwiska polega zatem na przejrzeniu kilku stron poczynając > >> od tej, na której zaczynają się nazwiska na daną literę. > > Ale można pszeszukiwać inaczej, zwłaszcza gdy szuka algorytm na kompie, a > > nie czlowiek w książce. > > Rzecz w tym, że algorytm szuka dokładnie tak samo jak człowiek. Dlatego > właśnie podaje się analogię do książki telefonicznej. Książka _jest_ > indeksem klastrowym. Pewnie chodziło Ci jeszcze o to, że strona książki, to strona na dysku? Jeśli tak, to zgoda. Sorrki, ale togo się nie domyśliłem od razu. > > >> No i? Jak potem bez odpowiedniej wiedzy dojdziesz, dlaczego działają raz > >> wolno a raz szybko (jak pytasz poniżej)? > > Ja jak dojdę? Metodą intuicji, prób i błędów. Zwykle robię coś na 2-3 > > sposoby i wybieram ten który najszybciej działa. Jeśli cała baza jest w > > ram, jeśli zapytanie tylko odczytuje dane, to co ekspert zrobi > > lepiej? Ma lepiej wypracowaną intuicję i sprawdzi jeszcze 2 sposoby? > > Ekspert nie będzie się opierał na intuicji. Sprawdzi na jakich danych > operuje zapytanie. Jeśli okaże się, np. że zamiast varcharów stosowane > są chary, ale i tak wszystkie wartości w nich umieszczane zajmują max > 50% założonej dla nich przestrzeni, to sprawdzi co tak naprawdę ma być > tam przechowywane, dostosuje rozmiar varchara i zamieni chary na > varchary. Doprowadzi to do sytuacji, gdzie wczytanie 1000 rekordów nie > będzie wymagało odczytu tylu stron co poprzednio (bo więcej rekordów > zmieści się na stronie). To jest realne zmniejszenie ilości odczytów z > dysku. To jest także lepsze wykorzystanie bufora na dane. Nie zgodzę się. Taki drobiazg umiem zrobić ja, a nie jestem ekspertem. > >>> 3) warto usunąć testy poprawności danych - wiadomo kosztem jakiego ryzyka > >> Owszem można nie testować danych na poziomie bazy (bo można, a czasami > >> wręcz lepiej zrobić to wcześniej). > > Jeśli testujesz klucze obce to i tak i tak musi być dostęp do danych. No > > chyba że w programie masz kopię kluczy. > > Co to znaczy testować klucze obce? Czy o to nie dbają więzy > integralności (constraints)? Tak, chodziło mi też o testowanie więzów integralności. Można to wyłączyć. > Ja pisząc o testowaniu miałem na myśli > sprawdzane poprawności danych na poziomie aplikacji (nie wpisujemy reguł > do bazy - choć ona to umożliwia). To w moich pomiarach zajmuje mało czasu. Za to kolosalnie dużo czasu zajmuje testowanie kluczy obcych przy insertach. > >>> 4) warto kupić sobie kontroler z bateryjnym podtrzymywaniem bufora zapisu > >> > >> A to akurat z wydajnością niewiele ma wspólnego > > Jak dasz buforowany zapis bez podtrzymywania bateryjnego, to w wyniku > > awarii zasilania co będzie? > > Buforowany zapis? Wg mnie to strzelanie bazie danych w kolano, bo > uniemożliwiamy jej zapewnienie transakcyjności. To już lepsze są ssd i > podtrzymywanie zasilania serwera. Chyba, że czegoś nie rozumiem. Transakcje tak samo są możliwe. Buforowany zapis, gdy bufor straci zasilanie, niesie ryzyko utraty spójności bazy. Dlatego stosuje się podtrzymywanie bateryjne tego bufora. Mądrzejsze kontrolery ponoć same testują jakość baterii i same wyłączają buforowany zapis, gdy bateria, np. po 1-2 latach pracy, straci swoją pojemność. > >>> A jak to nadal nie pomaga, to co Ci da informacja, ze varchar jest tak > >>> czy inaczej zaimplementowany? > >> > >> A po co w ogóle wprowadzono varchar? Gdyby nie było potrzebne, to by go > >> po prostu nie było. Okazało się jednak, że jest wręcz nieodzowne. Zatem > >> varchar, który varcharem nie jest to jak mieć randkę z transwestytą, > >> choć zamierzaliśmy z kobietą. > > Ale nie piszemy o przydatności w ogóle varchar, tylko o optymalizacji > > takich drobiazgów jak varchar. > > To wyjaśniłem już wyżej. Moim zdaniem to jest walka o pojedyncze milisekundy, nie wiem czy gra jest warta świeczki. > > >> Nie mam na myśli podniesienie, mam na myśli obniżenie. Po prostu już na > >> wstępie masz bazę, która wymaga większych zasobów niż to konieczne. > > I z powodu varchar nie podniesiesz istotnie wydajności tamtymi 6 punktami? > > Chciałbym to zobaczyć. > > Być może podniesiesz, ale trzeba brać pod uwagę efekt skali. Może się > okazać, że do obsługi 10 razy większej ilości użytkowników trzeba znowu > rozbudować sprzęt, aby przechowywał on niepotrzebną do niczego > przestrzeń. I nie wystarczy 1 TB RAM. Moim zdaniem, 10 razy więcej użytkowników dzięki optymalizacji vchar, to fikcja. Myślę, że to może dać 1% więcej użytkowników. No chyba że ktoś naprawdę nieudacznie te vchary zrobi. Może dla uściślenia przypomnę. Chodzi o bazę zrobioną przez rozsądną osobe, która w miarę się zna, a potem o ulepszenia wprowadzone przez eksperta. Nie chodzi o bazę zrobioną przez totalnego lamera i potem ulepszoną przez eksperta - bo tak to może faktycznie 10 razy więcej userów... > > > A dublowane indeksy, to raczej przedszkole, do tego eksperta chyba nie trzeba? > > Ale nie takie oczywiste dublowane indeksy, ale takie, które niczego nie > wnoszą, bo choć opierają się na innej regule, to i tak optymalizator ich > nie wykorzystuje, bo ma dwa lepsze do tego celu. Tyle że takie indeksy też dużo nie spowalniają. Trochę spada wydajność insertów. Poza tym wywalenie nieużywanych indeksów, to też zadanie dla przeciętniaka, a nie dla eksperta. > >> Nie odebrałem tego w ten sposób. Czyli chciałbym przechowywać kod > >> paskowy na Int64? > > Rozmawialiśmy o indeksach naturalnycyh, jak pesel, kod paskowy, albo > > nazwa systematyczna gatunku. Odpowiedziałem, że pomimo istnienia > > indeksów naturalnych, używam klucza własnego int64. Może robię > > głupio, oczekiwałem krytyki w kierunku klucz narutalny vs sztuczny int64. > > Klucze naturalne stosuje się rzadko, zazwyczaj tylko wtedy, gdy daje to > uzasadniony zysk wydajnościowy. Ze znanych mi przypadków taki klucz > założono na kodzie towaru, bo kartoteka szła w miliony, a czas > wystawiania dokumentu na podstawie tegoż symbolu był wybitnie istotny > (sprzedaż miała się odbywać szybko, klienci nie lubią czekać). Ciekawe ile zaoszczędzono czasu na tym jednym polu int32 lub int64 w skali całego rekordu. Ciekawe ile by zaoszczędzono, jakby program buforował inserty i wysłał np. w paczkach po 30 insertów. Ciekawe jaki byłby zysk, jakby dziennik dać na specjalnym dysku, no i co by się działo, jakby buforować zapis - zwróć uwagę, że to nadal tanie i łatwe techniki. > > Więc może rozwiązanie: 'zawsze klucz sztuczny na int32 lub int64' - > > jest jednak dobre? > > W większości przypadków tak, z tym że int64 tylko wtedy, gdy zakładamy, > że przekroczymy zakres int32. Ok. > >> Nie bardzo też widzę związek z szybkością komputerów i > >> wyczerpaniem Int32. To przecież zależy od rodzaju danych (ich zakresu). > > Na wolnych kompach trzeba dłużej liczyć, aby wyczerpać int32. > > Ale klucz sztuczny nie jest wyliczany. On narasta i to w długich > okresach czasu, więc co ma do tego szybkość komputera? Chodzilo o to, że komputer 10 razy wolniejszy, musi pracować 10 razy dłużej, aby przepełnić int32 :) To szczegół, nic on nie wnosi, nie ciągnijmy. > > Generalnie posdumowując całość, chciałbym się naocznie przekonać o tym > > co piszesz. Tak w teoretycznej rozmowie jakoś nie mogę uwierzyć. > > Poleciłbym Ci tę prezentację > (https://www.youtube.com/watch?v=HqzsH_49b-U), ale jak widzę coś się w > niej zepsuło, a szkoda, bo z tego co pamiętam była dokładnie na omawiany > temat. Możesz ewentualnie zajrzeć tutaj, choć jest bardziej o tym jak > działa estymacja optymalizatora bazy danych > (https://www.youtube.com/watch?v=FbEHdkxR2XI). Dzięki, spojrzę. Pozdrawiam
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: PaSkol
Date: Mon, 23 Feb 2015 20:54
Date: Mon, 23 Feb 2015 20:54
188 lines
12106 bytes
12106 bytes
W dniu 2015-02-22 o 19:51, M.M. pisze: > Chwila. Są rożne odmiany b-tree. Jeśli zakłądamy zwykły indeks > (nie klastrowy) oparty o b-tree, to też w tym indeksie mogą być dane. > Jedne rodzaje b-tree trzymają dane w liściach, aby, tak jak napisałeś, > mieć od razu wartość danych. Inne rodzeje trzymają tylko odnośniki, > aby maksmyalizować brenchfactor. Nie mam pojęcia jakich rodzajów > używają popularne bazy danych. Indeks klastrowy w MSSQL, z tego co mi wiadomo, ma w liściach po prostu wiersze tabeli. >> To jak z książką telefoniczną, >> wybierasz strony na K i odnajdując Kowalskiego masz od razu jego numer >> telefonu, adres i co tam jeszcze w książce jest. > Nie wiem czy nie jestem w blędzie, ale tak właśnie rozumiem indeks klastrowy. No i tak ten indeks jest zrealizowany. Znalazłeś Kowalskiego, ale przy okazji także wszystko co książka (analogicznie - tabela) na jego temat gromadzi. >> Ale szukając - załóżmy >> (bo nie wiem czy tak jest w książce tel.) - po numerze korzystasz z >> indeksu na końcu książki telefonicznej, gdzie jest napisane, że kowalski >> jest na stronie 147 i tam sobie doszukujesz. > Tak z kolei sobie wyobrażam nie-klastrowe indeksy. I tak właśnie są one zbudowane (choć MSSQL-u prowadzą nie do adresu wiersza, a do jego pozycji w indeksie klastrowym). >> Czyli w drugim przypadku >> najpierw indeks wg telefonów, a potem jeszcze przeniesienie się na >> konkretną stronę (w bazie będzie od razu do właściwego rekordu). > Po pierwsze, potem tak nie musi być, bo są odmiany b-tree z danymi > w liściach. Po drugie, nawet jeśli potem tak jest, to koszt jest > równoważny jednemu dostępowi do dysku - czyli jest pomijalnie mały. Tak, ale cały czas dyskutujemy o indeksie klastrowym. A te inne indeksy rozpatrujemy standardowo i nawet jeśli miałyby dodatkowo zawierać dane, to przecież nie wszystkie, jakie w tabeli są (więc będą pasować tylko dla specyficznej listy kolumn w select). W indeksie klastrowym dane zawsze są pod ręką. >> Czyli >> tu są dwa działania, a tam jedno (bo ustawienie się na stronach od K to >> przejście przez stosowny poziom b-drzewa). > Ale to drugie działanie ma koszt prawie zerowy. To o czym piszesz, ma > kolosalne znaczenie przy sekwencyjnym dostępie, a nie przy złączeniach. Wg mnie niezerowy, bo trzeba sięgnąć po strony danych - czyli odczytać je z dysku. Tak jak w przykładzie z książką telefoniczną. Najpierw trzeba było zajrzeć na koniec, a potem wrócić na odpowiednią stronę. I przy złączeniach musimy dla indeksu nieklastrowego powtórzyć wielokrotnie taką operację. Oczywiście część stron zdąży się nam załadować wcześniej i będziemy mogli je ponownie wykorzystać, ale jeśli te strony są nieoptymalnie zapełnione (np. puste chary zamiast varcharów) może się okazać, że trzeba je było wyrzucić żeby pobrać w ich miejsce inne strony. >> Clustered to jest b-tree (skoro każdy indeks to b-tree). Tylko że na >> jego końcu (liściach) są dane, a nie wskazania na dane. > Nie wiem czy tak można powiedzieć... b-tree to struktura danych. > Clustered to opcja przy zakładaniu indeksu. Sorry, ja widzę dwie > całkiem różne rzeczy. Tak to jest przedstawiane na schematach, jest trójkąt wizualizujący b-tree i do jego podstawy są przypięte dane - wiersze tabeli. Te wiersze, jeśli dobrze pamiętam, są ostatnim poziomem tego drzewa (stąd pisałem o "liściach"). >>> Chętnie dowiem się co pomylilem w powyższym rozumowaniu. >> >> Jest ono nieistotne. Szukając po kluczu, który posłużył do ułożenia >> indeksu klastrowego, po prostu przeszukujesz też niejako dane. Proponuję >> zapoznać się najpierw co to dokładnie jest indeks klastrowy i skąd taka >> jego siła. > Niezgodzę się, powody opisałem powyżej: b-tree też może mieć kopię > danychy, a ta kopia w niewielkim stopniu wpływa na wydajność. Wg mnie nawet ta kopia wpływa - po co zresztą by wymyślano indeks z załączanymi danymi, jeśli nie po to, aby przy użyciu indeksu mieć dostęp właśnie do tych konkretnych danych. >> "Przejść" w sensie wyłuskania danych z indeksu klastrowego. Szukał >> setnego, musiał (po standardowym przejściu przez poziomy b-drzewa) >> pominąć te dane, które są wcześniej. > Czyli musiał przejść przez b-drzewo a nie przez dane - to się zgodzę. > Przez dane przeskakuje dzięki b-tree. Jak pisałem wcześniej - ostatni poziom indeksu klastrowego to de facto dane, a nie jedynie wskazania na nie. Czyli kolejne pozycje tego poziomu są od siebie oddalone o rozmiar wiersza - stąd te skoki i przechodzenie przez dane (analogicznie do wertowanie stron w celu znalezienia Kucharskiego, który powinien być gdzieś dalej po Kowalskim). >> Bo po prostu nie rozumiesz co to jest indeks klastrowy. > Pisałem jak ja rozumiem. Jest to indeks, który dodatkowo wymusza > fizyczną reorganizację danych w tabeli. A to jest "dwa w jednym" (przynajmniej w MSSQL-u). >> Ekspert nie będzie się opierał na intuicji. Sprawdzi na jakich danych >> operuje zapytanie. Jeśli okaże się, np. że zamiast varcharów stosowane >> są chary, ale i tak wszystkie wartości w nich umieszczane zajmują max >> 50% założonej dla nich przestrzeni, to sprawdzi co tak naprawdę ma być >> tam przechowywane, dostosuje rozmiar varchara i zamieni chary na >> varchary. Doprowadzi to do sytuacji, gdzie wczytanie 1000 rekordów nie >> będzie wymagało odczytu tylu stron co poprzednio (bo więcej rekordów >> zmieści się na stronie). To jest realne zmniejszenie ilości odczytów z >> dysku. To jest także lepsze wykorzystanie bufora na dane. > Nie zgodzę się. Taki drobiazg umiem zrobić ja, a nie jestem ekspertem. Podałem akurat taki przykład, bo wynikał z kontekstu dyskusji. Przypadków może być więcej, postaram się skontaktować z liderami warszawskiej PLSSUG, możliwie, że wrzucą ponownie wideo z tej uszkodzonej prezentacji, którą polecałem. >>> Ale nie piszemy o przydatności w ogóle varchar, tylko o optymalizacji >>> takich drobiazgów jak varchar. >> >> To wyjaśniłem już wyżej. > Moim zdaniem to jest walka o pojedyncze milisekundy, nie wiem czy > gra jest warta świeczki. Kiedy okazuje się, że trzeba z tego powodu czytać wiele stron (w tym ponownie te, które już odczytano), wówczas nie są to milisekundy. A tak może być przy odpowiednio intensywnym wielodostępie i niewystarczającej na niego pamięci (czasami okazuje się, że wystarczy kilkunastu magazynierów z handheldami kompletujących zamówienia). >>>> Nie mam na myśli podniesienie, mam na myśli obniżenie. Po prostu już na >>>> wstępie masz bazę, która wymaga większych zasobów niż to konieczne. >>> I z powodu varchar nie podniesiesz istotnie wydajności tamtymi 6 punktami? >>> Chciałbym to zobaczyć. >> >> Być może podniesiesz, ale trzeba brać pod uwagę efekt skali. Może się >> okazać, że do obsługi 10 razy większej ilości użytkowników trzeba znowu >> rozbudować sprzęt, aby przechowywał on niepotrzebną do niczego >> przestrzeń. I nie wystarczy 1 TB RAM. > Moim zdaniem, 10 razy więcej użytkowników dzięki optymalizacji vchar, to > fikcja. Myślę, że to może dać 1% więcej użytkowników. No chyba że ktoś > naprawdę nieudacznie te vchary zrobi. Może dla uściślenia przypomnę. > Chodzi o bazę zrobioną przez rozsądną osobe, która w miarę się zna, a > potem o ulepszenia wprowadzone przez eksperta. Nie chodzi o bazę > zrobioną przez totalnego lamera i potem ulepszoną przez eksperta - bo > tak to może faktycznie 10 razy więcej userów... 10 razy to rząd wielkości, dla 1000 może się jeszcze nic nie dziać, ale już dla 10 tys... >>> A dublowane indeksy, to raczej przedszkole, do tego eksperta chyba nie trzeba? >> >> Ale nie takie oczywiste dublowane indeksy, ale takie, które niczego nie >> wnoszą, bo choć opierają się na innej regule, to i tak optymalizator ich >> nie wykorzystuje, bo ma dwa lepsze do tego celu. > Tyle że takie indeksy też dużo nie spowalniają. Trochę spada wydajność > insertów. Poza tym wywalenie nieużywanych indeksów, to też zadanie > dla przeciętniaka, a nie dla eksperta. Tylko że Ty patrzysz z punktu widzenia administratora bazy, a nie typowego programisty, który niespecjalnie się przejmuje bazą danych. To dla niego taka czarna skrzynka (jak dla Ciebie indeks), do której po prostu wrzuca dane. I on może nawet przypadkiem założyć taki powielający indeks, ale nigdy nie zajrzy do bazy aby sprawdzić, że jest niepotrzebny. Więc często i gęsto tacy spece od baz danych robią takie proste rzeczy. Ja zresztą takim specem nie jestem, natomiast oglądałem wystąpienia takowych (jakieś 3 lata temu) i to było bardzo pouczające. To był m.in. człowiek, którzy optymalizuje bazy dla Allegro. >> Klucze naturalne stosuje się rzadko, zazwyczaj tylko wtedy, gdy daje to >> uzasadniony zysk wydajnościowy. Ze znanych mi przypadków taki klucz >> założono na kodzie towaru, bo kartoteka szła w miliony, a czas >> wystawiania dokumentu na podstawie tegoż symbolu był wybitnie istotny >> (sprzedaż miała się odbywać szybko, klienci nie lubią czekać). > Ciekawe ile zaoszczędzono czasu na tym jednym polu int32 lub int64 w > skali całego rekordu. Ciekawe ile by zaoszczędzono, jakby program > buforował inserty i wysłał np. w paczkach po 30 insertów. Ciekawe > jaki byłby zysk, jakby dziennik dać na specjalnym dysku, no i > co by się działo, jakby buforować zapis - zwróć uwagę, że to nadal > tanie i łatwe techniki. Wydaje mi się, że to było jedyne najbardziej optymalne rozwiązanie - ci dwaj goście, którzy robią ową uszkodzoną prezentację się tym zajmowali, więc (obaj MVP) ja raczej nie mam wątpliwości, że przegapiliby coś lepszego. -- PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: M.M.
Date: Tue, 24 Feb 2015 13:00
Date: Tue, 24 Feb 2015 13:00
300 lines
18373 bytes
18373 bytes
On Monday, February 23, 2015 at 9:54:07 PM UTC+1, PaSkol wrote: > Indeks klastrowy w MSSQL, z tego co mi wiadomo, ma w liściach po prostu > wiersze tabeli. Ok, w sumie jedno drugiego nie wyklucza. Tabela jest posorotwana (czytaj: pod kolejnym adresem fizycznym są kolejne dane w kolejności sortowania). Jednocześnie jest b-tree którego liśćmi są strony tej tabeli. > >> To jak z książką telefoniczną, > >> wybierasz strony na K i odnajdując Kowalskiego masz od razu jego numer > >> telefonu, adres i co tam jeszcze w książce jest. > > Nie wiem czy nie jestem w blędzie, ale tak właśnie rozumiem indeks klastrowy. > > No i tak ten indeks jest zrealizowany. Znalazłeś Kowalskiego, ale przy > okazji także wszystko co książka (analogicznie - tabela) na jego temat > gromadzi. Czyli w przybliżeniu mam dobre wyobrażenie na ten temat. > > >> Ale szukając - załóżmy > >> (bo nie wiem czy tak jest w książce tel.) - po numerze korzystasz z > >> indeksu na końcu książki telefonicznej, gdzie jest napisane, że kowalski > >> jest na stronie 147 i tam sobie doszukujesz. > > Tak z kolei sobie wyobrażam nie-klastrowe indeksy. > > I tak właśnie są one zbudowane (choć MSSQL-u prowadzą nie do adresu > wiersza, a do jego pozycji w indeksie klastrowym). Ok, ale to drobna różnica, o czym poniżej. > >> Czyli w drugim przypadku > >> najpierw indeks wg telefonów, a potem jeszcze przeniesienie się na > >> konkretną stronę (w bazie będzie od razu do właściwego rekordu). > > Po pierwsze, potem tak nie musi być, bo są odmiany b-tree z danymi > > w liściach. Po drugie, nawet jeśli potem tak jest, to koszt jest > > równoważny jednemu dostępowi do dysku - czyli jest pomijalnie mały. > > Tak, ale cały czas dyskutujemy o indeksie klastrowym. W sumie to nie tylko o tym. Rozmowa się rozwidliła. > A te inne indeksy > rozpatrujemy standardowo i nawet jeśli miałyby dodatkowo zawierać dane, > to przecież nie wszystkie, jakie w tabeli są (więc będą pasować tylko > dla specyficznej listy kolumn w select). Tak, ale to w często jest lepsze, zwłaszcza gdy w trakice obliczeń są brane pod uwagę tylko te dane zawarte wewnątrz indeksu. > W indeksie klastrowym dane zawsze są pod ręką. Tak, ale może się okazać, że rekord ma np. 15 pól, a potrzebne są tylko 2 pola. Wtedy pozostałe 13 pól w indeksie klastrowym zwyczajnie zawadza. Można się ratować tabelą (dwu)kolumnową... ale tego typu zabiegi potem utrudniają rozwój aplikacji. > >> Czyli > >> tu są dwa działania, a tam jedno (bo ustawienie się na stronach od K to > >> przejście przez stosowny poziom b-drzewa). > > Ale to drugie działanie ma koszt prawie zerowy. To o czym piszesz, ma > > kolosalne znaczenie przy sekwencyjnym dostępie, a nie przy złączeniach. > > Wg mnie niezerowy, bo trzeba sięgnąć po strony danych - czyli odczytać > je z dysku. Spójrz na to jak na koszt relatywny. Mamy zapytanie sql. Trzeba je przesłać przez TCP-IP. Trzeba je sparsować/skompilować. Trzeba sprawdzić uprawneinia usera w bazie, w systemie operacyjnym, czasami także w aplikacji. Zwykle łączymy 2-3 a może 4 tabele. Często zbędne rekordy da się szybciej odfiltrować. Część danych, albo calość jest buforowana w RAM. W takich warunkach chcemy zaoszczędzić jedno dociągnięcie danych z jednej tabeli. Ile to relatywnie przyspieszy? Będzie to zysk chociaż 10%? Jak będzie dużo danych w RAM, to może być zysk poniżej 1%. Nie wspominam tutaj jeszcze o koszcie sformatowania danych wyjściowych i wyświetlenia ich użytkownikowi. Ja bym się tym nie martwił. Mnie martwi co innego. Np. mam małą, testową bazę. Skompresowany dump bazy zajmuje 300MB. Zatem całą baza mieści się w buforze RAM. Wykonuję pewne zapytania SQL i mierzę czasy. Potem piszę analogiczną aplikację w C++ i znowu mierzę czasy. Wychodzi że w C++ działą 10tys razy szybciej. Dodaj jeszcze, że w C++ nie zmieniam struktury danych. W C++ normalnie trzymam tabele w RAM, czasami posortowane (odpowiednik clustered), zakładam indeksy hash, albo red-black-tree. Bym rozumiał, jakby baza działała 300 razy wolniej. Ale 10tys? > Tak jak w przykładzie z książką telefoniczną. Najpierw > trzeba było zajrzeć na koniec, a potem wrócić na odpowiednią stronę. I > przy złączeniach musimy dla indeksu nieklastrowego powtórzyć > wielokrotnie taką operację. Oczywiście część stron zdąży się nam > załadować wcześniej i będziemy mogli je ponownie wykorzystać, ale jeśli > te strony są nieoptymalnie zapełnione (np. puste chary zamiast > varcharów) może się okazać, że trzeba je było wyrzucić żeby pobrać w ich > miejsce inne strony. Tak, ale tabel w złączeniu mamy np. 4. Jeśli w jednej jest o 30% spacji za dużo, to koszt całego zapytania nie wzrośnie o 30%, tylko proporcjonalnie do kosztu operacji na tej jednej tabeli. Naprawdę to jest drobiazg. > >> Clustered to jest b-tree (skoro każdy indeks to b-tree). Tylko że na > >> jego końcu (liściach) są dane, a nie wskazania na dane. > > Nie wiem czy tak można powiedzieć... b-tree to struktura danych. > > Clustered to opcja przy zakładaniu indeksu. Sorry, ja widzę dwie > > całkiem różne rzeczy. > > Tak to jest przedstawiane na schematach, jest trójkąt wizualizujący > b-tree i do jego podstawy są przypięte dane - wiersze tabeli. Te > wiersze, jeśli dobrze pamiętam, są ostatnim poziomem tego drzewa (stąd > pisałem o "liściach"). Ok. > >>> Chętnie dowiem się co pomylilem w powyższym rozumowaniu. > >> > >> Jest ono nieistotne. Szukając po kluczu, który posłużył do ułożenia > >> indeksu klastrowego, po prostu przeszukujesz też niejako dane. Proponuję > >> zapoznać się najpierw co to dokładnie jest indeks klastrowy i skąd taka > >> jego siła. > > Niezgodzę się, powody opisałem powyżej: b-tree też może mieć kopię > > danychy, a ta kopia w niewielkim stopniu wpływa na wydajność. > > Wg mnie nawet ta kopia wpływa - po co zresztą by wymyślano indeks z > załączanymi danymi, jeśli nie po to, aby przy użyciu indeksu mieć dostęp > właśnie do tych konkretnych danych. Tak, wymyślono go właśnie po to. Ale ma on też wady. Rozgałęzienie w liściach jest mniejsze, więc czas wyszukiwania jest większy, niż w drzewach bez danych (tylko z odnośnikami). To też nie jest taka super optymalizacja, to przyspiesza o znikome procenty. > >> "Przejść" w sensie wyłuskania danych z indeksu klastrowego. Szukał > >> setnego, musiał (po standardowym przejściu przez poziomy b-drzewa) > >> pominąć te dane, które są wcześniej. > > Czyli musiał przejść przez b-drzewo a nie przez dane - to się zgodzę. > > Przez dane przeskakuje dzięki b-tree. > > Jak pisałem wcześniej - ostatni poziom indeksu klastrowego to de facto > dane, a nie jedynie wskazania na nie. Czyli kolejne pozycje tego poziomu > są od siebie oddalone o rozmiar wiersza - stąd te skoki i przechodzenie > przez dane (analogicznie do wertowanie stron w celu znalezienia > Kucharskiego, który powinien być gdzieś dalej po Kowalskim). Ok, tak samo myślę. > >> Bo po prostu nie rozumiesz co to jest indeks klastrowy. > > Pisałem jak ja rozumiem. Jest to indeks, który dodatkowo wymusza > > fizyczną reorganizację danych w tabeli. > > A to jest "dwa w jednym" (przynajmniej w MSSQL-u). Tak, ale pamiętaj że to też nie jest taka super rewelacja, bo spada brenchfactor w drzewach zawierających dane. > >> Ekspert nie będzie się opierał na intuicji. Sprawdzi na jakich danych > >> operuje zapytanie. Jeśli okaże się, np. że zamiast varcharów stosowane > >> są chary, ale i tak wszystkie wartości w nich umieszczane zajmują max > >> 50% założonej dla nich przestrzeni, to sprawdzi co tak naprawdę ma być > >> tam przechowywane, dostosuje rozmiar varchara i zamieni chary na > >> varchary. Doprowadzi to do sytuacji, gdzie wczytanie 1000 rekordów nie > >> będzie wymagało odczytu tylu stron co poprzednio (bo więcej rekordów > >> zmieści się na stronie). To jest realne zmniejszenie ilości odczytów z > >> dysku. To jest także lepsze wykorzystanie bufora na dane. > > Nie zgodzę się. Taki drobiazg umiem zrobić ja, a nie jestem ekspertem. > > Podałem akurat taki przykład, bo wynikał z kontekstu dyskusji. Oj, ale rozmawialiśmy też o ekspertach baz danych. > Przypadków może być więcej, postaram się skontaktować z liderami > warszawskiej PLSSUG, możliwie, że wrzucą ponownie wideo z tej > uszkodzonej prezentacji, którą polecałem. Powiem Ci co by do mnie przemawiało. Przede wszystkim przykłady w ogromnej ilości i w wielu odmianach. Np. bierzemy bazę która ma około 8-12 tabel. Włączamy jakiś program. Program wykonuje ileś operacji wstawiania, usuwania, wyszukiwania. Potem bazę instalujemy na lepszym dysku i to samo. Potem bazę instalujemy na kompie z lepszym procesorem i to samo. Potem stopniowo zwiększamy ilość RAM. Potem wyłączamy bufor systemowy a zostawiamy tylko bufor bazy. Potem na odwrót, zostawiamy tylko systemowy, i wylączamy bufor bazy. Potem nie wiem co... zmieniamy system plików np. na xfs. Potem nie wiem co... zmieniamy silnki bazy, albo usuwamy testy więzów integralności... albo zmieniamy opcję optymalizatora... Co tam dalej... chciałbym zobaczyć jakie bylyby różnice gdyby każda tabela była na osobnym dysku. > > >>> Ale nie piszemy o przydatności w ogóle varchar, tylko o optymalizacji > >>> takich drobiazgów jak varchar. > >> > >> To wyjaśniłem już wyżej. > > Moim zdaniem to jest walka o pojedyncze milisekundy, nie wiem czy > > gra jest warta świeczki. > > Kiedy okazuje się, że trzeba z tego powodu czytać wiele stron (w tym > ponownie te, które już odczytano), wówczas nie są to milisekundy. A tak > może być przy odpowiednio intensywnym wielodostępie i niewystarczającej > na niego pamięci (czasami okazuje się, że wystarczy kilkunastu > magazynierów z handheldami kompletujących zamówienia). Zgoda, ale mam obawę, że relatywnie do całej operacji nadal koszt wydłuży się o powiedzmy 10%. Jeśli są takie operacje jakie wymieniłeś powyżej, to ja mam obawy, czy w ogóle rozwiązanie na bazie sql jest słuszne? Może lepiej bazę trzymać jako taki przydupas do porządnie zoptymalizowanego programu w C++ albo w Javie? Ja właśnie ostatnio tak zrobiłem. Baza tylko trzyma dane. Dane są wczytywane do programu i co jakiś czas uaktualniane. Program będzie instalowany na wielu maszynach. PHP łączy się z programem i to program robi zaawansowane złączenia albo wyszukiwania. > > >>>> Nie mam na myśli podniesienie, mam na myśli obniżenie. Po prostu już na > >>>> wstępie masz bazę, która wymaga większych zasobów niż to konieczne. > >>> I z powodu varchar nie podniesiesz istotnie wydajności tamtymi 6 punktami? > >>> Chciałbym to zobaczyć. > >> > >> Być może podniesiesz, ale trzeba brać pod uwagę efekt skali. Może się > >> okazać, że do obsługi 10 razy większej ilości użytkowników trzeba znowu > >> rozbudować sprzęt, aby przechowywał on niepotrzebną do niczego > >> przestrzeń. I nie wystarczy 1 TB RAM. > > Moim zdaniem, 10 razy więcej użytkowników dzięki optymalizacji vchar, to > > fikcja. Myślę, że to może dać 1% więcej użytkowników. No chyba że ktoś > > naprawdę nieudacznie te vchary zrobi. Może dla uściślenia przypomnę. > > Chodzi o bazę zrobioną przez rozsądną osobe, która w miarę się zna, a > > potem o ulepszenia wprowadzone przez eksperta. Nie chodzi o bazę > > zrobioną przez totalnego lamera i potem ulepszoną przez eksperta - bo > > tak to może faktycznie 10 razy więcej userów... > > 10 razy to rząd wielkości, dla 1000 może się jeszcze nic nie dziać, ale > już dla 10 tys... Nie rozumiem jak to się ma do powyższego. > > > >>> A dublowane indeksy, to raczej przedszkole, do tego eksperta chyba nie trzeba? > >> > >> Ale nie takie oczywiste dublowane indeksy, ale takie, które niczego nie > >> wnoszą, bo choć opierają się na innej regule, to i tak optymalizator ich > >> nie wykorzystuje, bo ma dwa lepsze do tego celu. > > Tyle że takie indeksy też dużo nie spowalniają. Trochę spada wydajność > > insertów. Poza tym wywalenie nieużywanych indeksów, to też zadanie > > dla przeciętniaka, a nie dla eksperta. > > Tylko że Ty patrzysz z punktu widzenia administratora bazy, a nie > typowego programisty, który niespecjalnie się przejmuje bazą danych. To > dla niego taka czarna skrzynka (jak dla Ciebie indeks), do której po > prostu wrzuca dane. I on może nawet przypadkiem założyć taki powielający > indeks, ale nigdy nie zajrzy do bazy aby sprawdzić, że jest > niepotrzebny. Więc często i gęsto tacy spece od baz danych robią takie > proste rzeczy. Ja zresztą takim specem nie jestem, natomiast oglądałem > wystąpienia takowych (jakieś 3 lata temu) i to było bardzo pouczające. > To był m.in. człowiek, którzy optymalizuje bazy dla Allegro. Ok, zgodzę się, że spec czasami musi robić prostą, albo nawet krecią robotę. Ale nie chodziło o to, jaka robota czasami się przytrafia specowi, ale o to, jaką robotę umie zrobić on, bo nie umie przeciętny programista. Spójrz na to tak. Bierzemy 1000 programistów. Każdy napisał przynajmniej 5 aplikacji bazodanychowy i przynajmniej w 2 aplikacjach miał przynajmniej małe problemy z wydajnością. Po czym sam te problemy rozwiązał. Teraz sortujemy tych programistów od najlepszych speców od baz danych do najgorszych. Interesuje mnie, co potrafią zrobić 20 najlepszych z tego tysiąca, a nie potrafi pozostałe 980 (albo rzadko zdarza się w tych 980 taki, co by to potrafił). > >> Klucze naturalne stosuje się rzadko, zazwyczaj tylko wtedy, gdy daje to > >> uzasadniony zysk wydajnościowy. Ze znanych mi przypadków taki klucz > >> założono na kodzie towaru, bo kartoteka szła w miliony, a czas > >> wystawiania dokumentu na podstawie tegoż symbolu był wybitnie istotny > >> (sprzedaż miała się odbywać szybko, klienci nie lubią czekać). > > Ciekawe ile zaoszczędzono czasu na tym jednym polu int32 lub int64 w > > skali całego rekordu. Ciekawe ile by zaoszczędzono, jakby program > > buforował inserty i wysłał np. w paczkach po 30 insertów. Ciekawe > > jaki byłby zysk, jakby dziennik dać na specjalnym dysku, no i > > co by się działo, jakby buforować zapis - zwróć uwagę, że to nadal > > tanie i łatwe techniki. > > Wydaje mi się, że to było jedyne najbardziej optymalne rozwiązanie - ci > dwaj goście, którzy robią ową uszkodzoną prezentację się tym zajmowali, > więc (obaj MVP) ja raczej nie mam wątpliwości, że przegapiliby coś lepszego. Też miałem problem z insertami. Do mojej bazy dużo danych napływa w krótkim czasie. Długie wstawianie blokowało bazę. Napisałem bufor w zmiennej PHP. Bufor ma rozmiar np. 1M elementów. Bufor działa jak tablica skojarzeniowa, więc wyszukiwanie w nim działa bardzo szybko. Przechowuję jeszcze datę ostatniego dostępu i wywalam najstarsze wpisy. Zanim odpytam bazę, to odpytuję bufor. Zyskałem gigantyczne przyspieszenie dzięki takiej prostej technice. Nie pamiętam jakie to było przyspieszenie, ale rzędu 10-30 razy. Swoją drogą, nie rozumiem skąd to przyspieszenie. Przecież baza robi to samo! Moja zmienna też jest serializowana na dysku. Wczytuję ją i wyszukuję danych w RAM. Baza też się mieści w buforze RAM. Skąd takie ogromne różnice w czasie wykonania? > > > -- > PaSkol (paskol.robi.to)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: M.M.
Date: Tue, 24 Feb 2015 13:17
Date: Tue, 24 Feb 2015 13:17
92 lines
5533 bytes
5533 bytes
On Tuesday, February 24, 2015 at 10:18:35 AM UTC+1, Stokrotka wrote: > Utworzyliśmy bazę o dmyślnej nazwie Tables i w niej > tabelę o nazwie t3, do której wpisaliśmy kilka rekordów: > > SELECT * from t3; > > id p31 > ---------- > 1 333 > 2 666 > 3 555 > 4 666 > 5 111 > > ...a teraz tworzymy indeksy w pliku o nazwie ind3 dla pola p31: > CREATE INDEX ind3 ON t3; > > Według manuala instrukcja umożliwiajaca korzystanie z wybranego > przez programistę indeksu wygląda tak: > SELECT * from t3 indexed by ind3; > > a tu zonk - dane są w kolejności ich wprowadzania (w MySQL to samo), > dane nie są posortowane! > > Ale jak dodamy warunek: > SELECT * from t3 WHERE p31<='666'; > > zobaczymy: > > id p31 > ---------- > 5 111 > 1 333 > 3 555 > 2 666 > 4 666 > > Czyli ten - niby optymalizator - dopiero teraz uaktywnił indeksy. > A wolałbym SAM uaktywniać indeksy bo chcę SAM decydować o kolejności > sortowania danych w kolumnach. Oczywiście umożliwia mi to jedynie > ORDER BY ale tak jak zauważyłem ta klauzula tworzy indeksy od nowa > dla siebie a uważam, że optymalizator powinien nawet dla ORDER BY > uaktywnić gotowe indeksy a nie je dublować. > > > _______ > > Bo ty nie rozumiesz co to jest indeks. > Pierwszym celem indeksu nie jest sortowanie, a szybki dostęp do rekordu. > Ideks skraca czas dostepu, po to jest. Ja bym powiedział, że indeks przyspiesza wyszukiwanie, a nie że skraca czas dostępu. Czas dostępu to raczej cech sprzętu. > Sortowanie to inna para kaloszy. > Oczywiście to może mieć związek, ale nie musi. Często ma ogromny związek, ponieważ wyszukiwanie binarne albo interpolacyjne działa dobrze na posortowanych danych. > Gdy dodałeś warunek mniejsze niż, wymusiłeś sortowanie, a raczej tylko jego > część, > bez warunku nie było niezbędne sortowanie. Gdy dałeś warunek mniejsze niż, to jedynie wymusiłeś odrzucenie danych większych lub równych. A dzięki indeksom, można szybciej wyszukać dane, które spełniają dany warunek. > W bibliotece masz indeks książek. > One nie leżą od najniższej do najwyższej. > One też nie leżą od najcieńszej do najgrupszej. > Jak by tak było, to by były posortowane > jakimś upożądkowanym sposobem. > Ale nie leżą. Większych głupot w życiu nie słyszalem. To jak wyobrażasz sobie znalezienie książki jeśli nie są w żaden sposób uporządkowane? > One często leżą zgodnie z kolejnością pszyjęcia książki do biblioteki, > co o niczym nie świadczy, bo nikt nie powiedział, > że książka pszyjmowana do biblioteki jest nowa, > może być stara, więc data pszyjęcia nawet nie określa roku wydania, > nie określa nic poza datą pszyjęcia do biblioteki. > Jeśli numery będą nadwane kolejno można je traktować jako indeks. > One nawet nie muszą leżeć po kolei, bo jakaś książka się zniszczyła > i na jej miejsce na regale wstawisz nowo pszyjętą, ale numer będzie mieć > nowy. > I to właśnie jest indeks. > Po numerku książki szybko dojdziesz, gdzie ona leży- to jest czas dostępu. > Gdzieś jest zapisane gdzie leży taki numer. W żaden sposób nie są uporządkowane, bo uporządkowanie po numerze to nie jest uporządkowanie ;-)
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: Stokrotka
Date: Wed, 25 Feb 2015 11:27
Date: Wed, 25 Feb 2015 11:27
59 lines
4654 bytes
4654 bytes
>Oczywiście sortowanie może być liniowe (wolniejsze) i np. b-tree >(szybsze). Zdaje się, że nie ma jeszcze algorytmu sortowania o liniowej złożoności, ale są o złożoności bardzo bliskiej n ( czyli liniowej). Najpopularniejsze dla małego zbioru, bo żadko dostarczane w języku programowania, więc najczęściej oprogramowywane w praktyce, jest sortowanie bombelkowe o złożoności n^2. Programiści tak lubią, ja też, bo kod jest prosty, a zysk na komplikacji kodu niewielki. Czym innym też jest sortowanie= szukanie rekordu w nieupożądkowanym zbioże, a czym innym struktura danyh, często ułatwiająca znalezienie rekurdu. B-dżewo to sposub upożądkowania- struktura logiczna danyh, o czasie dostępu do rekordu logarytmicznym, a więc szybszym. I to zdaje się w jakiejś całkiem dobrej ułamkowej potędze nie pamiętam, już jakiej. Obecnie pewnie są już lepsze struktury, bo o tej uczono mnie, a więc dawno temu. W strukturce tej dane - rekordy podzielone są na strony - struktury podobne do wieżhołka w dżewie binarnym, ale w każdym wieżhołku jest wiele rekorduw, nie jeden. Ih ilość - ilość rekorduw w każdym wieżhołku jest ściśle określona i wynosi około od k do 2 k , gdzie k- właściwość danego B-dżewa. Gdy gdzieś tszeba dodać rekord ponadwymiarowy , ten 2k+1, B - dżewo jest pszebudowywane. Ten warunek (ilość rekorduw na stronie od k do 2k, czyli w wieżhołku B-dżewa ułatwia wyważenie dżewa, to znaczy jego wysokość, z punktu widzenia dowolnego liścia. To jest drugi warunek B - dżewa, to wyważenie, ta identyczna wysokość z punktu wiedzenia strony będącej liściem. Dlatego w B-dżewie czas pesymistyczny jest ściśle okręślony i nie rośnie okropnie jak w niejednej innej struktuże danyh, w B-dżewie NIE zależy od kolejności wkładania rekorduw do struktury, a w na zwykłym dżewie binarnym, stosie albo liście zależy i jest zły - duży. W dżewie binarnym, w pszypadku pesymistycznym powstaje lista zamiast dżewa i czas dostępu staje się liniowy, gdy pszeciętnie powinien być zdaje się log o podstawie 2. >Mówię sortowanie bo tak naprawdę chodzi o jak najszybsze >stworzenie pliku indeksowego, NIE. >to jest to osiągnięcie różniące dawne >.ntx czy .cdx z obecnym .myi w MySQL. Samo szukanie to już pestka >bo też może używać szybkiego b-tree i w dodatku na już posortowanych >danych. Dalej nie odrużniasz indeksu i sortowania. Sortowanie nie jest po to by utwozyć indeks, a po to by coś szybko znaleść. -- (tekst bez: ó, ch, rz i -ii) Ortografia to NAWYK, często nielogiczny, ktury ludzie ociężali umysłowo, nażucają bezmyślnie następnym pokoleniom. http://ortografia.3-2-1.pl/
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: M.M.
Date: Wed, 25 Feb 2015 13:02
Date: Wed, 25 Feb 2015 13:02
15 lines
3029 bytes
3029 bytes
On Wednesday, February 25, 2015 at 12:27:14 PM UTC+1, Stokrotka wrote: > >Oczywiście sortowanie może być liniowe (wolniejsze) i np. b-tree > >(szybsze). > Zdaje się, że nie ma jeszcze algorytmu sortowania o liniowej złożoności, > ale są o złożoności bardzo bliskiej n ( czyli liniowej). Najlepszą złożonością jaką można uzyskać w sortowaniu to N*Log(V), gdzie N to ilość danych, a V to ilość wartości. Jeśli w jakimś programie V jest małe i jeśli z góry wiemy że nie przekracza jakiegoś małego M, np M=128, to można zastosować bardzo wydajną implementację takiego sortowania. Ilość operacji to coś około 2*N+M. Pozdrawiam
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: nkab
Date: Wed, 25 Feb 2015 13:36
Date: Wed, 25 Feb 2015 13:36
49 lines
3725 bytes
3725 bytes
W dniu środa, 25 lutego 2015 12:27:14 UTC+1 użytkownik Stokrotka napisał: > > Dalej nie odrużniasz indeksu i sortowania. > Sortowanie nie jest po to by utwozyć indeks, a po to by coś szybko znaleść. > PLIK INDEKSOWY ind1 załozony na polu p1 (nazwiska). indeks czyli: wartość pola p1 nr rekordu po sortowaniu -------------------------------------------- 0000 0001 KACPRZAK 0000 0020 KACZMAREK 0000 0300 KACZYŃSKI 0000 0004 KALISZ 0000 0008 KAŁUŻYŃSKA 0000 0006 KAMIŃSKI 0000 2007 KARBOWNIK 0000 8008 KARDAŚ 0000 9909 KAROLAK 0000 1010 KASPRZAK 0000 0011 KASZTELAN 0000 0012 KEMPA SLECT * FROM t1 USE INDEX (ind1) WHERE p1>="KAMIŃ"; system bazodanowy przeszukuje plik indeksowy w celu znalezienia "KAMIŃ", znalazł, w tabeli t1 skacze do rekordu o numerze 6 i wyświetla wszytkie jego pola (telefon, adres...), dalej już działa w pętli i pokazuje pola rekordów w t1 o nr: 2007 8008 9909 1010 0011 0012 A więc indeks to tu - numer rekordu, ale w rzeczywistości może to być fizyczne położenie rekordu na dysku. Liczy się szybkość znalezienia pierwszego rekordu spełniającego warunek. Andrzej.
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: artiun
Date: Wed, 25 Feb 2015 21:08
Date: Wed, 25 Feb 2015 21:08
64 lines
4541 bytes
4541 bytes
W dniu 2015-02-25 o 14:36, nkab@toya.net.pl pisze: > W dniu środa, 25 lutego 2015 12:27:14 UTC+1 użytkownik Stokrotka napisał: >> >> Dalej nie odrużniasz indeksu i sortowania. >> Sortowanie nie jest po to by utwozyć indeks, a po to by coś szybko znaleść. >> > > > PLIK INDEKSOWY ind1 załozony na polu p1 (nazwiska). > > indeks czyli: wartość pola p1 > nr rekordu po sortowaniu > -------------------------------------------- > 0000 0001 KACPRZAK > 0000 0020 KACZMAREK > 0000 0300 KACZYŃSKI > 0000 0004 KALISZ > 0000 0008 KAŁUŻYŃSKA > 0000 0006 KAMIŃSKI > 0000 2007 KARBOWNIK > 0000 8008 KARDAŚ > 0000 9909 KAROLAK > 0000 1010 KASPRZAK > 0000 0011 KASZTELAN > 0000 0012 KEMPA > > > SLECT * FROM t1 USE INDEX (ind1) WHERE p1>="KAMIŃ"; > > system bazodanowy przeszukuje plik indeksowy w celu znalezienia "KAMIŃ", > > znalazł, > > w tabeli t1 skacze do rekordu o numerze 6 i wyświetla wszytkie jego pola (telefon, adres...), > > dalej już działa w pętli i pokazuje pola rekordów w t1 o nr: > > 2007 > 8008 > 9909 > 1010 > 0011 > 0012 > > > A więc indeks to tu - numer rekordu, ale w rzeczywistości może to być fizyczne > położenie rekordu na dysku. > Liczy się szybkość znalezienia pierwszego rekordu spełniającego warunek. > Tu idzie o przeskok po indeksie. Clippeer mi się przypomina z Browsem: Metoda dobra, kursorem się dało lecieć. Z tym, że o błąd tu idze, masz unikalne nazwiska, a takich Koalskich, Nowaków było wiele. SELECT * jest złym rozwiązaniem, zwraca za dużo i za dużo pamięci zajmuje. Jeśli odpytujesz bazę, to pytaj o to co chcesz uzyskać. Masz pewność, że ktoś nie zrobił sobie w niej danych binarnych obrazki, filmy). A takie pytania nadal się pojawiają. Co się stanie przy select * from tabela przy danych binarnych? > Andrzej. > -- Artur 0 weeks 0 days 0 hours 57 minutes 14 seconds and 653 milliseconds. "pl.comp.bazy-danych"
Re: PostgreSQL - jak najlepiej definiować dynamiczne pola?
Author: nkab
Date: Thu, 26 Feb 2015 10:16
Date: Thu, 26 Feb 2015 10:16
24 lines
3343 bytes
3343 bytes
W dniu środa, 25 lutego 2015 22:12:13 UTC+1 użytkownik artiun napisał: > Tu idzie o przeskok po indeksie. Clippeer mi się przypomina z Browsem: > Metoda dobra, kursorem się dało lecieć. Z tym, że o błąd tu idze, masz > unikalne nazwiska, a takich Koalskich, Nowaków było wiele. SELECT * jest > złym rozwiązaniem, zwraca za dużo i za dużo pamięci zajmuje. Jeśli > odpytujesz bazę, to pytaj o to co chcesz uzyskać. Przecież to tylko dane dla wyjaśnia dla stokrotki "co ja rozumiem przez indeks", a nawet jak Kowalskich jest 1000 to select pokaże te 1000 bo tak chce użytkownik. > Masz pewność, że ktoś nie > zrobił sobie w niej danych binarnych obrazki, filmy). A takie pytania nadal > się pojawiają. Co się stanie przy select * from tabela przy danych binarnych? No z binarnymi jeszcze się nie bawiłem ale podejrzewam, że klucze mają swoje ograniczenia i obrazków jako danych binarnych nie da się zaindeksować ale z danymi bajtowymi zapisanymi znakowo już nie ma problemów (0AC1036A). Andrzej.
Page 3 of 3 • 151 total messages
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads