-
1. Data: 2012-04-21 16:08:58
Temat: losowy rekord w sqlu
Od: "M.M." <m...@W...gazeta.pl>
Hey
Moje pytanie jest proste. Jak efektywnie wybrać losowy
rekord (ewentualnie kilka losowych) dużej tabeli w sqlu?
Sztuczki tego typu:
SELECT * FROM table ORDER BY rand LIMIT kilka
zdaje się że przeglądają całą tabelę, a to jest niedopuszczalne.
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
2. Data: 2012-04-21 17:58:11
Temat: Re: losowy rekord w sqlu
Od: Michoo <m...@v...pl>
On 21.04.2012 16:08, M.M. wrote:
> Hey
>
> Moje pytanie jest proste. Jak efektywnie wybrać losowy
> rekord (ewentualnie kilka losowych) dużej tabeli w sqlu?
>
> Sztuczki tego typu:
> SELECT * FROM table ORDER BY rand LIMIT kilka
> zdaje się że przeglądają całą tabelę, a to jest niedopuszczalne.
>
Wylosować kilka wartości klucza?
--
Pozdrawiam
Michoo
-
3. Data: 2012-04-21 19:55:09
Temat: Re: losowy rekord w sqlu
Od: " M.M." <m...@N...gazeta.pl>
Michoo <m...@v...pl> napisał(a):
> On 21.04.2012 16:08, M.M. wrote:
> > Hey
> >
> > Moje pytanie jest proste. Jak efektywnie wybrać losowy
> > rekord (ewentualnie kilka losowych) dużej tabeli w sqlu?
> >
> > Sztuczki tego typu:
> > SELECT * FROM table ORDER BY rand LIMIT kilka
> > zdaje się że przeglądają całą tabelę, a to jest niedopuszczalne.
> >
> Wylosować kilka wartości klucza?
Tak się nie da, ale podsunąłeś mi inny pomysł. Osobne pole które
będzie miało wszystkie wartości od 1 do N gdzie N to ilość rekordów
w tabeli. Przy usuwaniu rekordu zastąpię maxa usuwanym polem.
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
4. Data: 2012-04-23 13:50:22
Temat: Re: losowy rekord w sqlu
Od: Michoo <m...@v...pl>
On 21.04.2012 19:55, M.M. wrote:
> Michoo<m...@v...pl> napisał(a):
>> Wylosować kilka wartości klucza?
> Tak się nie da, ale podsunąłeś mi inny pomysł. Osobne pole które
> będzie miało wszystkie wartości od 1 do N gdzie N to ilość rekordów
> w tabeli. Przy usuwaniu rekordu zastąpię maxa usuwanym polem.
Pamiętaj o indeksie ;)
I w sytuacji gdy masz np jakieś triggery na modyfikacji rekordu pomyśl,
czy nie warto dać tej relacji do osobnej tabelki.
--
Pozdrawiam
Michoo
-
5. Data: 2012-04-23 16:17:54
Temat: Re: losowy rekord w sqlu
Od: " M.M." <m...@N...gazeta.pl>
Michoo <m...@v...pl> napisał(a):
> On 21.04.2012 19:55, M.M. wrote:
> > Michoo<m...@v...pl> napisał(a):
> >> Wylosować kilka wartości klucza?
> > Tak się nie da, ale podsunąłeś mi inny pomysł. Osobne pole które
> > będzie miało wszystkie wartości od 1 do N gdzie N to ilość rekordów
> > w tabeli. Przy usuwaniu rekordu zastąpię maxa usuwanym polem.
> Pamiętaj o indeksie ;)
Bez indeksu zdaje się że średnio by musiał przeszukać 50% rekordów :)
> I w sytuacji gdy masz np jakieś triggery na modyfikacji rekordu pomyśl,
> czy nie warto dać tej relacji do osobnej tabelki.
Pomyślałem i okazało się że mój problem jest cięższy niż początkowo
sądziłem. Czasami będę potrzebował losowy rekord ze złączenia
trzech tabel:
Tabele TA,TB,TC. TB łączy tabelę TA z tabelą TC.
Czyli losowy rekord z tego co zwraca poniższe zapytanie:
SELECT TC.dane FROM
TA
JOIN
TB
ON
TA.id = TB.id_a
JOINT
TC
ON
TC.id = TB.id_c
WHERE
TA.dane = cos_1 AND TA.dane = cos_2 AND ...
Mam nadzieję że się nie rypłem w zapytaniu :)
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
6. Data: 2012-04-23 16:23:09
Temat: Re: losowy rekord w sqlu
Od: "AK" <n...@n...com>
Użytkownik "M.M." <m...@W...gazeta.pl> napisał:
w wiadomości news:jmuf1p$rlf$1@inews.gazeta.pl...
> Moje pytanie jest proste. Jak efektywnie wybrać losowy
> rekord (ewentualnie kilka losowych) dużej tabeli w sqlu?
Okularnik poleca m.in. cos takiego:
http://www.petefreitag.com/item/466.cfm
AK
-
7. Data: 2012-04-23 16:35:06
Temat: Re: losowy rekord w sqlu
Od: " M.M." <m...@N...gazeta.pl>
M.M. <m...@N...gazeta.pl> napisał(a):
> Mam nadzieję że się nie rypłem w zapytaniu :)
Jednak się rypłem... jeszcze trudniejsze jest.
SELECT
TC.dane
FROM
TC AS TC_1
WHERE
N =
(
SELECT COUNT(*) FROM
TA
JOIN
TB
ON
TA.id = TB.id_a
JOIN
TC AS TC_2
ON
TC_2.id = TB.id_c
WHERE
TC_2.id = TC_1.id
AND
( TA.dane = cos_1 OR TA.dane = cos_2 OR ... OR TA.dane = cos_N )
)
Teraz chyba dobrze :)
I z wyników zapytania muszę mieć losowy rekord.
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
8. Data: 2012-04-23 16:38:19
Temat: Re: losowy rekord w sqlu
Od: " M.M." <m...@N...gazeta.pl>
AK <n...@n...com> napisał(a):
> Użytkownik "M.M." <m...@W...gazeta.pl> napisał:
> w wiadomości news:jmuf1p$rlf$1@inews.gazeta.pl...
>
> > Moje pytanie jest proste. Jak efektywnie wybrać losowy
> > rekord (ewentualnie kilka losowych) dużej tabeli w sqlu?
>
> Okularnik poleca m.in. cos takiego:
> http://www.petefreitag.com/item/466.cfm
No tak, dotarłem do tego, ale zdaje się że to zapytanie
jeździ po całej tabeli?
SELECT column FROM table ORDER BY RANDOM() LIMIT 1
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
9. Data: 2012-04-23 16:50:57
Temat: Re: losowy rekord w sqlu
Od: " M.M." <m...@N...gazeta.pl>
M.M. <m...@N...gazeta.pl> napisał(a):
> AK <n...@n...com> napisał(a):
>
> > Użytkownik "M.M." <m...@W...gazeta.pl> napisał:
> > w wiadomości news:jmuf1p$rlf$1@inews.gazeta.pl...
> >
> > > Moje pytanie jest proste. Jak efektywnie wybrać losowy
> > > rekord (ewentualnie kilka losowych) dużej tabeli w sqlu?
> >
> > Okularnik poleca m.in. cos takiego:
> > http://www.petefreitag.com/item/466.cfm
>
> No tak, dotarłem do tego, ale zdaje się że to zapytanie
> jeździ po całej tabeli?
> SELECT column FROM table ORDER BY RANDOM() LIMIT 1
> Pozdrawiam
Za to takie zapytanie wydaje się ciekawe:
SELECT * FROM table OFFSET RANDOM() LIMIT 1;
Pytanie tylko czy bazy potrafią skoczyć szybko pod N-ty rekord.
Bez sortowania powinny z łatwością potrafić.
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
10. Data: 2012-04-23 16:54:03
Temat: Re: losowy rekord w sqlu
Od: "AK" <n...@n...com>
Użytkownik " M.M." <m...@N...gazeta.pl> napisał:
> No tak, dotarłem do tego, ale zdaje się że to zapytanie
> jeździ po całej tabeli?
> SELECT column FROM table ORDER BY RANDOM() LIMIT 1
"Teoretycznie" wcale nie musi.
Wydaje mi sie, ze wystarczy ze RANDOM() policzy m = MAX("row_id"), wylosuje x =
irand(0, m)
i znajdzie row z row_id >= x lub row_id <= x. Wszytsko dzieje sie wiec po indeksie
(glownym).
Wszytsko zalezy od optymalizatora.
PS: Fakt, ze w przypadku duzej ilosci "dlugich" dziur bedzie to odbiegac od rozkladu
jednostajnego
ale.. no na tyle to sie nie znam na SQL zeby _cokolwiek_ wiecej moc powiedziec poza
przypuszczeniami.
AK