képzelj el egy olyan eszközt, amely automatikusan felismeri a JPA-t és hibernálja a teljesítményproblémákat. Hypersistence Optimizer ez az eszköz!
Bevezetés
ebben a cikkben megnézzük, hogyan rendezhetünk egy SQL lekérdezési eredménykészletet egy ORDER BY záradék segítségével, amely egy adatbázis-specifikus függvény által biztosított véletlenszerű függvényt vesz fel.
Ez egy nagyon praktikus trükk, különösen akkor, ha egy adott eredménykészletet meg akarsz keverni.
vegye figyelembe, hogy egy nagy eredményhalmaz véletlenszerű függvénnyel történő rendezése nagyon lassú lehet, ezért győződjön meg róla, hogy ezt kis eredményhalmazokon teszi.
Ha egy nagy eredménykészletet meg kell kevernie, és utána korlátozni kell, akkor jobb, ha az Oracle
SAMPLE(N)
vagy aTABLESAMPLE
az SQL Server vagy a PostgreSQL véletlenszerű függvénye helyett az ORDER BY záradékban.
adatbázis tábla
tegyük fel, hogy egy zenelejátszó asztali alkalmazást fejlesztünk, és a következő song
táblázat található az adatbázisunkban.
a song
táblázat a következőképpen kerül kitöltésre:
id | artist | title |
---|---|---|
1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
2 | HAIM | Don’t Save Me (Cyril Hahn Remix) |
3 | 2Pac ft. DMX | egy bajnok felemelkedése (GalilHD Remix) |
4 | Ed Sheeran & utas | nincs Diggity (Kygo Remix) |
5 | JP Cooper Ft. Mali-Koa | All This Love |
Véletlenszerű Függvény használata az SQL ORDER BY záradékban
azt akarjuk, hogy a dallistát úgy keverjük össze, hogy minden új lejátszási lista más legyen, mint egy korábban létrehozott. Amikor egy adott SQL lekérdezés eredménykészletét rendezni kell, akkor a sorrend szerint záradékot kell használnunk.
a visszaadott sorok véletlenszerűsítéséhez azonban szükségünk van a sorrend záradékra egy olyan függvény vagy adatbázis objektum használatához, amely véletlenszerű értéket ad vissza az SQL eredménykészlet minden sorához.
mint már említettük, egy adatbázis-specifikus függvény használata, amely véletlenszerű értékeket ad vissza, csak kis eredményhalmazokra alkalmas, különben az SQL lekérdezés teljesítményét befolyásolja. Szerencsére a mi esetünkben a song
táblázat az asztali alkalmazás aktuális lejátszási listáját képviseli, ezért az eredményhalmaz mérete ésszerű.
Oracle
Az Oracle-en a DBMS_RANDOM.VALUE
függvényt kell használni, amint azt a következő példa szemlélteti:
SELECT artist||' - '||title AS songFROM songORDER BY DBMS_RANDOM.VALUE
a fenti SQL lekérdezés végrehajtásakor az Oracle-en a következő eredményhalmaz érhető el:
HAIM – Don ‘ t Save Me (Cyril Hahn Remix)
Ed Sheeran& utas – nincs Diggity (Kygo Remix)
Miyagi& Ft. C. A.: I Got Love
JP Cooper Ft. Mali-Koa – ez a szerelem
2Pac ft. DMX-Rise of a Champion (GalilHD Remix)
figyeljük meg, hogy a dalok vannak felsorolva véletlenszerű sorrendben, köszönhetően aDBMS_RANDOM.VALUE
funkció hívás által használt ORDER BY záradék.
a
VALUE
függvény aDBMS_RANDOM
csomag egy numerikus értéket ad vissza a [0, 1) intervallumban, 38 törtszámjegy pontossággal.
SQL Server
Az SQL Server-en a NEWID
függvényt kell használni, amint azt a következő példa szemlélteti:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY NEWID()
amikor a fenti SQL lekérdezést végrehajtja az SQL Server-en, a következő eredményhalmaz jelenik meg kapott:
Miyagi & Ft. – Szerelem
Haim – ne ments meg (Cyril Hahn Remix)
2Pac Ft. DMX-Rise of a Champion (GalilHD Remix)
Ed Sheeran& utas – nincs Diggity (Kygo Remix)
JP Cooper ft. Mali – Koa-All This Love
figyeljük meg, hogy a dalok vannak felsorolva véletlenszerű sorrendben, köszönhetően a NEWID()
funkció hívás által használt ORDER BY záradék.
a
NEWID
függvény egyuniqueidentifier
adattípust ad vissza, amely egy 16 bájtos GUID-t jelent. Ezért aNEWID
függvény által visszaadott minden új érték gyakorlatilag egyedi lesz.
PostgreSQL
A PostgreSQL-en a random
függvényt kell használni, amint azt a következő példa szemlélteti:
SELECT artist||' - '||title AS songFROM songORDER BY random()
amikor a fenti SQL lekérdezést végrehajtja a PostgreSQL-en, a következő eredményhalmaz érhető el:
JP Cooper Ft. Mali-Koa – ez a szerelem
2Pac ft. DMX-Rise of a Champion (GalilHD Remix)
HAIM – Don ‘ t Save Me (Cyril Hahn Remix)
Ed Sheeran & utas – nem Diggity (Kygo Remix)
Miyagi & Ft. A dalok véletlenszerű sorrendben vannak felsorolva, köszönhetően a random()
függvényhívásnak, amelyet az ORDER BY záradék használ.
a
random
függvény numerikus értéket ad vissza adouble precision
Típus [0, 1) intervallumában.
MySQL
a MySQL-en a RAND
függvényt kell használni, amint azt a következő példa szemlélteti:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY RAND()
amikor a fenti SQL lekérdezést végrehajtja a MySQL-en, a következő eredményhalmaz érhető el:
2Pac Ft. DMX-egy bajnok felemelkedése (GalilHD Remix)
JP Cooper ft. Mali-Koa – mindez a szerelem
Miyagi & Ft.
ed sheeran & utas – nincs diggity (Kygo Remix)
Haim – ne ments meg (Cyril Hahn Remix)
vegye figyelembe, hogy a dalok véletlenszerű sorrendben vannak felsorolva, köszönhetően a RAND()
függvényhívás által használt order by záradék.
a
RAND
függvény numerikus értéket ad vissza a lebegőpontos Típus [0, 1) intervallumában.
JPA és Hibernate
a JPA és Hibernate entitás lekérdezések használatakor a véletlenszerű függvényt egyszerűen átadhatja a sorrend szerint záradéknak, amint azt a következő JPQL lekérdezés szemlélteti:
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY random()", Song.class).getResultList();
a fenti JPQL lekérdezés remekül működik a PostgreSQL, az SQL Server és a MySQL számára, mivel a random()
NEWID()
vagy RAND()
függvények hibernált állapotban kerülnek átadásra az SQL sorrend szerint.
Az Oracle esetében, mivel a véletlenszerűséget a DBMS_RANDOM.VALUE
számgenerátor adja meg, SQL függvényként kell hivatkoznia (pl. DBMS_RANDOM.VALUE()
):
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY DBMS_RANDOM.VALUE()", Song.class).getResultList();
ennyi!
Online műhelyek
Ha tetszett ez a cikk, fogadok, hogy imádni fogja a közelgő 4 napos Online műhelyemet!
- nagy teljesítményű Java Persistence online Workshop (4 óra x 4 nap) április 19.és 22. között
következtetés
Az SQL lekérdezés eredményhalmazának randomizálása általános követelmény, ezért hasznos tudni, hogy az SQL lekérdezési eredményhalmaz randomizálása általános követelmény milyen SQL függvényt használhat az ORDER BY záradékban az alapul szolgáló relációs adatbázis típusától függően.