Tänk dig att ha ett verktyg som automatiskt kan upptäcka JPA och viloläge prestandaproblem. Hypersistence Optimizer är det verktyget!
introduktion
i den här artikeln kommer vi att se hur vi kan sortera en SQL-frågeresultat med en ORDER BY-sats som tar en slumpmässig funktion som tillhandahålls av en databasspecifik funktion.
detta är ett mycket praktiskt trick, särskilt när du vill blanda en given resultatuppsättning.
Observera att sortering av en stor resultatuppsättning med en slumpmässig funktion kan visa sig vara mycket långsam, så se till att du gör det på små resultatuppsättningar.
Om du måste blanda en stor resultatuppsättning och begränsa den efteråt är det bättre att använda något som Oracle
SAMPLE(N)
ellerTABLESAMPLE
I SQL Server eller PostgreSQL istället för en slumpmässig funktion i ORDER BY-klausulen.
databastabell
låt oss anta att vi utvecklar en skrivbordsprogram för musikspelare, och vi har följandesong
tabell i vår databas.
song
tabellen fylls i enligt följande:
id | artist | title |
---|---|---|
1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
2 | HAIM | Don’t Save Me (Cyril Hahn Remix) |
3 | 2Pac ft. DMX | ökning av en mästare (Galilehd Remix) |
4 | Ed Sheeran & passagerare | ingen Diggity (Kygo Remix) |
5 | jp Cooper ft. Mali-Koa | All This Love |
använda en slumpmässig funktion i SQL ORDER BY-klausulen
vi vill blanda låtlistan så att varje ny spellista är annorlunda än en tidigare genererad. När vi behöver Sortera en given SQL – frågeresultat måste vi använda ORDER BY-klausulen.
men för att randomisera de returnerade raderna behöver vi ORDER BY-satsen för att använda en funktion eller databasobjekt som returnerar ett slumpmässigt värde för varje rad som finns i SQL-resultatuppsättningen.
som redan nämnts är användning av en databasspecifik funktion som returnerar slumpmässiga värden endast lämplig för små resultatuppsättningar, eftersom annars kommer SQL-frågans prestanda att påverkas. Lyckligtvis, i vårt fall, representerar song
tabellen den aktuella spellistan för en stationär applikation, varför storleken på resultatuppsättningen är rimlig.
Oracle
på Oracle måste du använda funktionen DBMS_RANDOM.VALUE
, som illustreras av följande exempel:
SELECT artist||' - '||title AS songFROM songORDER BY DBMS_RANDOM.VALUE
När du kör SQL-frågan ovan på Oracle erhålls följande resultatuppsättning:
HAIM – spara mig inte (Cyril Hahn Remix)
Ed Sheeran & passagerare – ingen Diggity (Kygo Remix)
Miyagi & Ukrainian Ft. Jag älskar dig. Mali-Koa-All denna kärlek
2Pac ft. DMX-Rise of A Champion (Galilehd Remix)
Lägg märke till att låtarna listas i slumpmässig ordning tack vare DBMS_RANDOM.VALUE
funktionsanrop som används av ORDER BY-klausulen.
VALUE
funktionen iDBMS_RANDOM
paketet returnerar ett numeriskt värde i intervallet [0, 1) med en precision på 38 bråk siffror.
SQL Server
på SQL Server måste du använda funktionen NEWID
, som illustreras av följande exempel:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY NEWID()
När du kör SQL-frågan ovan på SQL Server är följande resultatuppsättning erhållen:
Miyagi & Bisexuell ft. Jag fick kärlek
Haim-rädda mig inte (Cyril Hahn Remix)
2pac ft. DMX-ökningen av en mästare (Galilehd Remix)
Ed Sheeran& passagerare – ingen Diggity (Kygo Remix)
JP Cooper ft. Mali-Koa-All This Love
Lägg märke till att låtarna listas i slumpmässig ordning tack vare NEWID()
funktionsanrop som används av ORDER BY-klausulen.
NEWID
returnerar enuniqueidentifier
datatyp som representerar en 16-byte GUID. Därför kommer varje nytt värde som returneras av funktionenNEWID
att vara praktiskt taget unik.
PostgreSQL
på PostgreSQL måste du använda funktionen random
, som illustreras av följande exempel:
SELECT artist||' - '||title AS songFROM songORDER BY random()
När du kör SQL-frågan ovan på PostgreSQL, följande resultatuppsättning erhålls:
jp Cooper Ft. Mali-Koa-All denna kärlek
2Pac ft. DMX – Rise of A Champion (Galilehd Remix)
HAIM – rädda mig inte (Cyril Hahn Remix)
Ed Sheeran & passagerare-ingen Diggity (Kygo Remix)
Miyagi & Occulian Ft. Lägg märke till att låtarna listas i slumpmässig ordning tack vare random()
funktionsanrop som används av order BY-klausulen.
funktionen
random
returnerar ett numeriskt värde i intervallet [0, 1) för typendouble precision
.
MySQL
på MySQL måste du använda funktionen RAND
, som illustreras av följande exempel:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY RAND()
När du kör SQL-frågan ovan på MySQL erhålls följande resultatuppsättning:
2Pac ft. DMX-ökningen av en mästare (Galilehd Remix)
JP Cooper ft. Mali-Koa-All denna kärlek
Miyagi& Brasilian Ft.
ed sheeran & passagerare – ingen Diggity (Kygo Remix)
Haim – spara mig inte (Cyril Hahn Remix)
lägg märke till att låtarna listas i slumpmässig ordning tack vare RAND()
funktionssamtal används av order BY – klausulen.
funktionen
RAND
returnerar ett numeriskt värde i intervallet [0, 1) för en flyttalstyp.
JPA och Hibernate
När du använder JPA och Hibernate entity-frågor kan du bara skicka den slumpmässiga funktionen till ORDER BY-klausulen som illustreras av följande JPQL-fråga:
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY random()", Song.class).getResultList();
jpql-frågan ovan fungerar bra för PostgreSQL, SQL Server och MySQL eftersom random()
NEWID()
eller RAND()
funktioner kommer att överföras av viloläge som-är till SQL-ordningen av.
För Oracle, eftersom slumpmässigheten ges av nummergeneratorn DBMS_RANDOM.VALUE
, måste du referera till den som en SQL-funktion (t. ex. DBMS_RANDOM.VALUE()
):
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY DBMS_RANDOM.VALUE()", Song.class).getResultList();
det är det!
online Workshops
Om du haft den här artikeln, Jag slår vad om att du kommer att älska min kommande 4-dagars Online Workshop!
- högpresterande Java Persistens Online Workshop (4 timmar x 4 dagar) mellan 19 och 22 April
slutsats
Randomisering av SQL-frågeresultatuppsättningen är ett vanligt krav, så det är användbart att veta vilken SQL-funktion du kan använda i order by-satsen beroende på den underliggande Relationsdatabastypen.