Michał M.

Michał M. konsultant IT

Temat: Dowcip o bazodanowcach

Piotr G.:
Jeśli ID byłyby posortowane, to się da - średnio o połowę krócej.
Oczywiście przy założeniu, że koszt operacji arytmetycznych jest pomijalny w porównaniu z kosztem operacji bazodanowych (co jest zwykle prawdą).
Ale dla nieposortowanych danych? Hmmm...

Zakładałem, że dane są posortowane.
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Dowcip o bazodanowcach

Przemysław R.:
Błażej O.:
Ten piwocik był po to aby można było problem rozwiązać metodą ekspercką ;-)))

w pewnych kręgach poczucie bycia niezastąpionym jest bezcenne ;)

Tyle, że przy zbytnim utwierdzaniu się w takim poczuciu można się kiedyś zdziwić :) Doświadczyłem tego, niestety :)))))
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Dowcip o bazodanowcach

Michał Matląg:
Piotr G.:
Jeśli ID byłyby posortowane, to się da - średnio o połowę krócej.
Oczywiście przy założeniu, że koszt operacji arytmetycznych jest pomijalny w porównaniu z kosztem operacji bazodanowych (co jest zwykle prawdą).
Ale dla nieposortowanych danych? Hmmm...

Zakładałem, że dane są posortowane.

W początkowych założeniach nie było o tym mowy. A więc należało założyć, że nie są :)
Generalnie założenie było, że nie korzystamy z indeksów. A w takim przypadku w SQL nie można zakładać jakiegokolwiek porządku danych, bo nawiet, jeśli były zapisywane kolejno, nie ma żadnej gwarancji, że tak będą czytane.Piotr G. edytował(a) ten post dnia 17.03.10 o godzinie 23:40
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Dowcip o bazodanowcach

Błażej, czy Twoje zadanie nadal ma takie same założenia, jak moje?
Błażej O.

Błażej O. Badania i rozwój
zaawansowanych
systemów
analitycznych

Temat: Dowcip o bazodanowcach

Piotr G.:
Błażej O.:
Michał Matląg:
Właśnie sobie przeczytałem kilka postów dotyczących zagadki i wydaje mi się, że można to zrobić bez użycia funkcji SUM, czy innych funkcji agregujących co najmniej na 2 inne sposoby, ale jeszcze jutro sprawdzę to w praktyce żeby potwierdzić ;-))


No właśnie czy ten algorytm opisany przez kolegę Piotra jest najszybszy - czy też może istnieje coś lepszego?

A to ci dopiero zagadka??? -> mamy jeszcze 50 minut ...

Podpuszczasz czy wiesz, że jest?
Bez indeksów i żadnych pomocniczych struktur?

Lepszy niż O(n)????? Hmmm...

Nauka radziecka zna nie takie przypadki ...

Tak jest bez indeksów i żadnych pomocniczych struktur - no może taka jedna malutka pomocnicza strukturka w postaci jakiejś liczby na boczku byłaby dopuszczalna (ale niekoniecznie).

Może nie rząd złożoności O(n) bo to se ne da (tak myślę) ale dokładnie mamy wynik z n operacji może jest coś lepszego (n - coś albo n/coś).

Nagroda (w nawiązaniu do wątku): jedyna i niepowtarzalna licencja na opowiadanie kawału z prawem do upgrad-ów oraz pomocą techniczną na całodobowej infolinii w przypadku spalenia kawału (oczywiście kawał o 12 - jest po prostu powalający choć niekoniecznie o bazodanowcach).
Błażej O.

Błażej O. Badania i rozwój
zaawansowanych
systemów
analitycznych

Temat: Dowcip o bazodanowcach

Piotr G.:
Michał Matląg:
Piotr G.:
Jeśli ID byłyby posortowane, to się da - średnio o połowę krócej.
Oczywiście przy założeniu, że koszt operacji arytmetycznych jest pomijalny w porównaniu z kosztem operacji bazodanowych (co jest zwykle prawdą).
Ale dla nieposortowanych danych? Hmmm...

Zakładałem, że dane są posortowane.

W początkowych założeniach nie było o tym mowy. A więc należało założyć, że nie są :)
Generalnie założenie było, że nie korzystamy z indeksów. A w takim przypadku w SQL nie można zakładać jakiegokolwiek porządku danych, bo nawiet, jeśli były zapisywane kolejno, nie ma żadnej gwarancji, że tak będą czytane.Piotr G. edytował(a) ten post dnia 17.03.10 o godzinie 23:40

Święta racja no to się konkurs rypnął - w takiej sytuacji wydaje mi się, że musimy wyciągnąć Załącznik E do regulaminu konkursu w którym czytamy, że baza danych SQL na której konkurs jest prowadzony jest klasy Enterprise Ultra i jak sama nazwa wskazuje i jest to przecież oczywiste dane w tym przypadku są posortowane.

Grono ekspertów orzekło więc że możemy dalej wytężać nasze umysły ...

Bez tego założenie to już chyba nic nie wymyślimy ...
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Dowcip o bazodanowcach

Dla danych posortowanych da się osiągnąć złożoność O(log2(n)) - pod warunkiem, że pominiemy koszt WHERE.
Ale WHERE bez indeksu przecież będzie miał złożoność rzędu średnio O(n/2).
Chyba, że jest jakiś sposób na wyciąganie rekordu o określonym numerze bez konieczności jego wyszukiwania WHERE-m.
Błażej O.

Błażej O. Badania i rozwój
zaawansowanych
systemów
analitycznych

Temat: Dowcip o bazodanowcach

Piotr G.:
Dla danych posortowanych da się osiągnąć złożoność O(log2(n)) - pod warunkiem, że pominiemy koszt WHERE.
Ale WHERE bez indeksu przecież będzie miał złożoność rzędu średnio O(n/2).
Chyba, że jest jakiś sposób na wyciąganie rekordu o określonym numerze bez konieczności jego wyszukiwania WHERE-m.

To co mi się udało wymyśleć to 2/3n -> bierzemy pary co dwie liczby + owa strukturka do przechowania pewnej wartości z poprzedniej dwójki (może sumy???) na boku wydaje mi się że dwie operacje wystarczą aby znaleźć babola -> ale algorytm zapewne wymaga doszlifowania lub też jest do wyrzucenia do śmieci.

Tak czy owak w nagrodę kawał:

Rolnik zauważył że w nocy giną mu jabłka z drzewka więc którejś nocy zaczaił się na złodzieja i już po chwili usłyszał jak ktoś wdrapuje się na drzewo. Podbiegł szybko i złapał złodzieja.

-Kim jesteś?? - woła rolnik ale odpowiedziała mu cisza...

Złapał więc złodzieja za jaj i znowu powtarza pytanie:
-Kim jesteś?? - znowu nie słyszy odpowiedzi.

Zacisną więc mocniej i znów zapytał:
-Kim jesteś?? - i znowu nie słyszy odpowiedzi.

Zacisną więc obiema rekami z całej siły i powtórzył pytanie
-Kim jesteś?
-To ja Jasiu...
-Jaki Jasiu? U nas we wsi wielu Jasiów...
-To ja Jasiu niemowa...Błażej O. edytował(a) ten post dnia 18.03.10 o godzinie 00:17
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Dowcip o bazodanowcach

:)))))))))))))))))) Dobry uścisk w łapie musiał mieć ten rolnik :))))

A algorytm rzeczywiście ciekawy - choć podejrzewam, że bez WHERE-a tego nie zrobisz, a to już może zabić cały zysk.
Spróbuj to zapisać, to popatrzymy.Piotr G. edytował(a) ten post dnia 18.03.10 o godzinie 00:58

Temat: Dowcip o bazodanowcach

A sposób rozwiązywania problemów "na misia" znacie?

To proste - sadzamy misia przed sobą
i tłumaczymy mu na czym polega problem i jak go można rozwiązać.
Tłumaczymy tak długo aż miś zrozumie albo...
sami rozwiążemy ten problem.
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Dowcip o bazodanowcach

Bardzo skuteczne w praktyce :)

konto usunięte

Temat: Dowcip o bazodanowcach

Piotr G.:
Krzysztof Drelczuk:
Ja tam nie widzę żadnych znaków mnożenia. Tak więc pytanie ma taki sam sens jak: jaki jest wynik a:b ;p

Z definicji, która była jeszcze w podstawówce:
2x = 2 * x

Czyli są znaki mnożenia, choć ich nie widać.

Ja tam takiej definicji nie pamiętam, ale może. To dawno temu było. Ale czy to oznacza, że tgx = t*g*x ? ;)

Temat: Dowcip o bazodanowcach

Piotr G.:
Marcin N.:
SELECT ID
FROM Tabela
GROUP BY ID
HAVING COUNT(*) > 1

...i w ten sposób mamy zdublowane ID

Super. A jaki będzie koszt (a przede wszystkim rząd kosztu) takiego zapytania dla tego miliona jeden rekordów??? Mówiąc krótko, po jakim czasie dostaniesz wynik, jeśli baza stoi na niezbyt wypasionej maszynie?


No dobra sprawdziłem to w praktyce.
Tabela 45.000.000 rekordów (ok. 3 GB)
count(*) - 30 s.
sum(ID) - 30 s.
wersja z HAVING - ok 210 s.
co ciekawe takie coś jak ponizej też działa ok 140 s.:
SELECT ID, rn FROM
( SELECT ID, rownum rn FROM ...
ORDER BY ID )
WHERE ID != rn

I najciekawsza wersja ale trochę wolniejsza ok. 330 s.:
SELECT ID FROM (
SELECT ID, ID-LAG(ID,1) OVER (ORDER BY ID) diff FROM ...
) WHERE diff = 0

a wersja jest "najciekawsza" bo jak zmienimy warunek na diff>1
to mamy listę "dziur" w numeracji
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Dowcip o bazodanowcach

Krzysztof Drelczuk:
Piotr G.:
Krzysztof Drelczuk:
Ja tam nie widzę żadnych znaków mnożenia. Tak więc pytanie ma taki sam sens jak: jaki jest wynik a:b ;p

Z definicji, która była jeszcze w podstawówce:
2x = 2 * x

Czyli są znaki mnożenia, choć ich nie widać.

Ja tam takiej definicji nie pamiętam, ale może. To dawno temu było. Ale czy to oznacza, że tgx = t*g*x ? ;)

A o co chodzi?
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Dowcip o bazodanowcach

Piotr Wolański:

No dobra sprawdziłem to w praktyce.
Tabela 45.000.000 rekordów (ok. 3 GB)
count(*) - 30 s.
sum(ID) - 30 s.
wersja z HAVING - ok 210 s.
co ciekawe takie coś jak ponizej też działa ok 140 s.:
SELECT ID, rn FROM
( SELECT ID, rownum rn FROM ...
ORDER BY ID )
WHERE ID != rn

Piotr, a osiągniesz takie wyniki na mocno obciążonej maszynie (chodzi mi oczywiście o buforowanie)?

I najciekawsza wersja ale trochę wolniejsza ok. 330 s.:
SELECT ID FROM (
SELECT ID, ID-LAG(ID,1) OVER (ORDER BY ID) diff FROM ...
) WHERE diff = 0

a wersja jest "najciekawsza" bo jak zmienimy warunek na diff>1
to mamy listę "dziur" w numeracji

No to jest rzeczywiście ładne i zgrabne.
Łukasz Schabek

Łukasz Schabek Architekt Rozwiązań

Temat: Dowcip o bazodanowcach


Obrazek
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: Dowcip o bazodanowcach

Łukasz Schabek:

Obrazek


W dolnym wierszu powinno mu wyjść 7. Nie zdążył chyba dopisać.

Temat: Dowcip o bazodanowcach

Piotr G.:
Piotr Wolański:

No dobra sprawdziłem to w praktyce.
Tabela 45.000.000 rekordów (ok. 3 GB)
count(*) - 30 s.
sum(ID) - 30 s.
wersja z HAVING - ok 210 s.
co ciekawe takie coś jak ponizej też działa ok 140 s.:
SELECT ID, rn FROM
( SELECT ID, rownum rn FROM ...
ORDER BY ID )
WHERE ID != rn

Piotr, a osiągniesz takie wyniki na mocno obciążonej maszynie (chodzi mi oczywiście o buforowanie)?

Jeżeli obciążenie nie będzie sięgac do dysku...

W tym konkretnym przypadku takie wyniki to kwestia wydajności dysków (w pomiarach tylko 20 MB/s :( przy kopiowaniu dużych plików)
3GB/20 MB/s = 150 sek.
Przy count(*) i sum(ID) - ORACLE sięga tylko po danych indeksu a tych jest 10 razy mniej

konto usunięte

Temat: Dowcip o bazodanowcach

Piotr Wolański:
Piotr G.:
Piotr Wolański:

No dobra sprawdziłem to w praktyce.
Tabela 45.000.000 rekordów (ok. 3 GB)
count(*) - 30 s.
sum(ID) - 30 s.
wersja z HAVING - ok 210 s.
co ciekawe takie coś jak ponizej też działa ok 140 s.:
SELECT ID, rn FROM
( SELECT ID, rownum rn FROM ...
ORDER BY ID )
WHERE ID != rn

Piotr, a osiągniesz takie wyniki na mocno obciążonej maszynie (chodzi mi oczywiście o buforowanie)?

Jeżeli obciążenie nie będzie sięgac do dysku...

W tym konkretnym przypadku takie wyniki to kwestia wydajności dysków (w pomiarach tylko 20 MB/s :( przy kopiowaniu dużych plików)
3GB/20 MB/s = 150 sek.
Przy count(*) i sum(ID) - ORACLE sięga tylko po danych indeksu a tych jest 10 razy mniej


Kruczki i sztuczki.

Sposób na wyciągnięcie duplikatów z kolumny dowolnego typu:

select *
from nazwatabeli a, nazwatabeli b
where a.kolumna=b.kolumna;

I tyle, i to wystarczy, jak powiedziano w pewnej reklamie.

Temat: Dowcip o bazodanowcach

>>
Kruczki i sztuczki.

Sposób na wyciągnięcie duplikatów z kolumny dowolnego typu:

select *
from nazwatabeli a, nazwatabeli b
where a.kolumna=b.kolumna;

I tyle, i to wystarczy, jak powiedziano w pewnej reklamie.

Hmmm... a sprawdziłeś jak to działa
jezeli nie masz indeksu na sprawdzanej kolumnie
a wierszy jest kilkadziesiąt milionów?

[Edit] Sprawdziłem z ciekawości: przy indeksie na sprawdzanej kolumnie
i tabeli jak dla poprzednich przypadków 800 sek. tylko...
nie o to chodziło - zwraca tę samą tabelę ze zwielokrotnionymi duplikatami wierszyPiotr Wolański edytował(a) ten post dnia 25.03.11 o godzinie 09:03

Następna dyskusja:

Dowcip, czy badanie socjolo...




Wyślij zaproszenie do