Maybaygiare.org

Blog Network

Vlad Mihalcea

Last modified:

wyobraź sobie, że masz narzędzie, które może automatycznie wykrywać JPA i hibernować problemy z wydajnością. Hypersistence Optimizer to właśnie to narzędzie!

wprowadzenie

w tym artykule zobaczymy, jak możemy sortować wyniki zapytania SQL za pomocą klauzuli ORDER BY, która przyjmuje losową funkcję dostarczaną przez funkcję specyficzną dla bazy danych.

jest to bardzo przydatna sztuczka, szczególnie gdy chcemy przetasować dany zestaw wyników.

należy pamiętać, że sortowanie dużego zbioru wyników przy użyciu funkcji losowej może okazać się bardzo powolne, więc upewnij się, że robisz to na małych zestawach wyników.

Jeśli musisz przetasować duży zestaw wyników i ograniczyć go później, lepiej użyć czegoś takiego jak Oracle SAMPLE(N)lub TABLESAMPLE w SQL Server lub PostgreSQL zamiast funkcji losowej w klauzuli ORDER BY.

tabela bazy danych

Załóżmy, że tworzymy aplikację desktopową odtwarzacza muzyki i mamy następującąsong tabelę w naszej bazie danych.

tabela bazy danych utworów

tabela bazy utworów

tabelasong jest wypełniona w następujący sposób:

id artist title
1 Miyagi & Эндшпиль ft. Рем Дигга I Got Love
2 HAIM Don’t Save Me (Cyril Hahn Remix)
3 2Pac ft. DMX Rise Of a Champion (GalilHD Remix)
4 Ed Sheeran & pasażer No Diggity (Kygo Remix)
5 Mali-Koa All This Love

używając losowej funkcji w klauzuli SQL ORDER BY

chcemy przetasować listę utworów tak, aby każda nowa lista była inna niż wcześniej wygenerowana. Ilekroć chcemy posortować dany zestaw wyników zapytania SQL, musimy użyć klauzuli ORDER BY.

jednak, aby randomizować zwracane wiersze, potrzebujemy klauzuli ORDER BY, aby użyć funkcji lub obiektu bazy danych, który zwraca losową wartość dla każdego wiersza zawartego w zestawie wyników SQL.

jak już wspomniano, użycie funkcji specyficznej dla bazy danych, która zwraca losowe wartości, jest odpowiednie tylko dla małych zestawów wyników, ponieważ w przeciwnym razie wpłynie to na wydajność zapytania SQL. Na szczęście w naszym przypadku tabela song reprezentuje bieżącą listę odtwarzania aplikacji desktopowej, dlatego rozmiar zestawu wyników jest rozsądny.

Oracle

w systemie Oracle należy użyć funkcjiDBMS_RANDOM.VALUE, jak pokazano w poniższym przykładzie:

SELECT artist||' - '||title AS songFROM songORDER BY DBMS_RANDOM.VALUE

podczas wykonywania powyższego zapytania SQL w systemie Oracle uzyskuje się następujący zestaw wyników:

piosenka

HAIM – Don ’ t Save Me (Cyril Hahn Remix)

Ed Sheeran& Passenger – No Diggity (Kygo Remix)

Miyagi& Рем Дигга-I Got Love

JP Cooper ft. Mali – Koa-All This Love

2Pac ft. DMX-Rise Of a Champion (GalilHD Remix)

zauważ, że utwory są wyświetlane w losowej kolejności, dzięki wywołaniu funkcji DBMS_RANDOM.VALUE używanej przez klauzulę ORDER BY.

funkcjaVALUE w pakiecieDBMS_RANDOM Zwraca wartość liczbową w przedziale [0, 1) z dokładnością 38 ułamkowych cyfr.

SQL Server

w SQL serverze należy użyć funkcji NEWID, co zilustrowano poniższym przykładem:

SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY NEWID()

podczas wykonywania powyższego zapytania SQL na SQL serverze uzyskuje się następujący zestaw wyników:

piosenka

& Рем Дигга-I Got Love

HAIM – Don ’ t Save Me (Cyril Hahn Remix)

2Pac ft. DMX – Rise Of a Champion (GalilHD Remix)

Ed Sheeran & Passenger – No Diggity (Kygo Remix)

JP Cooper ft. Mali – Koa-All This Love

zauważ, że utwory są wyświetlane w losowej kolejności, dzięki wywołaniu funkcji NEWID() używanej przez klauzulę ORDER BY.

funkcja NEWIDzwraca typ danych uniqueidentifier reprezentujący 16-bajtowy identyfikator GUID. Dlatego każda nowa wartość zwracana przez funkcjęNEWID będzie praktycznie unikalna.

PostgreSQL

w programie PostgreSQL należy użyć funkcji random, jak pokazano w poniższym przykładzie:

SELECT artist||' - '||title AS songFROM songORDER BY random()

podczas wykonywania powyższego zapytania SQL na PostgreSQL, otrzymujemy następujący zestaw wyników:

Song

JP Cooper ft. Mali – Koa-All This Love

2Pac ft. DMX – Rise of a Champion (GalilHD Remix)

HAIM – Don ’ t Save Me (Cyril Hahn Remix)

Ed Sheeran & Passenger – No Diggity (Kygo Remix)

Miyagi & Рем Дигга-I Got Love

zauważ, że utwory są wyświetlane w losowej kolejności, dzięki wywołaniu funkcji random() używanej przez klauzulę ORDER BY.

funkcja randomZwraca wartość liczbową w przedziale [0, 1) typu double precision.

MySQL

w MySQL, musisz użyć funkcji RAND, jak pokazano w poniższym przykładzie:

SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY RAND()

podczas wykonywania zapytania SQL powyżej w MySQL, następujący zestaw wyników to

piosenka

2Pac ft. DMX-Rise Of a Champion (GalilHD Remix)

JP Cooper ft. Mali – Koa-All This Love

Miyagi & Рем Дигга – I Got Love

Ed Sheeran & Passenger – No Diggity (Kygo Remix)

HAIM – Don ’ t Save Me (Cyril Hahn Remix)

zwróć uwagę, że piosenki są wyświetlane w losowej kolejności, dzięki RAND() wywołanie funkcji używane przez klauzulę order by.

funkcja RAND Zwraca wartość liczbową w interwale [0, 1) typu zmiennoprzecinkowego.

JPA i Hibernate

korzystając z zapytań JPA i Hibernate encji, możesz po prostu przekazać funkcję losową do klauzuli ORDER BY, jak zilustrowano poniższym zapytaniem JPQL:

List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY random()", Song.class).getResultList();

powyższe zapytanie JPQL będzie działać dobrze dla PostgreSQL, SQL Server, i MySQL odrandom()NEWID() lubRAND() funkcje będą przekazywane przez hibernację tak, jak jest do kolejności SQL przez.

dla Oracle, ponieważ losowość jest podawana przezDBMS_RANDOM.VALUE generator liczb, będziesz musiał odwołać się do niego jako do funkcji SQL (np.DBMS_RANDOM.VALUE()):

List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY DBMS_RANDOM.VALUE()", Song.class).getResultList();

To jest to!

warsztaty Online

Jeśli podobał Ci się ten artykuł, założę się, że pokochasz moje nadchodzące 4-dniowe warsztaty Online!

  • wysokowydajne warsztaty online Java Persistence (4 godziny x 4 dni) między 19 a 22 kwietnia

wnioski

losowanie zestawu wyników zapytania SQL jest powszechnym wymogiem, więc warto wiedzieć jakiej funkcji SQL można użyć w klauzuli ORDER BY w zależności od bazowego typu relacyjnej bazy danych.

Transactions and Concurrency Control eBook

High-Performance Java Persistence rocks!
High-Performance Java Persistence Online Workshop
Hypersistence Optimizer rocks!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.