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)
lubTABLESAMPLE
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.
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:
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.
funkcja
VALUE
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:
& Рем Дигга-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
NEWID
zwraca typ danychuniqueidentifier
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:
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
random
Zwraca wartość liczbową w przedziale [0, 1) typudouble 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
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.