Maybaygiare.org

Blog Network

Vlad Mihalcea

Utolsó módosítás:

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 a TABLESAMPLE 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 daladatbázis-táblázat

a daladatbázis-táblázat

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:

dal

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 a DBMS_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:

dal

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 egy uniqueidentifier adattípust ad vissza, amely egy 16 bájtos GUID-t jelent. Ezért a NEWID 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:

dal

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 a double 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:

dal

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.

Transactions and Concurrency Control eBook

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

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.