Maybaygiare.org

Blog Network

Vlad Mihalcea

senast ändrad:

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) eller TABLESAMPLE 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-databastabellen

song - databastabellen

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:

song

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:

Song

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 funktionen NEWID 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:

Song

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

sång

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.

funktionenRAND 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.

Transactions and Concurrency Control eBook

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

Lämna ett svar

Din e-postadress kommer inte publiceras.