Představte si, že nástroj, který může automaticky detekovat JPA a Hibernate problémy s výkonem. Hypersistence Optimizer je ten nástroj!
Úvod
V tomto článku se budeme vidět, jak můžeme třídit SQL dotazu sada výsledků pomocí ORDER BY klauzule, že se NÁHODNÝ funkce poskytované databáze-specifické funkce.
Jedná se o velmi šikovný trik, zvláště když chcete zamíchat danou sadu výsledků.
všimněte si, že třídění velké sady výsledků pomocí náhodné funkce se může ukázat jako velmi pomalé, takže se ujistěte, že to děláte na malých sadách výsledků.
Pokud máte shuffle velký výsledek nastavit a omezit to potom, pak je lepší použít něco jako Oracle
SAMPLE(N)
neboTABLESAMPLE
v SQL Server nebo PostgreSQL namísto náhodné funkce v klauzuli ORDER BY.
tabulky Databáze
předpokládejme, že pracujeme na hudební přehrávač desktopové aplikace, a jsme následující song
tabulky v databázi.
song
tabulka se vyplní takto:
id | artist | title |
---|---|---|
1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
2 | HAIM | Don’t Save Me (Cyril Hahn Remix) |
3 | 2Pac ft. DMX | Rise Of Champion (GalilHD Remix) |
4 | Ed Sheeran & Osobní | no Diggity (jasmine thompson Remix) |
5 | JP Cooper ft. Mali-Koa | Tohle Všechno je Láska. |
Pomocí NÁHODNÉ funkce v SQL ORDER BY klauzule
chcete zamíchat seznam skladeb tak, že každý nový playlist je jiný než dříve vytvořené. Kdykoli potřebujeme třídit danou sadu výsledků dotazu SQL, musíme použít klauzuli ORDER BY.
Nicméně, aby se náhodně vrátil řádky, musíme klauzuli ORDER BY použít funkci nebo databázový objekt, který vrací náhodné hodnoty pro každý řádek obsažené v SQL sadu výsledků.
Jak již bylo zmíněno, použití databáze-specifické funkce, která vrací náhodné hodnoty je vhodné pro malé sady výsledků pouze, jak jinak, dotaz SQL výkon bude ovlivněn. Naštěstí v našem případě tabulka song
představuje aktuální seznam skladeb desktopové aplikace, proto je velikost sady výsledků přiměřená.
Oracle
Na Oracle, musíte použít DBMS_RANDOM.VALUE
funkce, jak je znázorněno v následujícím příkladu:
SELECT artist||' - '||title AS songFROM songORDER BY DBMS_RANDOM.VALUE
Při provádění SQL dotazu výše na Oracle, následující výsledek sada je získat:
HAIM – ne, Zachraň Mě (Cyril Hahn Remix)
Ed Sheeran & Passenger – no Diggity (jasmine thompson Remix)
Mijagi & Эндшпиль ft. Рем дигга-mám lásku p –
JP Cooper ft. Mali-Koa-All This Love
2Pac ft. DMX – Rise Of Champion (GalilHD Remix)
Všimněte si, že písně jsou uvedeny v náhodném pořadí, díky DBMS_RANDOM.VALUE
volání funkce používá klauzuli ORDER BY.
VALUE
funkceDBMS_RANDOM
balíček vrátí číselnou hodnotu v [0, 1) interval s přesností na 38 zlomkové číslice.
SQL Server
Na serveru SQL Server, musíte použít NEWID
funkce, jak je znázorněno v následujícím příkladu:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY NEWID()
Při provádění SQL dotazu výše na serveru SQL Server, následující výsledek sada je získat:
Mijagi & Эндшпиль ft. Рем дигга-mám lásku p –
Haim-nezachraň mě (Cyril Hahn Remix)
2pac ft. DMX – Rise Of Champion (GalilHD Remix)
Ed Sheeran & Passenger – no Diggity (jasmine thompson Remix)
JP Cooper ft. Mali-Koa – To Vše je Láska.
Všimněte si, že písně jsou uvedeny v náhodném pořadí, díky NEWID()
volání funkce používá klauzuli ORDER BY.
NEWID
vracíuniqueidentifier
datový typ představující 16 bajtů GUID. Proto každá nová hodnota vrácená funkcíNEWID
bude prakticky jedinečná.
PostgreSQL
PostgreSQL, budete muset použít random
funkce, jak je znázorněno v následujícím příkladu:
SELECT artist||' - '||title AS songFROM songORDER BY random()
Při provádění SQL dotazu výše na PostgreSQL, následující výsledek sada je získat:
JP Cooper ft. Mali-Koa-All This Love
2Pac ft. DMX – Rise Of Champion (GalilHD Remix)
HAIM – ne, Zachraň Mě (Cyril Hahn Remix)
Ed Sheeran & Passenger – no Diggity (jasmine thompson Remix)
Mijagi & Эндшпиль ft. Notice – I Got Love
všimněte si, že písně jsou uvedeny v náhodném pořadí, a to díky random()
volání funkce používané podle klauzule order by.
random
funkce vrátí číselnou hodnotu v [0, 1) intervaldouble precision
typu.
MySQL
Na MySQL, musíte použít RAND
funkce, jak je znázorněno v následujícím příkladu:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY RAND()
Při provádění SQL dotazu výše na MySQL, následující výsledek sada je získat:
2Pac ft. DMX-Rise of a Champion (GalilHD Remix)
JP Cooper ft. Mali-Koa-All This Love
Miyagi & Ft Ft. Рем Дигга – mám Lásku,
Ed Sheeran & Passenger – no Diggity (jasmine thompson Remix)
HAIM – ne, Zachraň Mě (Cyril Hahn Remix)
Všimněte si, že písně jsou uvedeny v náhodném pořadí, díky RAND()
volání funkce používá klauzuli ORDER BY.
funkce
RAND
vrací číselnou hodnotu v intervalu [0, 1) typu s plovoucí desetinnou čárkou.
JPA a Hibernate
Při použití JPA a Hibernate entity dotazy, můžete se jen projít náhodné funkce pro klauzuli ORDER BY, jak ilustruje následující JPQL dotazu:
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY random()", Song.class).getResultList();
JPQL dotazu výše bude fungovat v pohodě pro PostgreSQL, SQL Server, a MySQL, protože random()
NEWID()
nebo RAND()
funkce bude předán do režimu Spánku, jako je SQL ORDER BY.
Pro Oracle, protože náhodnost je dána DBMS_RANDOM.VALUE
number generator, budete muset něj odkazovat jako SQL funkci (např. DBMS_RANDOM.VALUE()
):
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY DBMS_RANDOM.VALUE()", Song.class).getResultList();
a je to!
online workshopy
Pokud se vám tento článek líbil, vsadím se, že se vám bude líbit můj nadcházející 4denní online Workshop!
- Vysoký Výkon Java Persistence on-Line Workshop (4 hodiny x 4 dny) mezi 19. a 22. dubna
Závěr
Randomizing SQL dotazu sada výsledků je společný požadavek, takže, to je užitečné vědět, co SQL funkci můžete použít v klauzuli ORDER BY v závislosti na základní relační typ databáze.