Tenk deg å ha et verktøy som automatisk kan oppdage jpa og Dvalemodus ytelsesproblemer. Hypersistence Optimizer er det verktøyet!
Introduksjon
I denne artikkelen skal Vi se hvordan VI kan sortere ET SQL-spørringsresultatsett ved hjelp av EN ORDER BY-klausul som tar EN TILFELDIG funksjon levert av en databasespesifikk funksjon.
Dette er et veldig praktisk triks, spesielt når du vil blande et gitt resultatsett.
Merk at sortering av et stort resultatsett ved HJELP av EN TILFELDIG funksjon kan vise seg å være veldig sakte, så sørg for at du gjør det på små resultatsett.
Hvis du må blande et stort resultatsett og begrense det etterpå, er det bedre å bruke Noe som Oracle
SAMPLE(N)
ellerTABLESAMPLE
I SQL Server eller PostgreSQL i stedet for en tilfeldig funksjon I ORDER BY-klausulen.
Databasetabell
la oss anta at vi utvikler en musikkspiller desktop applikasjon, og vi har følgende song
tabell i vår database.
tabellen for song
:
id | artist | title |
---|---|---|
1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
2 | HAIM | Don’t Save Me (Cyril Hahn Remix) |
3 | 2Pac ft. DMX | Stigning Av En Mester (GalilHD Remix) | 4 | &Passasjer | Ingen Diggity (Kygo Remix) |
5 | jp cooper ft. Mali-Koa | All This Love |
Ved HJELP AV EN TILFELDIG funksjon i SQL ORDER BY-klausulen
vi vil blande sanglisten slik at hver ny spilleliste er annerledes enn en tidligere generert en. Når vi trenger å sortere et GITT SQL – spørringsresultatsett, må vi bruke ORDER BY-klausulen.
men for å randomisere de returnerte radene, trenger VI ORDER BY-setningen for å bruke en funksjon eller databaseobjekt som returnerer en tilfeldig verdi for hver rad som finnes i SQL-resultatsettet.
som allerede nevnt, bruker en databasespesifikk funksjon som returnerer tilfeldige verdier, bare for små resultatsett, da ELLERS VIL SQL-spørringsytelsen bli påvirket. Heldigvis, i vårt tilfelle, representerer song
tabellen gjeldende spilleliste av et skrivebordsprogram, derfor er størrelsen på resultatsettet rimelig.
Oracle
På Oracle må du brukeDBMS_RANDOM.VALUE
funksjonen, som illustrert ved følgende eksempel:
SELECT artist||' - '||title AS songFROM songORDER BY DBMS_RANDOM.VALUE
når DU utfører SQL-spørringen ovenfor På Oracle, oppnås følgende resultatsett:
HAIM – Ikke Redde Meg (Cyril Hahn Remix)
Ed Sheeran &Passasjer – Ingen Diggity (Kygo Remix)
Miyagi &Эндшпиль Ft. Рем дигга – Jeg Fikk Kjærlighet
jp cooper ft. Mali-Koa-Alt Dette Kjærlighet
2Pac ft. DMX-Rise Of A Champion (GalilHD Remix)
Legg merke til at sangene blir oppført i tilfeldig rekkefølge, takket væreDBMS_RANDOM.VALUE
funksjonskall brukt AV ORDER BY-klausulen.
VALUE
– funksjonen iDBMS_RANDOM
– pakken returnerer en numerisk verdi i [0, 1) – intervallet med en presisjon på 38 fraksjonelle sifre.
SQL Server
PÅ SQL Server må du bruke NEWID
funksjonen, som illustrert ved følgende eksempel:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY NEWID()
når DU utfører SQL-spørringen ovenfor PÅ SQL Server, er følgende resultatsett oppnådd:
miyagi & эндшпиль ft. Рем дигга – Jeg Fikk Kjærlighet
haim – ikke redd meg (CYRIL Hahn Remix)
2pac ft. DMX-Fremveksten Av En Mester (GalilHD Remix)
Ed Sheeran & Passasjer – Ingen Diggity (Kygo Remix)
Jp Cooper ft. Mali – Koa-All This Love
Legg Merke til at sangene blir oppført i tilfeldig rekkefølge, takket væreNEWID()
funksjonskall som brukes AV ORDER BY-klausulen.
NEWID
-funksjonen returnerer enuniqueidentifier
datatype som representerer EN 16-byte GUID. Derfor vil hver ny verdi returnert avNEWID
– funksjonen være nesten unik.
PostgreSQL
På PostgreSQL må du brukerandom
funksjonen, som illustrert ved følgende eksempel:
SELECT artist||' - '||title AS songFROM songORDER BY random()
når DU utfører SQL-spørringen ovenfor På PostgreSQL, følgende resultatsett er oppnådd:
jp Cooper Ft. Mali-Koa-Alt Dette Kjærlighet
2Pac ft. DMX-Fremveksten Av En Mester (GalilHD Remix)
HAIM-Ikke Redde Meg (Cyril Hahn Remix)
Ed Sheeran & Passasjer – Ingen Diggity (Kygo Remix)
Miyagi & Эндшпиль Ft. Рем дигга – I Got Love
legg merke til at sangene blir oppført i tilfeldig rekkefølge, takket være random()
funksjonskall som brukes av order by-klausulen.
random
– funksjonen returnerer en numerisk verdi i [0, 1) – intervallet tildouble precision
– typen.
MySQL
På MySQL må du bruke RAND
funksjonen, som illustrert ved følgende eksempel:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY RAND()
når DU utfører SQL-spørringen ovenfor På MySQL, oppnås følgende resultatsett:
2pac ft. DMX-Fremveksten Av En Mester (GalilHD Remix)
JP Cooper ft. Mali-Koa-All Denne Kjærligheten
Miyagi & Эндшпиль Ft. Рем дигга – Jeg Fikk Kjærlighet
ed sheeran & passasjer – ingen diggity (Kygo Remix)
haim – ikke lagre meg (CYRIL Hahn Remix)
legg merke til at sangene blir oppført i tilfeldig rekkefølge, takket være RAND()
funksjon call brukes Av Order By-Klausulen.
RAND
funksjonen returnerer en numerisk verdi i [0, 1) – intervallet av en flyttallstype.
JPA og Hibernate
når du bruker jpa og Hibernate entitetsforespørsler, kan du bare sende tilfeldig funksjon TIL ORDER BY-klausulen som illustrert av følgende jpql-spørring:
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY random()", Song.class).getResultList();
Jpql-spørringen ovenfor vil fungere fint for PostgreSQL, SQL Server og MySQL siden random()
NEWID()
ELLER RAND()
FUNKSJONER vil bli overført av dvalemodus som det er til sql-rekkefølgen ved.
For Oracle, siden tilfeldigheten er gitt avDBMS_RANDOM.VALUE
nummergenerator, må du referere den som EN SQL-funksjon (f. eks. DBMS_RANDOM.VALUE()
):
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY DBMS_RANDOM.VALUE()", Song.class).getResultList();
Det er det!
Online Workshops
hvis du likte denne artikkelen, vedder jeg på at du kommer til å elske min kommende 4-dagers Online Workshop!
- Høy Ytelse Java Utholdenhet Online Workshop (4 timer x 4 dager) mellom 19.og 22. April
Konklusjon
Randomisering AV SQL-spørringen resultatsettet er et vanlig krav, så det er nyttig å vite hvilken sql-funksjon du kan bruke I order by-Setningsdelen, Avhengig Av Den Underliggende Relasjonsdatabasetypen.