🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi.bazy-danych
33 messages
33 total messages Started by Pancio Tue, 13 Feb 2018 03:24
Co wybrac - Identity czy sekwencje
#81146
Author: Pancio
Date: Tue, 13 Feb 2018 03:24
13 lines
1229 bytes
Witam,
Zaczynam bawic sie w pisane aplikacji w srodowisku Delphi XE7 i silniku MS SQL w wersji Express 2014 (taka wersja jest w firmie) lub 2016 (byc moze bedzie).
Chodzi mi o to, ze w kilku tabelach uzytkownicy powinni widziec numeracje rekordow ID. O ile do wersji MS SQLa 2008 R2 mozna bylo zastosowac IDENTITY to po wersji 2012 jest juz nieco bardziej problematyczne.
Otoz po restarcie silnika numeracja ID przeskakuje o 1000 rekordow. Nie jest to oczywiscie koniec swiata, ale tez nie wyglada najlepiej.
Poczytalem nieco o sekwencjach i znalazlem taki oto przykad:
CREATE SEQUENCE s1 AS INT START WITH 1 NO CACHE
CREATE TABLE t1 (Id INT PRIMARY KEY DEFAULT NEXT VALUE FOR s1, col INT NOT NULL)

Problem w tym, ze spada troche wydajnosc bazy danych przy wprowadzaniu wiekszej liczby rekordow. Dlatego mam pytanie do Was?
Jakiego rozwiazania uzywacie w swoich projektach - z natury rzeczy Identity odpada, pozostaja sekwencje, a moze po prostu przed dodaniem rekordu powinienem wywolac SELECT Count(*) i sprawdzic ile rekordow jest w tabeli, po czym dodac +1.
Kazde rozwiazanie poprawnie dzialajace jest dobre, ale wiadomo, ze sa dobre i lepsze. Dlatego tez postanowilem zapytac sie bardziej doswiadczonych kolegow.

--
Pancio
Re: Co wybrac - Identity czy sekwencje
#81149
Author: Pancio
Date: Tue, 13 Feb 2018 13:31
9 lines
426 bytes
No i wszystko w temacie.
Czyli zamiast wymyslac tony wlasnych mniej lub bardziej szalnych pomyslow lepiej skorzystac ze sprawdzonych rozwiazan.
A tak juz zupelnie na marginesie, bez zbednej kokieterii - dlaczego rozwiazanie z SELECT (*) Count jest szalone i mialoby sie w przyszlosci posypac? Pytam zupelnie z ciekawosci. Bo moze nie jest to metoda, ktora moznaby polecic, ale dlaczego mialaby sie "sypnac"?

--
Pancio
Re: Co wybrac - Identity czy sekwencje
#81147
Author: wloochacz
Date: Tue, 13 Feb 2018 14:41
6 lines
76 bytes
W dniu 2018-02-13 o 12:24, Pancio pisze:
/ciach/

Sekwencje.

--
wloochacz
Re: Co wybrac - Identity czy sekwencje
#81148
Author: mmm
Date: Tue, 13 Feb 2018 14:52
11 lines
480 bytes
W dniu 2018-02-13 o 12:24, Pancio pisze:
> Otoz po restarcie silnika numeracja ID przeskakuje o 1000 rekordow. Nie jest to oczywiscie koniec swiata, ale tez nie wyglada najlepiej.
> --
> Pancio
>
Chciałbym miec takie problemy ;)
Koncepcja z SELECT Count(*) wydaje mi sie szalona. KOncepcja wymyślanie
własnych metod rozwiązywania problemu wydaje mi sie śmiała. Na pewno nie
będziesz się nudził w przyszłości jak ci się to posypie jak domek z kart.
Uzyj SEQUENCE

M
Re: Co wybrac - Identity czy sekwencje
#81151
Author: Pancio
Date: Wed, 14 Feb 2018 01:36
14 lines
417 bytes
> Bo po skasowaniu rekordu z środka ilość nie będzie odpowiadała
> liczbie maksymalnej?
> 
> To już lepiej SELECT MAX(s1).

No fakt, nie wzialem tego pod uwage.
Tyle, ze nawet tutaj na grupie naczytalem sie, zeby starac sie unikac MAX(col).
Tak czy owak przejde na sekwencje, bo to chyba jest najprostsze (i najbardziej praktyczne) rozwiazanie.
Dzieki za szybka pomoc.

--
Pancio
Re: Co wybrac - Identity czy sekwencje
#81150
Author: MKi
Date: Wed, 14 Feb 2018 09:35
15 lines
559 bytes
> No i wszystko w temacie.
> Czyli zamiast wymyslac tony wlasnych mniej lub bardziej szalnych pomyslow lepiej skorzystac ze sprawdzonych rozwiazan.
> A tak juz zupelnie na marginesie, bez zbednej kokieterii - dlaczego rozwiazanie z SELECT (*) Count jest szalone i mialoby sie w przyszlosci posypac? Pytam zupelnie z ciekawosci. Bo moze nie jest to metoda, ktora moznaby polecic, ale dlaczego mialaby sie "sypnac"?

Bo po skasowaniu rekordu z środka ilość nie będzie odpowiadała
liczbie maksymalnej?

To już lepiej SELECT MAX(s1).

Pozdrowienia,
MKi




Re: Co wybrac - Identity czy sekwencje
#81152
Author: Roman Tyczka
Date: Wed, 14 Feb 2018 12:02
18 lines
836 bytes
On Wed, 14 Feb 2018 09:35:58 +0100, MKi wrote:

>> No i wszystko w temacie.
>> Czyli zamiast wymyslac tony wlasnych mniej lub bardziej szalnych pomyslow lepiej skorzystac ze sprawdzonych rozwiazan.
>> A tak juz zupelnie na marginesie, bez zbednej kokieterii - dlaczego rozwiazanie z SELECT (*) Count jest szalone i mialoby sie w przyszlosci posypac? Pytam zupelnie z ciekawosci. Bo moze nie jest to metoda, ktora moznaby polecic, ale dlaczego mialaby sie "sypnac"?
>
> Bo po skasowaniu rekordu z środka ilość nie będzie odpowiadała
> liczbie maksymalnej?
>
> To już lepiej SELECT MAX(s1).

I jedno i drugie jest du bani, nie z tych powodów co napisałeś.
Chodzi o atomowość operacji. Jeśli tego selecta zawołają jednocześnie die
końcówki i zaczną na wyniku działać to ...?
No właśnie.

--
pozdrawiam
Roman Tyczka
Re: Co wybrac - Identity czy sekwencje
#81153
Author: zpksoft
Date: Thu, 15 Feb 2018 00:09
39 lines
1998 bytes
W dniu wtorek, 13 lutego 2018 12:24:43 UTC+1 użytkownik Pancio napisał:
> Witam,
> Zaczynam bawic sie w pisane aplikacji w srodowisku Delphi XE7 i silniku MS SQL w wersji Express 2014 (taka wersja jest w firmie) lub 2016 (byc moze bedzie).
> Chodzi mi o to, ze w kilku tabelach uzytkownicy powinni widziec numeracje rekordow ID. O ile do wersji MS SQLa 2008 R2 mozna bylo zastosowac IDENTITY to po wersji 2012 jest juz nieco bardziej problematyczne.
> Otoz po restarcie silnika numeracja ID przeskakuje o 1000 rekordow. Nie jest to oczywiscie koniec swiata, ale tez nie wyglada najlepiej.
> Poczytalem nieco o sekwencjach i znalazlem taki oto przykad:
> CREATE SEQUENCE s1 AS INT START WITH 1 NO CACHE
> CREATE TABLE t1 (Id INT PRIMARY KEY DEFAULT NEXT VALUE FOR s1, col INT NOT NULL)
> 
> Problem w tym, ze spada troche wydajnosc bazy danych przy wprowadzaniu wiekszej liczby rekordow. Dlatego mam pytanie do Was?
> Jakiego rozwiazania uzywacie w swoich projektach - z natury rzeczy Identity odpada, pozostaja sekwencje, a moze po prostu przed dodaniem rekordu powinienem wywolac SELECT Count(*) i sprawdzic ile rekordow jest w tabeli, po czym dodac +1.
> Kazde rozwiazanie poprawnie dzialajace jest dobre, ale wiadomo, ze sa dobre i lepsze. Dlatego tez postanowilem zapytac sie bardziej doswiadczonych kolegow.
> 
> --
> Pancio

W ogóle nie używam identyfikatorów liczbowych. Wyłącznie łańcuchowe. Zero problemów. Jeśli masz wybór to zastanów się nad tym. Bardzo duże bazy są oparte tylko na takich identyfikatorach. Zobacz np. filmiki na Youtube: https://youtu.be/jOqktpxdGxg <- tu ID=jOqktpxdGxg. Nie muszą martwić się że gdzieś w sieci ktoś podwójnie zlicza ID. Dodatkowym atutem jest to że taki identyfikator tworzy klient więc może posłużyć się nim zanim wpisze rekord do bazy (!).

Paweł
Re: Co wybrac - Identity czy sekwencje
#81154
Author: wloochacz
Date: Thu, 15 Feb 2018 11:32
19 lines
1131 bytes
W dniu 2018-02-15 o 09:09, zpksoft pisze:
> W dniu wtorek, 13 lutego 2018 12:24:43 UTC+1 użytkownik Pancio napisał:
/ciach/

> W ogóle nie używam identyfikatorów liczbowych. Wyłącznie łańcuchowe. Zero problemów. Jeśli masz wybór to zastanów się nad tym. Bardzo duże bazy są oparte tylko na takich identyfikatorach. Zobacz np. filmiki na Youtube: https://youtu.be/jOqktpxdGxg <- tu ID=jOqktpxdGxg. Nie muszą martwić się że gdzieś w sieci ktoś podwójnie zlicza ID. Dodatkowym atutem jest to że taki identyfikator tworzy klient więc może posłużyć się nim zanim wpisze rekord do bazy (!).

Jeżeli wartość takiego identyfikatora jest generowana jako rosnąca
funkcja monotoniczna, to jest najgorsze z możliwych rozwiązań, jeśli
idzie o wydajność.

Powoduje to poważne problemy z sortowaniem i fragmentacją indeksów.
Chcesz mieć pofragmentowany indeks Primary Key - używaj takich
identyfikatorów.

I właśnie dlatego np. w MS SQL jest specjalna funkcja do kreowania
GUIDów sekwencyjnych:
https://docs.microsoft.com/en-us/sql/t-sql/functions/newsequentialid-transact-sql

--
wloochacz
Re: Co wybrac - Identity czy sekwencje
#81155
Author: zpksoft
Date: Thu, 15 Feb 2018 23:58
51 lines
2377 bytes
W dniu czwartek, 15 lutego 2018 11:32:40 UTC+1 użytkownik wloochacz napisał:
> W dniu 2018-02-15 o 09:09, zpksoft pisze:
> > W dniu wtorek, 13 lutego 2018 12:24:43 UTC+1 użytkownik Pancio napisał:
> /ciach/
> 
> > W ogóle nie używam identyfikatorów liczbowych. Wyłącznie łańcuchowe. Zero problemów. Jeśli masz wybór to zastanów się nad tym. Bardzo duże bazy są oparte tylko na takich identyfikatorach. Zobacz np. filmiki na Youtube: https://youtu.be/jOqktpxdGxg <- tu ID=jOqktpxdGxg. Nie muszą martwić się że gdzieś w sieci ktoś podwójnie zlicza ID. Dodatkowym atutem jest to że taki identyfikator tworzy klient więc może posłużyć się nim zanim wpisze rekord do bazy (!).
> 
> Jeżeli wartość takiego identyfikatora jest generowana jako rosnąca 
> funkcja monotoniczna, to jest najgorsze z możliwych rozwiązań, jeśli 
> idzie o wydajność.
> 
> Powoduje to poważne problemy z sortowaniem i fragmentacją indeksów. 
> Chcesz mieć pofragmentowany indeks Primary Key - używaj takich 
> identyfikatorów.
> 
> I właśnie dlatego np. w MS SQL jest specjalna funkcja do kreowania 
> GUIDów sekwencyjnych:
> https://docs.microsoft.com/en-us/sql/t-sql/functions/newsequentialid-transact-sql
> 
> -- 
> wloochacz

Lata temu stosowałem GUID do tego celu, ale już od dawna stosuję inne rozwiązanie. U mnie identyfikatory łańcuchowe można by rzec są sekwencyjne, można nawet wyliczyć z nich czas powstania.
Niedawno jedna z baz które obsługuję przekroczyła 1TB i można by rzec że chodzi jak młódka. Ogólnie trudno jest przekonać programistów do tego typu identyfikatorów (bojaźń?). Niedawno miałem za zadanie zsynchronizować dwie bazy, ale w pewnym zakresie. Kilka tabel miało identyfikatory liczbowe. Niesamowitą jazdę z tym miałem bo właśnie liczbowe identyfikatory się powtarzały. Nie obeszło się bez zmian logiki w pluginie którego te tabele dotyczyły.

Paweł
Re: Co wybrac - Identity czy sekwencje
#81156
Author: zpksoft
Date: Fri, 16 Feb 2018 01:59
3 lines
103 bytes
Dodam jeszcze że identyfikator tego wątku ma wartość "t9dNA03cFhc" :)

Paweł
Re: Co wybrac - Identity czy sekwencje
#81157
Author: wloochacz
Date: Fri, 16 Feb 2018 12:04
19 lines
588 bytes
W dniu 2018-02-16 o 10:59, zpksoft pisze:
> Dodam jeszcze że identyfikator tego wątku ma wartość "t9dNA03cFhc" :)

Miałem podobne wymagania co do synchronizacji danych lata temu, zatem
powstał pomysł na identyfikator typu:
xxxx.yyyy

Gdzie:
xxxx - wartość z sekwencji
yyyy - identyfikator licencji/oddziału/etc.

Niby klucz złożony, a jednak prosty.
Poza tym, mega-prosto można wyekstrahować dane z odziały. Co w przypadku
hasha wcale nie jest takie oczywiste.

Nie twierdzę, że to jest lepsze czy gorsze rozwiązanie.
Jest jakieś i też się sprawdza.

--
wloochacz
Re: Co wybrac - Identity czy sekwencje
#81158
Author: goo-mlyny@ciach.
Date: Fri, 16 Feb 2018 14:07
7 lines
227 bytes
W dniu piątek, 16 lutego 2018 10:59:59 UTC+1 użytkownik zpksoft napisał:
> Dodam jeszcze że identyfikator tego wątku ma wartość "t9dNA03cFhc" :)
> 
> Paweł

ale się czepiasz...
Re: Co wybrac - Identity czy sekwencje
#81159
Author: zpksoft
Date: Sat, 17 Feb 2018 00:00
32 lines
1621 bytes
W dniu piątek, 16 lutego 2018 23:07:08 UTC+1 użytkownik goo-...@ciach.net napisał:
> W dniu piątek, 16 lutego 2018 10:59:59 UTC+1 użytkownik zpksoft napisał:
> > Dodam jeszcze że identyfikator tego wątku ma wartość "t9dNA03cFhc" :)
> > 
> > Paweł
> 
> ale się czepiasz...

Ani mi w głowie czepianie się. Tylko podaję alternatywę. Docelowo... jedynie słuszną. Takie jest moje przekonanie.
Nie mam najmniejszego zamiaru walczyć z innymi przekonaniami.
Popróbuj identyfikatorów łańcuchowych to już się nie cofniesz.
Zauważyłem już dawno, że bardzo trudno jest programistów na to rozwiązanie namówić. Może dlatego, że podręczniki uczą tylko o liczbowych?
W każdym razie po zastosowaniu identyfikatorów łańcuchowych znika wiele problemów, m. in. z synchronizacją. Na przykład można pracować na oderwanej bazie a potem dane po prostu wrzucić do bazy głównej... Nie spotkamy się z takimi samymi identyfikatorami więc powinno pójść łatwo.
Kolejny przykład: można posłużyć się linkiem w postaci takiego identyfikatora żeby jednoznacznie dotrzeć do właściwego rekordu, nawet jeśli nie wiemy z jakiej tabeli pochodzi. A jak posłużysz się liczbą to nic to nie da... 
Przykładów można by mnożyć. Zachęcam.

Paweł
Re: Co wybrac - Identity czy sekwencje
#81161
Author: zpksoft
Date: Sat, 17 Feb 2018 05:34
114 lines
4953 bytes
W dniu sobota, 17 lutego 2018 10:33:22 UTC+1 użytkownik wloochacz napisał:
> W dniu 2018-02-17 o 09:00, zpksoft pisze:
> > Ani mi w głowie czepianie się. Tylko podaję alternatywę. Docelowo... jedynie słuszną. 
> No to pojechałeś, jedynie słuszną...
> Ciekawym, co jeszcze jest wg Ciebie jedynie słuszne?

To był żart.

> 
> A w sumie nie jestem ciekawy.
> 
> > Takie jest moje przekonanie.

A tu jego uzasadnienie.

> > Nie mam najmniejszego zamiaru walczyć z innymi przekonaniami.
> Ale podajesz "jedynie słuszne" rozwiązania?
> 
> > Popróbuj identyfikatorów łańcuchowych to już się nie cofniesz.
> No nie wiem, ten id jest dłuższy (znaczy więcej miejsca zajmuje) niż 
> numeryczny i kropka.
> 
> I pytanie - jaki ma typ zmienna na to ID w Twoim programie?

char()

> 
> Poza tym, trudniej się go wpisuje z palca - ale to akurat żaden 
> argument... tylko jakiś.

W systemie który prowadzę można  na tabeli wskazać rekord i z menu kontekstowego wybrać opcję "Kopiuj łącze"

Następnie po wklejeniu tego łącza np. do pola tekstowego działa to tak,  że samo najechanie myszą na to łącze pojawia się hint z informacją co ono zawiera. Ctrl+klik na tym łączu otwiera odpowiedni moduł, inicjuje dane i wskazuje cel.

> 
> > Zauważyłem już dawno, że bardzo trudno jest programistów na to rozwiązanie namówić. Może dlatego, że podręczniki uczą tylko o liczbowych?
> A może dlatego, że to jedyne słuszne rozwiązanie? :)
> 

Zobacz gdzie idzie świat. Podałem dwa przykłady: ID na Youtube, ID tego wątku, możesz sobie obejrzeć np. moją partię szachów:
https://lichess.org/3FAcy8OcZxyu gdzie łatwo zauważyć że ID tej partii to "3FAcy8OcZxyu" itd.

> > W każdym razie po zastosowaniu identyfikatorów łańcuchowych znika wiele problemów, m. in. z synchronizacją. Na przykład można pracować na oderwanej bazie a potem dane po prostu wrzucić do bazy głównej... Nie spotkamy się z takimi samymi identyfikatorami więc powinno pójść łatwo.
> Jak się ą synchronizację robi na kolanie to może i tak :D
> Poza tym, podałem inne rozwiązanie na ten problem, z wykorzystaniem 
> "jedynie" słusznego typu numerycznego.

Wybacz, ale moim zdaniem Twoje rozwiązanie jest słabe. Nie zsynchronizujesz tym sposobem dwóch baz które się nie widziały jakiś czas.

> 
> > Kolejny przykład: można posłużyć się linkiem w postaci takiego identyfikatora żeby jednoznacznie dotrzeć do właściwego rekordu, nawet jeśli nie wiemy z jakiej tabeli pochodzi. A jak posłużysz się liczbą to nic to nie da...
> Czytaj wyżej, bo to nieprawda.
> A poza tym - link bezpośredni do rekordu w bazie danych?
> Hmm... jakoś zestawienie tego pomysłu ze słowem "słuszne" budzi we mnie 
> nieokreślony, a wyraźny sprzeciw.
> 
> > Przykładów można by mnożyć. Zachęcam.
> Ja również zachęcam, ale do myślenia i kwesti rozwiązań.
> Ponieważ w ten sposób może, ale nie musi, urodzić się coś ciekawego.
> 
> No i na koniec, inne pytanie; jak generujesz te identyfikatory?

Początkowo, właściwie dla prób wykorzystywałem GUID. Ten brak sekwencyjności nie bardzo mi przeszkadzał bo user pyta zwykle o różną kolejność danych.
Chciałem zbudować uniwersalny ID łańcuchowy w którym zakodowany byłby czas i losowość. Udało mi się opracować identyfikator 12 znakowy np. wygenerowany w tym momencie: "1OeS9r2JykUj". Mogę z niego odczytać czas powstania z dokładnością do dwóch milisekund. Czas zawarty jest w czł. Stosuję te identyfikatory mniej więcej od czerwca 2005 roku i jeszcze nigdy w żadnej bazie nie miałem błędu powstania dwóch takich samych identyfikatorów. 

Mam spora doświadczenie w ich stosowaniu więc co jakiś czas próbuję namówić innych do ich stosowania. Ale ciężko. Bojaźń że coś źle pójdzie? Nie wnikam. Jak komuś coś zaświta to OK, plus dla mnie :)

> 
> -- 
> wloochacz

Paweł
Re: Co wybrac - Identity czy sekwencje
#81160
Author: wloochacz
Date: Sat, 17 Feb 2018 10:33
42 lines
2151 bytes
W dniu 2018-02-17 o 09:00, zpksoft pisze:
> Ani mi w głowie czepianie się. Tylko podaję alternatywę. Docelowo... jedynie słuszną.
No to pojechałeś, jedynie słuszną...
Ciekawym, co jeszcze jest wg Ciebie jedynie słuszne?

A w sumie nie jestem ciekawy.

> Takie jest moje przekonanie.
> Nie mam najmniejszego zamiaru walczyć z innymi przekonaniami.
Ale podajesz "jedynie słuszne" rozwiązania?

> Popróbuj identyfikatorów łańcuchowych to już się nie cofniesz.
No nie wiem, ten id jest dłuższy (znaczy więcej miejsca zajmuje) niż
numeryczny i kropka.

I pytanie - jaki ma typ zmienna na to ID w Twoim programie?

Poza tym, trudniej się go wpisuje z palca - ale to akurat żaden
argument... tylko jakiś.

> Zauważyłem już dawno, że bardzo trudno jest programistów na to rozwiązanie namówić. Może dlatego, że podręczniki uczą tylko o liczbowych?
A może dlatego, że to jedyne słuszne rozwiązanie? :)

> W każdym razie po zastosowaniu identyfikatorów łańcuchowych znika wiele problemów, m. in. z synchronizacją. Na przykład można pracować na oderwanej bazie a potem dane po prostu wrzucić do bazy głównej... Nie spotkamy się z takimi samymi identyfikatorami więc powinno pójść łatwo.
Jak się ą synchronizację robi na kolanie to może i tak :D
Poza tym, podałem inne rozwiązanie na ten problem, z wykorzystaniem
"jedynie" słusznego typu numerycznego.

> Kolejny przykład: można posłużyć się linkiem w postaci takiego identyfikatora żeby jednoznacznie dotrzeć do właściwego rekordu, nawet jeśli nie wiemy z jakiej tabeli pochodzi. A jak posłużysz się liczbą to nic to nie da...
Czytaj wyżej, bo to nieprawda.
A poza tym - link bezpośredni do rekordu w bazie danych?
Hmm... jakoś zestawienie tego pomysłu ze słowem "słuszne" budzi we mnie
nieokreślony, a wyraźny sprzeciw.

> Przykładów można by mnożyć. Zachęcam.
Ja również zachęcam, ale do myślenia i kwestionowania "jedynie
słusznych" rozwiązań.
Ponieważ w ten sposób może, ale nie musi, urodzić się coś ciekawego.

No i na koniec, inne pytanie; jak generujesz te identyfikatory?

--
wloochacz
Re: Co wybrac - Identity czy sekwencje
#81162
Author: Pancio
Date: Mon, 19 Feb 2018 04:50
8 lines
766 bytes
A to przy okazji zadam dodatkowe pytanie, zaznacze od razu na poczatku, ze dzialam w srodowisku Delphi XE7 + MS SQL Server 2014 Express.
W jednej z tabel wykorzystywac bede FileStream, a wiec w tej tabeli musi pojawic sie wiersz typu "uniqueidentifier".
W kodzie SQL generuje go w nastepujacy sposob: SELECT NEWID(), ale czy w samym Delphi moge korzystac z wbudowanej funkcji CreateGUID(Guid: TGUID)?
Testowalem to na kilku przykladach i poki co wyniki mnie zadowalaja, jednak nie chcialbym, aby po roku uzywania aplikacji, nagle zdublowaly sie te unikatowe identyfikatory.
Docelowo baza moze bedzie miala 150-200 tysiecy wierszy.
Uogolniajac pytanie - czy identyfikatory generowane przez samo Delphi jak i SQL Server mozna uznac jako jednakowo unikatowe?

--
Pancio
Re: Co wybrac - Identity czy sekwencje
#81163
Author: wloochacz
Date: Mon, 19 Feb 2018 17:22
8 lines
351 bytes
W dniu 2018-02-19 o 13:50, Pancio pisze:
> Uogolniajac pytanie - czy identyfikatory generowane przez samo Delphi jak i SQL Server mozna uznac jako jednakowo unikatowe?
Jednakowo prawie unikatowe, aby być super precyzyjnym.
I nie generuj tego przez NEWID, tylko NEWSEQUENTIALID po stronie SQLa,
jeśli będzie to PK.
Pisałem o tym...

--
wloochacz
Re: Co wybrac - Identity czy sekwencje
#81164
Author: wloochacz
Date: Mon, 19 Feb 2018 17:36
86 lines
4873 bytes
W dniu 2018-02-17 o 14:34, zpksoft pisze:
/ciach/

>>> Popróbuj identyfikatorów łańcuchowych to już się nie cofniesz.
>> No nie wiem, ten id jest dłuższy (znaczy więcej miejsca zajmuje) niż
>> numeryczny i kropka.
>>
>> I pytanie - jaki ma typ zmienna na to ID w Twoim programie?
>
> char()
To jest typ bazodanowy.
Ja pytałem o typ zmiennej w Delphi.

>> Poza tym, trudniej się go wpisuje z palca - ale to akurat żaden
>> argument... tylko jakiś.
>
> W systemie który prowadzę można  na tabeli wskazać rekord i z menu kontekstowego wybrać opcję "Kopiuj łącze"
>
> Następnie po wklejeniu tego łącza np. do pola tekstowego działa to tak,  że samo najechanie myszą na to łącze pojawia się hint z informacją co ono zawiera. Ctrl+klik na tym łączu otwiera odpowiedni moduł, inicjuje dane i wskazuje cel.
>
>>
>>> Zauważyłem już dawno, że bardzo trudno jest programistów na to rozwiązanie namówić. Może dlatego, że podręczniki uczą tylko o liczbowych?
>> A może dlatego, że to jedyne słuszne rozwiązanie? :)
>>
>
> Zobacz gdzie idzie świat. Podałem dwa przykłady: ID na Youtube, ID tego wątku, możesz sobie obejrzeć np. moją partię szachów:
> https://lichess.org/3FAcy8OcZxyu gdzie łatwo zauważyć że ID tej partii to "3FAcy8OcZxyu" itd.
I co z tego?
Myślisz że za YT stoi zwykła relacyjna baza danych?
No to stoi, ale nie zwykła.
A wiec to żaden argument.

>>> W każdym razie po zastosowaniu identyfikatorów łańcuchowych znika wiele problemów, m. in. z synchronizacją. Na przykład można pracować na oderwanej bazie a potem dane po prostu wrzucić do bazy głównej... Nie spotkamy się z takimi samymi identyfikatorami więc powinno pójść łatwo.
>> Jak się ą synchronizację robi na kolanie to może i tak :D
>> Poza tym, podałem inne rozwiązanie na ten problem, z wykorzystaniem
>> "jedynie" słusznego typu numerycznego.
>
> Wybacz, ale moim zdaniem Twoje rozwiązanie jest słabe. Nie zsynchronizujesz tym sposobem dwóch baz które się nie widziały jakiś czas.
A dlaczego nie da się ich zsynchronizować?
Przecież ten PK nie jest globalny, ale unikalny w kontekście jego
miejsca powstania.
Nie ma duplikatów w bazie centralnej, ponieważ:
1. PK z bazy A będzie mało wartość: 1.0001
2. PK z bazy B będzie mało wartość: 1.0002

Nie widzę żadnego problemu, a kolejną zaletę - mam sekwencyjną wartość.
Poza tym mogę łatwo wyjąć rekordy, które powstały w bazie A czy B tylko
na podstawie samej wartości PK.

Oczywiście jakimś tam problemem jest nadawanie stałej i unikalnej
wartości po przecinku. Wymaga to centralnego repozytorium i właśnie
dlatego ta wartość idzie z licencją, która jest generowana w centralnym
repo.

A więc, gdzie tu słabość?

>>> Kolejny przykład: można posłużyć się linkiem w postaci takiego identyfikatora żeby jednoznacznie dotrzeć do właściwego rekordu, nawet jeśli nie wiemy z jakiej tabeli pochodzi. A jak posłużysz się liczbą to nic to nie da...
>> Czytaj wyżej, bo to nieprawda.
>> A poza tym - link bezpośredni do rekordu w bazie danych?
>> Hmm... jakoś zestawienie tego pomysłu ze słowem "słuszne" budzi we mnie
>> nieokreślony, a wyraźny sprzeciw.
>>
>>> Przykładów można by mnożyć. Zachęcam.
>> Ja również zachęcam, ale do myślenia i kwestionowania "jedynie
>> słusznych" rozwiązań.
>> Ponieważ w ten sposób może, ale nie musi, urodzić się coś ciekawego.
>>
>> No i na koniec, inne pytanie; jak generujesz te identyfikatory?
>
> Początkowo, właściwie dla prób wykorzystywałem GUID. Ten brak sekwencyjności nie bardzo mi przeszkadzał bo user pyta zwykle o różną kolejność danych.
Skoro tak piszesz, to chyba nie do końca rozumiesz jak działa baza
relacyjna.

> Chciałem zbudować uniwersalny ID łańcuchowy w którym zakodowany byłby czas i losowość. Udało mi się opracować identyfikator 12 znakowy np. wygenerowany w tym momencie: "1OeS9r2JykUj". Mogę z niego odczytać czas powstania z dokładnością do dwóch milisekund. Czas zawarty jest w członie "1OeS9r". Stosuję te identyfikatory mniej więcej od czerwca 2005 roku i jeszcze nigdy w żadnej bazie nie miałem błędu powstania dwóch takich samych identyfikatorów.
Unikalność to nie problem, ale co z sekwencyjnością?

> Mam spora doświadczenie w ich stosowaniu więc co jakiś czas próbuję namówić innych do ich stosowania. Ale ciężko. Bojaźń że coś źle pójdzie? Nie wnikam. Jak komuś coś zaświta to OK, plus dla mnie :)
Tu nie chodzi o bojaźń, tylko o możliwe problemy wydajnościowe z
przyczyn, które można wyeliminować na samym początku.

To, że Ty ich nie masz (problemów wydajnościowych), nie oznacza że np.
ja ich nie będę miał.
Zapewniam Cię, że mamy zupełnie różne wymagania co bazy danych i jej
architektury.

--
wloochacz
Re: Co wybrac - Identity czy sekwencje
#81165
Author: Roman Tyczka
Date: Mon, 19 Feb 2018 18:28
18 lines
1290 bytes
On Mon, 19 Feb 2018 17:36:02 +0100, wloochacz wrote:

>> Początkowo, właściwie dla prób wykorzystywałem GUID. Ten brak sekwencyjności nie bardzo mi przeszkadzał bo user pyta zwykle o różną kolejność danych.
> Skoro tak piszesz, to chyba nie do końca rozumiesz jak działa baza
> relacyjna.
>
>> Chciałem zbudować uniwersalny ID łańcuchowy w którym zakodowany byłby czas i losowość. Udało mi się opracować identyfikator 12 znakowy np. wygenerowany w tym momencie: "1OeS9r2JykUj". Mogę z niego odczytać czas powstania z dokładnością do dwóch milisekund. Czas zawarty jest w członie "1OeS9r". Stosuję te identyfikatory mniej więcej od czerwca 2005 roku i jeszcze nigdy w żadnej bazie nie miałem błędu powstania dwóch takich samych identyfikatorów.
> Unikalność to nie problem, ale co z sekwencyjnością?

Tak z ciekawości... po co sekwencyjność w PK? PK ma za zadanie gwarantować
unikalność i to jest jego fundamentalna cecha. Baza i tak jak potrzeba to
ma jakieś kolumny z timestampem czy innym kluczem trzymającym sekwencyjność
w jakimś kontekście typu data urodzenia, data sprzedaży, numer kolejny
dokumentu sprzedaży itp. Po co więc tak bardzo forsujesz konieczność
posiadania sekwencyjności w PK?

--
pozdrawiam
Roman Tyczka
Re: Co wybrac - Identity czy sekwencje
#81166
Author: wloochacz
Date: Mon, 19 Feb 2018 22:53
43 lines
2096 bytes
W dniu 2018-02-19 o 18:28, Roman Tyczka pisze:
> On Mon, 19 Feb 2018 17:36:02 +0100, wloochacz wrote:
>
>>> Początkowo, właściwie dla prób wykorzystywałem GUID. Ten brak sekwencyjności nie bardzo mi przeszkadzał bo user pyta zwykle o różną kolejność danych.
>> Skoro tak piszesz, to chyba nie do końca rozumiesz jak działa baza
>> relacyjna.
>>
>>> Chciałem zbudować uniwersalny ID łańcuchowy w którym zakodowany byłby czas i losowość. Udało mi się opracować identyfikator 12 znakowy np. wygenerowany w tym momencie: "1OeS9r2JykUj". Mogę z niego odczytać czas powstania z dokładnością do dwóch milisekund. Czas zawarty jest w członie "1OeS9r". Stosuję te identyfikatory mniej więcej od czerwca 2005 roku i jeszcze nigdy w żadnej bazie nie miałem błędu powstania dwóch takich samych identyfikatorów.
>> Unikalność to nie problem, ale co z sekwencyjnością?
>
> Tak z ciekawości... po co sekwencyjność w PK?
Performance!

> PK ma za zadanie gwarantować
> unikalność i to jest jego fundamentalna cecha.
Tak, ale co wyszukiwaniem danych?
A wyszukiwanie to również złączenia.

> Baza i tak jak potrzeba to
> ma jakieś kolumny z timestampem czy innym kluczem trzymającym sekwencyjność
> w jakimś kontekście typu data urodzenia, data sprzedaży, numer kolejny
> dokumentu sprzedaży itp. Po co więc tak bardzo forsujesz konieczność
> posiadania sekwencyjności w PK?
No naprawdę...

Pierwsze z brzegu:
https://tomharrisonjr.com/uuid-or-guid-as-primary-keys-be-careful-7b2aa3dcb439

Krótko: fragmentacja, a to nas prowadzi do kolejnych wniosków:
https://blog.sqlauthority.com/2007/03/30/sql-server-index-seek-vs-index-scan-table-scan/

itd. itp.

W każdej bazie jest mniej więcej podobnie.

Poza tym, Paweł pisze o tym, że taki YT ma coś jak UUID jako klucz. Nie
wydaje mi się. Wydaje mi się, że na zewnątrz jest to UUID, ale wewnątrz
systemu jest to inna wartość (np. Int64), która nie jest eksponowana na
zewnątrz.
Ale w sumie nie mam na moje "wydaje się" dowodów na to i nie chce mi się
szukać.

--
wloochacz
Re: Co wybrac - Identity czy sekwencje
#81167
Author: zpksoft
Date: Mon, 19 Feb 2018 23:52
56 lines
1863 bytes
W dniu poniedziałek, 19 lutego 2018 17:36:04 UTC+1 użytkownik wloochacz napisał:
> W dniu 2018-02-17 o 14:34, zpksoft pisze:
> /ciach/
> 
> >>> Popróbuj identyfikatorów łańcuchowych to już się nie cofniesz.
> >> No nie wiem, ten id jest dłuższy (znaczy więcej miejsca zajmuje) niż
> >> numeryczny i kropka.
> >>
> >> I pytanie - jaki ma typ zmienna na to ID w Twoim programie?
> > 
> > char()
> To jest typ bazodanowy.
> Ja pytałem o typ zmiennej w Delphi.

string

<ciach>
> > Wybacz, ale moim zdaniem Twoje rozwiązanie jest słabe. Nie zsynchronizujesz tym sposobem dwóch baz które się nie widziały jakiś czas.
> A dlaczego nie da się ich zsynchronizować?
> Przecież ten PK nie jest globalny, ale unikalny w kontekście jego 
> miejsca powstania.
> Nie ma duplikatów w bazie centralnej, ponieważ:
> 1. PK z bazy A będzie mało wartość: 1.0001
> 2. PK z bazy B będzie mało wartość: 1.0002
> 
> Nie widzę żadnego problemu, a kolejną zaletę - mam sekwencyjną wartość. 
> Poza tym mogę łatwo wyjąć rekordy, które powstały w bazie A czy B tylko 
> na podstawie samej wartości PK.
> 
> Oczywiście jakimś tam problemem jest nadawanie stałej i unikalnej 
> wartości po przecinku. Wymaga to centralnego repozytorium i właśnie 
> dlatego ta wartość idzie z licencją, która jest generowana w centralnym 
> repo.
> 
> A więc, gdzie tu słabość?
> 

Słabość jest w tym, że musisz pilnować unikalności samej bazy, czyli czynnika A, B...

<ciach> 
> -- 
> wloochacz

Paweł
Re: Co wybrac - Identity czy sekwencje
#81168
Author: zpksoft
Date: Tue, 20 Feb 2018 02:30
54 lines
2616 bytes
W dniu poniedziałek, 19 lutego 2018 18:28:16 UTC+1 użytkownik Roman Tyczka napisał:
> On Mon, 19 Feb 2018 17:36:02 +0100, wloochacz wrote:
> 
> >> Początkowo, właściwie dla prób wykorzystywałem GUID. Ten brak sekwencyjności nie bardzo mi przeszkadzał bo user pyta zwykle o różną kolejność danych.
> > Skoro tak piszesz, to chyba nie do końca rozumiesz jak działa baza 
> > relacyjna.
> > 
> >> Chciałem zbudować uniwersalny ID łańcuchowy w którym zakodowany byłby czas i losowość. Udało mi się opracować identyfikator 12 znakowy np. wygenerowany w tym momencie: "1OeS9r2JykUj". Mogę z niego odczytać czas powstania z dokładnością do dwóch milisekund. Czas zawarty jest w członie "1OeS9r". Stosuję te identyfikatory mniej więcej od czerwca 2005 roku i jeszcze nigdy w żadnej bazie nie miałem błędu powstania dwóch takich samych identyfikatorów.
> > Unikalność to nie problem, ale co z sekwencyjnością?
> 
> Tak z ciekawości... po co sekwencyjność w PK? PK ma za zadanie gwarantować
> unikalność i to jest jego fundamentalna cecha. Baza i tak jak potrzeba to
> ma jakieś kolumny z timestampem czy innym kluczem trzymającym sekwencyjność
> w jakimś kontekście typu data urodzenia, data sprzedaży, numer kolejny
> dokumentu sprzedaży itp. Po co więc tak bardzo forsujesz konieczność
> posiadania sekwencyjności w PK? 
> 
> -- 
> pozdrawiam
> Roman Tyczka

Owa sekwencyjność jest moim zdaniem przereklamowana. 
Nawet jeśli pole typu integer stanowi indeks unikalny to wcale nie oznacza, że nie możemy wrzucić do bazy dane w kolejności 1, 5, 4, 7, 3. 
Najważniejsza jest unikalność.
To nie określone pole jest indeksem tylko dla określonego pola możemy zdefiniować indeks. Oznacza to tyle, że baza oprócz naszej kolumny w tabeli przechowuje oddzielnie również swój porządek.
Najłatwiej przekonać się o tym wywołując select na zwykłej kolumnie łańcuchowej.
Baza będzie szukać długo.
Jeśli nałożymy indeks na tę kolumnę to szukanie będzie błyskawiczne, niezależnie od tego czy dane w tej kolumnie będą sekwencyjne.

Paweł
Re: Co wybrac - Identity czy sekwencje
#81174
Author: zpksoft
Date: Tue, 20 Feb 2018 11:05
75 lines
3716 bytes
W dniu wtorek, 20 lutego 2018 14:09:20 UTC+1 użytkownik Roman Tyczka napisał:
> On Tue, 20 Feb 2018 02:30:39 -0800 (PST), zpksoft wrote:
> 
> >>>> Początkowo, właściwie dla prób wykorzystywałem GUID. Ten brak sekwencyjności nie bardzo mi przeszkadzał bo user pyta zwykle o różną kolejność danych.
> >>> Skoro tak piszesz, to chyba nie do końca rozumiesz jak działa baza 
> >>> relacyjna.
> >>> 
> >>>> Chciałem zbudować uniwersalny ID łańcuchowy w którym zakodowany byłby czas i losowość. Udało mi się opracować identyfikator 12 znakowy np. wygenerowany w tym momencie: "1OeS9r2JykUj". Mogę z niego odczytać czas powstania z dokładnością do dwóch milisekund. Czas zawarty jest w członie "1OeS9r". Stosuję te identyfikatory mniej więcej od czerwca 2005 roku i jeszcze nigdy w żadnej bazie nie miałem błędu powstania dwóch takich samych identyfikatorów.
> >>> Unikalność to nie problem, ale co z sekwencyjnością?
> >> 
> >> Tak z ciekawości... po co sekwencyjność w PK? PK ma za zadanie gwarantować
> >> unikalność i to jest jego fundamentalna cecha. Baza i tak jak potrzeba to
> >> ma jakieś kolumny z timestampem czy innym kluczem trzymającym sekwencyjność
> >> w jakimś kontekście typu data urodzenia, data sprzedaży, numer kolejny
> >> dokumentu sprzedaży itp. Po co więc tak bardzo forsujesz konieczność
> >> posiadania sekwencyjności w PK? 
> > 
> > Owa sekwencyjność jest moim zdaniem przereklamowana. 
> > Nawet jeśli pole typu integer stanowi indeks unikalny to wcale nie oznacza, że nie możemy wrzucić do bazy dane w kolejności 1, 5, 4, 7, 3. 
> > Najważniejsza jest unikalność.
> > To nie określone pole jest indeksem tylko dla określonego pola możemy zdefiniować indeks. Oznacza to tyle, że baza oprócz naszej kolumny w tabeli przechowuje oddzielnie również swój porządek.
> > Najłatwiej przekonać się o tym wywołując select na zwykłej kolumnie łańcuchowej.
> > Baza będzie szukać długo.
> > Jeśli nałożymy indeks na tę kolumnę to szukanie będzie błyskawiczne, niezależnie od tego czy dane w tej kolumnie będą sekwencyjne.
> 
> No jednak nie do końca. Poczytaj to co wloochacz zalinkował.
> I to ma jednak sens. Jeśli kolumna ma wartości sekwencyjne to indeks będzie
> dużo skuteczniej zbudowany i mniej odczytów będzie potrzebnych by go
> przeskanować. Nawet użycie algorytmu typu b+tree nie zniweluje zupełnie
> konieczności większej liczby odczytów indeksu niż wtedy, gdy jest on
> sekwencyjny (tu nawet prostackie wyszukiwanie binarne będzie szybkie).
> 
> -- 
> pozdrawiam
> Roman Tyczka

Poczytałem. Jednak nie ekscytował bym się zbytnio tymi publikacjami. Szczególnie w jednym autor sprawiał wrażenie że nie bardzo rozumie co się dzieje jeżeli utworzymy indeks na kolumnie tekstowej. Ale to tylko moje zdanie. 
Pracuję od lat prawie wyłącznie na indeksach łańcuchowych więc wiem jaka jest sprawność bazy, szybkość złożonych zapytań.
Naprawdę nie ma się czego bać.

Paweł
Re: Co wybrac - Identity czy sekwencje
#81175
Author: zpksoft
Date: Tue, 20 Feb 2018 11:12
21 lines
857 bytes
W dniu wtorek, 20 lutego 2018 14:19:03 UTC+1 użytkownik wloochacz napisał:
> W dniu 2018-02-20 o 11:30, zpksoft pisze:
> /ciach/
> Oczywiście to i tak lepiej niż full-scan-table, ale gorzej niż index-seek.
> A to jest ciut dalej od "błyskawicznie".
> A to z kolei oznacza, że nawet nie rzuciłeś okiem na linki, które 
> podesłałem.
> 
> -- 
> wloochacz

Poczytałem, ale nie są one pisane przez kogoś kto ma doświadczenie w indeksach łańcuchowych. 
Generalnie: liczba będzie szybsza do przetworzenia niż łańcuch, chociażby ze względu na ilość zajmowanej pamięci. Jednak uważam, że warto wejść w indeksy łańcuchowe bo są zaskakująco szybkie (!).

Paweł
Re: Co wybrac - Identity czy sekwencje
#81176
Author: zpksoft
Date: Tue, 20 Feb 2018 11:19
48 lines
1338 bytes
W dniu wtorek, 20 lutego 2018 14:06:04 UTC+1 użytkownik wloochacz napisał:
> W dniu 2018-02-20 o 08:52, zpksoft pisze:
> > W dniu poniedziałek, 19 lutego 2018 17:36:04 UTC+1 użytkownik wloochacz napisał:
> >> W dniu 2018-02-17 o 14:34, zpksoft pisze:
> >> /ciach/
> >>
> >>>>> Popróbuj identyfikatorów łańcuchowych to już się nie cofniesz.
> >>>> No nie wiem, ten id jest dłuższy (znaczy więcej miejsca zajmuje) niż
> >>>> numeryczny i kropka.
> >>>>
> >>>> I pytanie - jaki ma typ zmienna na to ID w Twoim programie?
> >>>
> >>> char()
> >> To jest typ bazodanowy.
> >> Ja pytałem o typ zmiennej w Delphi.
> > 
> > string
> Skoro to char(12), to powinien być to:
> type
>    TdbPKType = string[12];
> 
> ewentualnie ShortString.
> Ale ja Cię uczył nie będę, ponieważ przecież wiesz lepiej.
> 
> Przesadzam?
> Być może.
> 

A po co Ci to było? Żeby mi udowodnić że nie wiem co to ShortString? Cze żeby się popisać? Tylko nie wiem czym.

> > <ciach>
> 
> A poza tym - nagle uważasz, że da się synchronizować bazy danych, które 
> się nie widziały od dawna?

Moje? Tak.

> 
> -- 
> wloochacz

Paweł
Re: Co wybrac - Identity czy sekwencje
#81169
Author: wloochacz
Date: Tue, 20 Feb 2018 14:05
59 lines
2147 bytes
W dniu 2018-02-20 o 08:52, zpksoft pisze:
> W dniu poniedziałek, 19 lutego 2018 17:36:04 UTC+1 użytkownik wloochacz napisał:
>> W dniu 2018-02-17 o 14:34, zpksoft pisze:
>> /ciach/
>>
>>>>> Popróbuj identyfikatorów łańcuchowych to już się nie cofniesz.
>>>> No nie wiem, ten id jest dłuższy (znaczy więcej miejsca zajmuje) niż
>>>> numeryczny i kropka.
>>>>
>>>> I pytanie - jaki ma typ zmienna na to ID w Twoim programie?
>>>
>>> char()
>> To jest typ bazodanowy.
>> Ja pytałem o typ zmiennej w Delphi.
>
> string
Skoro to char(12), to powinien być to:
type
   TdbPKType = string[12];

ewentualnie ShortString.
Ale ja Cię uczył nie będę, ponieważ przecież wiesz lepiej.

Przesadzam?
Być może.

Poza tym, takie podejście ma sens jeśli programujesz zgodnie z OOP i
używasz np. DTO i serwera aplikacyjnego, a złożyłem że tak jest.
I pewnie się zagalopowałem :/

> <ciach>
>>> Wybacz, ale moim zdaniem Twoje rozwiązanie jest słabe. Nie zsynchronizujesz tym sposobem dwóch baz które się nie widziały jakiś czas.
>> A dlaczego nie da się ich zsynchronizować?
>> Przecież ten PK nie jest globalny, ale unikalny w kontekście jego
>> miejsca powstania.
>> Nie ma duplikatów w bazie centralnej, ponieważ:
>> 1. PK z bazy A będzie mało wartość: 1.0001
>> 2. PK z bazy B będzie mało wartość: 1.0002
>>
>> Nie widzę żadnego problemu, a kolejną zaletę - mam sekwencyjną wartość.
>> Poza tym mogę łatwo wyjąć rekordy, które powstały w bazie A czy B tylko
>> na podstawie samej wartości PK.
>>
>> Oczywiście jakimś tam problemem jest nadawanie stałej i unikalnej
>> wartości po przecinku. Wymaga to centralnego repozytorium i właśnie
>> dlatego ta wartość idzie z licencją, która jest generowana w centralnym
>> repo.
>>
>> A więc, gdzie tu słabość?
>>
>
> Słabość jest w tym, że musisz pilnować unikalności samej bazy, czyli czynnika A, B...
Napisałem Ci jak można sobie z tym poradzić, aby miało to ręce i nogi.
Trzeba było nie ciachać...

A poza tym - nagle uważasz, że da się synchronizować bazy danych, które
się nie widziały od dawna?

--
wloochacz
Re: Co wybrac - Identity czy sekwencje
#81170
Author: Roman Tyczka
Date: Tue, 20 Feb 2018 14:09
33 lines
2475 bytes
On Tue, 20 Feb 2018 02:30:39 -0800 (PST), zpksoft wrote:

>>>> Początkowo, właściwie dla prób wykorzystywałem GUID. Ten brak sekwencyjności nie bardzo mi przeszkadzał bo user pyta zwykle o różną kolejność danych.
>>> Skoro tak piszesz, to chyba nie do końca rozumiesz jak działa baza
>>> relacyjna.
>>>
>>>> Chciałem zbudować uniwersalny ID łańcuchowy w którym zakodowany byłby czas i losowość. Udało mi się opracować identyfikator 12 znakowy np. wygenerowany w tym momencie: "1OeS9r2JykUj". Mogę z niego odczytać czas powstania z dokładnością do dwóch milisekund. Czas zawarty jest w członie "1OeS9r". Stosuję te identyfikatory mniej więcej od czerwca 2005 roku i jeszcze nigdy w żadnej bazie nie miałem błędu powstania dwóch takich samych identyfikatorów.
>>> Unikalność to nie problem, ale co z sekwencyjnością?
>>
>> Tak z ciekawości... po co sekwencyjność w PK? PK ma za zadanie gwarantować
>> unikalność i to jest jego fundamentalna cecha. Baza i tak jak potrzeba to
>> ma jakieś kolumny z timestampem czy innym kluczem trzymającym sekwencyjność
>> w jakimś kontekście typu data urodzenia, data sprzedaży, numer kolejny
>> dokumentu sprzedaży itp. Po co więc tak bardzo forsujesz konieczność
>> posiadania sekwencyjności w PK?
>
> Owa sekwencyjność jest moim zdaniem przereklamowana.
> Nawet jeśli pole typu integer stanowi indeks unikalny to wcale nie oznacza, że nie możemy wrzucić do bazy dane w kolejności 1, 5, 4, 7, 3.
> Najważniejsza jest unikalność.
> To nie określone pole jest indeksem tylko dla określonego pola możemy zdefiniować indeks. Oznacza to tyle, że baza oprócz naszej kolumny w tabeli przechowuje oddzielnie również swój porządek.
> Najłatwiej przekonać się o tym wywołując select na zwykłej kolumnie łańcuchowej.
> Baza będzie szukać długo.
> Jeśli nałożymy indeks na tę kolumnę to szukanie będzie błyskawiczne, niezależnie od tego czy dane w tej kolumnie będą sekwencyjne.

No jednak nie do końca. Poczytaj to co wloochacz zalinkował.
I to ma jednak sens. Jeśli kolumna ma wartości sekwencyjne to indeks będzie
dużo skuteczniej zbudowany i mniej odczytów będzie potrzebnych by go
przeskanować. Nawet użycie algorytmu typu b+tree nie zniweluje zupełnie
konieczności większej liczby odczytów indeksu niż wtedy, gdy jest on
sekwencyjny (tu nawet prostackie wyszukiwanie binarne będzie szybkie).

--
pozdrawiam
Roman Tyczka
Re: Co wybrac - Identity czy sekwencje
#81171
Author: wloochacz
Date: Tue, 20 Feb 2018 14:19
41 lines
1913 bytes
W dniu 2018-02-20 o 11:30, zpksoft pisze:
/ciach/

> Owa sekwencyjność jest moim zdaniem przereklamowana.
A to zdanie opierasz na czym?
Zaklinaniu?

> Nawet jeśli pole typu integer stanowi indeks unikalny to wcale nie oznacza, że nie możemy wrzucić do bazy dane w kolejności 1, 5, 4, 7, 3.
Możemy, a jakże.
Ale po to się buduje AutoNumer, sekwencje czy generatory, aby tak tego
nie robić.
To, ze coś można zrobić, nie oznacza, że tak powinno się robić.
Tłumaczę od wczoraj, dlaczego nie powinno się tak tego robić.
Ale grochem o ścianę - przecież Wam działa błyskawicznie, tzn. jest
super-duper.
Otóż - nie jest.

> Najważniejsza jest unikalność.
Skoro tak uważasz, to mam dla Ciebie propozycję.
Zrezygnuj z Primary Key i załóż tylko ograniczenie na unikalność
wartości pola.

> To nie określone pole jest indeksem tylko dla określonego pola możemy zdefiniować indeks.
Indeks posiada wartości z pola, na podstawie którego jest zbudowany.
Tworzony jest przyrostowe wg dodawanych wartości do tabeli wg pola.
Dlatego tak ważna jest sekwencyjność danych dla wartości pól dla indeksu
Primary Key.

> Oznacza to tyle, że baza oprócz naszej kolumny w tabeli przechowuje oddzielnie również swój porządek.
> Najłatwiej przekonać się o tym wywołując select na zwykłej kolumnie łańcuchowej.
> Baza będzie szukać długo.
> Jeśli nałożymy indeks na tę kolumnę to szukanie będzie błyskawiczne, niezależnie od tego czy dane w tej kolumnie będą sekwencyjne.
Wyszukiwanie będzie szybsze, ponieważ użyty zostanie indeks.
Ale nie zostanie użyte wyszukiwanie w indeksie, tylko skanowanie
indeksu. Taka to drobna różnica...
Oczywiście to i tak lepiej niż full-scan-table, ale gorzej niż index-seek.
A to jest ciut dalej od "błyskawicznie".
A to z kolei oznacza, że nawet nie rzuciłeś okiem na linki, które
podesłałem.

--
wloochacz
Re: Co wybrac - Identity czy sekwencje
#81172
Author: wloochacz
Date: Tue, 20 Feb 2018 14:19
11 lines
550 bytes
W dniu 2018-02-20 o 14:09, Roman Tyczka pisze:
> No jednak nie do końca. Poczytaj to co wloochacz zalinkował.
> I to ma jednak sens. Jeśli kolumna ma wartości sekwencyjne to indeks będzie
> dużo skuteczniej zbudowany i mniej odczytów będzie potrzebnych by go
> przeskanować. Nawet użycie algorytmu typu b+tree nie zniweluje zupełnie
> konieczności większej liczby odczytów indeksu niż wtedy, gdy jest on
> sekwencyjny (tu nawet prostackie wyszukiwanie binarne będzie szybkie).
Właśnie!
W końcu do kogoś dotarło :D

--
wloochacz
Re: Co wybrac - Identity czy sekwencje
#81173
Author: "Krzysztof Szysz
Date: Tue, 20 Feb 2018 19:59
40 lines
1945 bytes
> > Jeśli nałożymy indeks na tę kolumnę to szukanie będzie błyskawiczne, niezależnie od tego czy
> > dane w tej kolumnie będą sekwencyjne.
> Wyszukiwanie będzie szybsze, ponieważ użyty zostanie indeks.
> Ale nie zostanie użyte wyszukiwanie w indeksie, tylko skanowanie indeksu. Taka to drobna
> różnica...
> Oczywiście to i tak lepiej niż full-scan-table, ale gorzej niż index-seek.

Tak sobie czytam te wasze rozważania i mam kilka uwag:

Dlaczego uważasz, że "nie zostanie użyte wyszukiwanie w indeksie, tylko skanowanie indeksu"?
Przecież po to zakłada się indeks na danym polu, żeby wyszukiwać po indeksie, bo indeks z założenia
jest zawsze sekwencyjny,
a głównym kosztem wyszukiwania po indeksie jest czas porównania indeksowanych wartości, który zawsze
będzie większy dla
stringów, niż dla prostego INT.

Skoro wartości w kolumnie są sekwencyjne, to indeks założony na tej kolumnie będzie powielał
kolejność rekordów w tabeli.
Zyskiem podczas wyszukiwania jest odczyt indeksu o mniejszych rozmiarach, zamiast odczytu pełnych
rekordów z tabeli.
Natomiast aktualizacja takiego indeksu po dodaniu nowych rekordów będzie szybsza, bo jedynie
dopisujemy kolejne wartości
na końcu bez konieczności przebudowywania indeksu na początku, czy w środku i według mnie to jest
jedyny zysk ze stosowania
sekwencyjnego PK, ale to będzie odczuwalne dopiero przy naprawdę dużych tabelach.

I jeszcze jedno osobiste pytanie: dlaczego wybrałeś jako PK typ rzeczywisty, a nie np. BIG INT
(Int64), na którym mógłbyś
dokonać takiego samego podziału na numer z bazy danych i numer z licencji, a przy porównaniach
powinien być szybszy?


--
pozdrowienia
Krzysztof Szyszka, X-Files Software
Developer of X-DBGrid Component
Embarcadero Technology Partner
http://www.x-files.pl/
Join to "Delphi X-DBGrid Component Community"
https://plus.google.com/#communities/100842098152269100547
Re: Co wybrac - Identity czy sekwencje
#81177
Author: Miroo
Date: Wed, 21 Feb 2018 08:50
30 lines
2002 bytes
W dniu 2018-02-19 o 18:28, Roman Tyczka pisze:
> On Mon, 19 Feb 2018 17:36:02 +0100, wloochacz wrote:
>
>>> Początkowo, właściwie dla prób wykorzystywałem GUID. Ten brak sekwencyjności nie bardzo mi przeszkadzał bo user pyta zwykle o różną kolejność danych.
>> Skoro tak piszesz, to chyba nie do końca rozumiesz jak działa baza
>> relacyjna.
>>
>>> Chciałem zbudować uniwersalny ID łańcuchowy w którym zakodowany byłby czas i losowość. Udało mi się opracować identyfikator 12 znakowy np. wygenerowany w tym momencie: "1OeS9r2JykUj". Mogę z niego odczytać czas powstania z dokładnością do dwóch milisekund. Czas zawarty jest w członie "1OeS9r". Stosuję te identyfikatory mniej więcej od czerwca 2005 roku i jeszcze nigdy w żadnej bazie nie miałem błędu powstania dwóch takich samych identyfikatorów.
>> Unikalność to nie problem, ale co z sekwencyjnością?
>
> Tak z ciekawości... po co sekwencyjność w PK? PK ma za zadanie gwarantować
> unikalność i to jest jego fundamentalna cecha. Baza i tak jak potrzeba to
> ma jakieś kolumny z timestampem czy innym kluczem trzymającym sekwencyjność
> w jakimś kontekście typu data urodzenia, data sprzedaży, numer kolejny
> dokumentu sprzedaży itp. Po co więc tak bardzo forsujesz konieczność
> posiadania sekwencyjności w PK?
>

O ile dobrze pamiętam to np w MSSQL rekordy tabeli są ułożone wg klucza
głównego i wg niego dzielone na strony.
Gdy wstawiasz nowy rekord z PK > max(PK) to się po prostu dopisuje na
końcu, jeśli min(PK) < PK < max(PK) to rekord wstawiany jest w środek i
dane trzeba przesuwać, często wstawiać nowe strony w środek tabeli, a to
mocno wpływa na wydajność i powoduje dużą fragmentację bazy (co też
wpływa na wydajność).

GUID (sekwencyjny czy nie) ma jeszcze jedną dużą wadę - rozmiar. Przez
duży rozmiar w cache mieści znacznie mniej informacji (np o joinach) i
serwer częściej musi sięgać do danych fizycznych na dysku.

Pozdrawiam
Re: Co wybrac - Identity czy sekwencje
#81178
Author: wloochacz
Date: Thu, 01 Mar 2018 12:23
60 lines
2753 bytes
W dniu 2018-02-20 o 19:59, Krzysztof Szyszka pisze:
>> > Jeśli nałożymy indeks na tę kolumnę to szukanie będzie błyskawiczne,
>> niezależnie od tego czy > dane w tej kolumnie będą sekwencyjne.
>> Wyszukiwanie będzie szybsze, ponieważ użyty zostanie indeks.
>> Ale nie zostanie użyte wyszukiwanie w indeksie, tylko skanowanie
>> indeksu. Taka to drobna różnica...
>> Oczywiście to i tak lepiej niż full-scan-table, ale gorzej niż
>> index-seek.
>
> Tak sobie czytam te wasze rozważania i mam kilka uwag:
>
> Dlaczego uważasz, że "nie zostanie użyte wyszukiwanie w indeksie, tylko
> skanowanie indeksu"?
> Przecież po to zakłada się indeks na danym polu, żeby wyszukiwać po
> indeksie, bo indeks z założenia jest zawsze sekwencyjny,
Czepiłem się właśnie wartości *niesekwencyjnych* dla indeksów, zwłaszcza
klastrowych - czyli PK.
A takie założenie zmienia postać rzeczy, prawda?

Naprawdę nie chce mi się tłumaczyć niuansów, zwłaszcza osobom którym
przecież działa.
No i na zdrowie.

> a głównym kosztem wyszukiwania po indeksie jest czas porównania
> indeksowanych wartości, który zawsze będzie większy dla
> stringów, niż dla prostego INT.
Nie chodzi o wielkość danych sensu stricte, ale oczywiście to też ma
znaczenie.

> Skoro wartości w kolumnie są sekwencyjne, to indeks założony na tej
> kolumnie będzie powielał kolejność rekordów w tabeli.
Generalnie tak, ale niekoniecznie.
Poza tym, dlatego na samym początku pisałem o wartościach generowanych
przez rosnącą funkcję monotoniczną - przeoczyłeś?

> Zyskiem podczas wyszukiwania jest odczyt indeksu o mniejszych
> rozmiarach, zamiast odczytu pełnych rekordów z tabeli.
> Natomiast aktualizacja takiego indeksu po dodaniu nowych rekordów będzie
> szybsza, bo jedynie dopisujemy kolejne wartości
> na końcu bez konieczności przebudowywania indeksu na początku, czy w
> środku i według mnie to jest jedyny zysk ze stosowania
> sekwencyjnego PK, ale to będzie odczuwalne dopiero przy naprawdę dużych
> tabelach.
Zakładasz wartości sekwencyjne dla indeksu.
Ja pisałem o przypadku dokładnie odwrotnym bo taki to został podniesiony
jako super-duper rewelacja na wartości dla PK.

A to g...o prawda!

> I jeszcze jedno osobiste pytanie: dlaczego wybrałeś jako PK typ
> rzeczywisty, a nie np. BIG INT (Int64), na którym mógłbyś
> dokonać takiego samego podziału na numer z bazy danych i numer z
> licencji, a przy porównaniach powinien być szybszy?
Dlaczego szybszy, skoro mój typ to nie jakiś tam float, a
stałoprzecinkowy, który jest reprezentowany jako Int64 (e.g. Currency w
Delphi) właśnie?

A poza tym, tak  mi się zwyczajnie wydawało wygodniej.

--
wloochacz
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