Skocz do zawartości

[zabawa] Problem do rozwiązania.


krupek

Rekomendowane odpowiedzi

  • Odpowiedzi 49
  • Dodano
  • Ostatniej odpowiedzi

Pliki znajdują się:

https://aspx.pl/zabawa/zabawam.zip (sory za pomyłkę).

https://aspx.pl/zabawa/zabawad.zip.

Najlepiej rozpakowywać 7zip-em lub winrarem.

struktura bazy (skrypt tworzący bazę) tutaj:

https://www.forum.optymalizacja.com/index.php?s...st&p=327027

W zadaniu należy napisać tak zapytanie (jak sugerowałem w pierwszym poście call sp_...) lub procedurę składową, która

zwróci 1000 losowych rekordów z możliwością powtórki.

Generalnie zadanie miało polegać na wyciągnięciu n losowych rekordów z tabeli mającej m wierszy ale podałem parametry

aby nadgorliwcy i szukający dziury w całym nie próbowali rzucać tez to trzeba do pamięci bo szybciej, etc... dlatego zdefiniowałem

zakresy jasno.

Mała tabela służyła do testów sprawdzenia czy nasz algorytm działa poprawnie, statystycznie prawdopodobieństwo wystąpienia rekordów o numerach z danych zbiorów (jeżeli można tak przyjąć) 1 - 1 000, 1 001 - 2 000, 999 000 - 1 000 000 powinno być w miarę równe.

@ZooZool: na razie nie padło żadne rozwiązanie tylko coś w PHP...

pozdro 600

:jezyk1:

potęga umysłu

Odnośnik do komentarza
Udostępnij na innych stronach

<?
$TAB='zabawad';
$ILOSC_WIERSZY_LOSOWANYCH=1000;

$ILOSC_WIERSZY_W_TABELI=1000000;

$SQL="";
for($i=1;$i<$ILOSC_WIERSZY_LOSOWANYCH;$i++)
{
 $OFFSET = rand(1,$ILOSC_WIERSZY_W_TABELI);
 $SQL .= "(SELECT * FROM $TAB LIMIT 1 OFFSET $OFFSET) UNION ALL  \n";
}

 $OFFSET = rand(1,$X);
 $SQL .= "(SELECT * FROM $TAB LIMIT 1 OFFSET $OFFSET)   \n";


 echo $SQL;

?>

wygeneruj sie kod SQL

i mozna go wykonać w jednym poleceniu

np. taki

(SELECT * FROM zabawad LIMIT 1 OFFSET 811860) UNION ALL
...
...
(SELECT * FROM zabawad LIMIT 1 OFFSET 267185) UNION ALL
(SELECT * FROM zabawad LIMIT 1 OFFSET 258163) UNION ALL
(SELECT * FROM zabawad LIMIT 1 OFFSET 542981) UNION ALL
(SELECT * FROM zabawad LIMIT 1 OFFSET 1)

Sprawdzone doświadczalnie działa , powtórzenia są mozliwe, w jednym zapytaniu SQL

oczywiście można by było pokusić sie o zrobienie tego w procedurze składowanej ,

zasada bedzie ta sama. Wykonujemy 1000 razy zapytaniez limitem

Odrazu też wspomne ze nie działa składnia SQL taka

SELECT * FROM zabawad LIMIT 1 OFFSET RAND*1000000

Bo w offset musi być liczba a nie może być wyrażenie :jezyk1:

Czekam niecierpliwie na nagrodę :rolleyes:

Odnośnik do komentarza
Udostępnij na innych stronach

krupek !

Zamiast twojego 1 GIGOWEGO pliku to ja bym proponował

1)wpisujemy jeden wiersz do tabeli

INSER INTO zabawad ( k1 ,k2 ...k99,k100)

VALUES ( MD5(rand()), MD5(rand()) .... MD5(rand()), MD5(rand()))

2)

INSERT INTO zabawad

SELECT (md5(rand()), (md5(rand()) .... (md5(rand()), (md5(rand())

FROM zabawad

I to zapytanie nalezy wykonać kilkanaście razy aż baza bedzie miała ponad milion rekordów

Każde kolejne zapytanie powieksza ilość rekordów dwukrotnie

Co do ewentualnych pytań dlaczego jest tak wolno to odpowiadam, baza bez indeksów tak ma :)

Odnośnik do komentarza
Udostępnij na innych stronach

TOĆ zrobiłem to w jednym zapytaniu ,

napisane jest wyżej: napisz skrypt sql-owy, który wyciągnie 1,000 losowych rekordów z powtórzeniami

Wiec ja taki SQL napisałem a dokładnie mój PHP go napisał :)

Baza danych sama w sobie nie wykonuje zapytań, zawsze jest coś co wykonuje SQL więc niech to coś (np. PHP) wygeneruje SQL

a potem baza wykona SQL

Jak dla mnie to niech krupek oceni czy jest OK czy nie jest OK, regulamin jakis taki rozmyty :P

Mysql nie jest najlepsza bazą , a jezeli chemy robic więkze "myki" to wogóle sie nie nadaje

np.

w procedurze składowanej nie można za bardzo pokombinowac:

Dynamic SQL is not allowed in stored function or trigger wiec w procedurze sie nie da wygenerować saawansowanego SQL-a a potem go uruchomić :)

Odnośnik do komentarza
Udostępnij na innych stronach

A testowałes może mój SQL ?

Ile czasu trwa wykonanie ?

Tutaj plik z SQL:

https://file.draminski.com/sylwek/zz.sql

Nie myślałeś o założeniu indeksu na tabelę ?

Zdecydowana poprawa (powinno sie dac zejsc z czasem do sekund)

Ladować może i sie baza laduje 2,5 minuty, ale scagnać 1G plik na 256kb to troche zajmie :)

Odnośnik do komentarza
Udostępnij na innych stronach

JA już nie wiem czyja to jest zabawa. Kto ustala zasady :) ?

Krupek czy MMP ?

https://file.draminski.com/sylwek/zzz.sql

ta wersja już działa OK, sam czysty SQL zadnego PHP

Krupek - metody pomiarowe na oko są mało przekonywujące, zresztą z miła checią zobacze lepsze rozwiązanie lepsze niż moje i dziłające.

Odnośnik do komentarza
Udostępnij na innych stronach

wystarczy tak i jest poprawnie:

(SELECT * FROM zabawad ORDER BY rand() LIMIT 1 ) UNION ALL

(SELECT * FROM zabawad ORDER BY rand() LIMIT 1 ) UNION ALL

(SELECT * FROM zabawad ORDER BY rand() LIMIT 1 ) UNION ALL

...

(SELECT * FROM zabawad ORDER BY rand() LIMIT 1 )

to zwraca 1000 losowych rekordów z możliwością wystąpienia

moje rozwiązanie wrzucę po konkursie ;)

Odpaliłem Twoje proponowane rozwiązanie ale z 10 uniami :)

i czekamy na wynik :)

pozdro 600

:)

potęga umysłu

Odnośnik do komentarza
Udostępnij na innych stronach

To ja sie poddaję

Nic nad

(SELECT * FROM zabawad ORDER BY rand() LIMIT 1 ) UNION ALL
(SELECT * FROM zabawad ORDER BY rand() LIMIT 1 ) UNION ALL
(SELECT * FROM zabawad ORDER BY rand() LIMIT 1 ) UNION ALL
...
(SELECT * FROM zabawad ORDER BY rand() LIMIT 1 )

Nie da się wymyślić, trzeba przyznać ze moje ostatnie rozwiązanie to przekombinowałem :)

Wylosowałem już unikalny wiersz z tabeli po o aby jeszcze raz potem szukać tego samego wiersza ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności