Imaginați-vă că aveți un instrument care poate detecta automat JPA și hibernează problemele de performanță. Hypersistance Optimizer este acel instrument!
Introducere
În acest articol, vom vedea cum putem sorta un set de rezultate de interogare SQL folosind o clauză ORDER BY care ia o funcție aleatorie furnizată de o funcție specifică bazei de date.
acesta este un truc foarte util, mai ales atunci când doriți să amestecați un set de rezultate dat.
rețineți că sortarea unui set mare de rezultate folosind o funcție aleatorie s-ar putea dovedi a fi foarte lentă, deci asigurați-vă că faceți acest lucru pe seturi mici de rezultate.
dacă trebuie să amestecați un set mare de rezultate și să îl limitați ulterior, atunci este mai bine să utilizați ceva de genul Oracle
SAMPLE(N)
sauTABLESAMPLE
în SQL Server sau PostgreSQL în loc de o funcție aleatorie în clauza ORDER BY.
tabelul bazei de date
Să presupunem că dezvoltăm o aplicație desktop music player și avem următorul tabelsong
în Baza noastră de date.
tabelul song
este populat după cum urmează:
id | artist | title |
---|---|---|
1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
2 | HAIM | Don’t Save Me (Cyril Hahn Remix) |
3 | 2Pac ft. DMX | creșterea unui campion (GalilHD Remix) |
4 | Ed Sheeran & pasager | fără Diggity (Kygo Remix) |
5 | jp cooper ft. Mali-Koa | toată această dragoste |
folosind o funcție aleatorie în clauza SQL ORDER BY
vrem să amestecăm lista de melodii astfel încât fiecare listă de redare nouă să fie diferită de cea generată anterior. Ori de câte ori trebuie să sortăm un anumit set de rezultate de interogare SQL, trebuie să folosim clauza ORDER BY.
cu toate acestea, pentru a randomiza rândurile returnate, avem nevoie de clauza ORDER BY pentru a utiliza o funcție sau un obiect de bază de date care returnează o valoare aleatorie pentru fiecare rând conținut în setul de rezultate SQL.
după cum sa menționat deja, utilizarea unei funcții specifice bazei de date care returnează valori aleatorii este potrivită numai pentru seturi de rezultate mici, deoarece altfel, performanța interogării SQL va fi afectată. Din fericire, în cazul nostru, tabelul song
reprezintă lista de redare curentă a unei aplicații desktop, prin urmare dimensiunea setului de rezultate este rezonabilă.
Oracle
pe Oracle, trebuie să utilizați funcția DBMS_RANDOM.VALUE
, așa cum este ilustrat de următorul exemplu:
SELECT artist||' - '||title AS songFROM songORDER BY DBMS_RANDOM.VALUE
când executați interogarea SQL de mai sus pe Oracle, se obține următorul set de rezultate:
HAIM – nu mă salva (Cyril Hahn Remix)
Ed Sheeran& pasager – nu Diggity (Kygo Remix)
Miyagi& Ft. Am dragoste
jp cooper ft. Mali-Koa-toate acestea dragoste
2Pac ft. DMX-Rise of a Champion (GalilHD Remix)
observați că melodiile sunt listate în ordine aleatorie, datorită DBMS_RANDOM.VALUE
apel de funcție utilizat de clauza ORDER BY.
funcția
VALUE
din pachetulDBMS_RANDOM
returnează o valoare numerică în intervalul [0, 1) cu o precizie de 38 de cifre fracționare.
SQL Server
pe SQL Server, trebuie să utilizați funcția NEWID
, așa cum este ilustrat de următorul exemplu:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY NEWID()
când executați interogarea SQL de mai sus pe SQL Server, următorul set de rezultate este obținut:
Miyagi & ft.
Haim – nu mă salva (Cyril Hahn Remix)
2pac ft. DMX-creșterea unui campion (GalilHD Remix)
Ed Sheeran& pasager – nu Diggity (Kygo Remix)
JP Cooper ft. Mali – Koa-toate acestea dragoste
observați că melodiile sunt listate în ordine aleatorie, datorită NEWID()
funcția de apel utilizat de comanda de clauza.
NEWID
funcția returnează un tip de dateuniqueidentifier
reprezentând un GUID de 16 octeți. Prin urmare, fiecare nouă valoare returnată deNEWID
funcția va fi practic unică.
PostgreSQL
pe PostgreSQL, trebuie să utilizați funcțiarandom
, așa cum este ilustrat de următorul exemplu:
SELECT artist||' - '||title AS songFROM songORDER BY random()
când executați interogarea SQL de mai sus pe PostgreSQL, se obține următorul set de rezultate:
JP Cooper Ft. Mali-Koa-toate acestea dragoste
2Pac ft. DMX-ridicarea unui campion (GalilHD Remix)
HAIM – nu mă salva (Cyril Hahn Remix)
Ed Sheeran& pasager – nu Diggity (Kygo Remix)
Miyagi& Ft. Notă că melodiile sunt listate în ordine aleatorie, datorită random()
funcția de apel utilizat de comanda de clauza.
funcția
random
returnează o valoare numerică în intervalul [0, 1) al tipuluidouble precision
.
MySQL
pe MySQL, trebuie să utilizați funcțiaRAND
, așa cum este ilustrat de următorul exemplu:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY RAND()
când executați interogarea SQL de mai sus pe MySQL, se obține următorul set de rezultate:
2pac ft. DMX-creșterea unui campion (GalilHD Remix)
JP Cooper ft. Mali-Koa – toate acestea dragoste
Miyagi& Ft.
ed sheeran & pasager – nu diggity (Kygo Remix)
Haim – nu mă salva (Cyril Hahn Remix)
observați că melodiile sunt listate în ordine aleatorie, datorită RAND()
apel funcție folosit de clauza ORDER BY.
funcția
RAND
returnează o valoare numerică în intervalul [0, 1) al unui tip în virgulă mobilă.
JPA și Hibernare
atunci când se utilizează JPA și hibernare interogări entitate, puteți trece doar funcția aleatoare la comanda de clauza așa cum este ilustrat de următoarea interogare JPQL:
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY random()", Song.class).getResultList();
interogarea JPQL de mai sus va funcționa foarte bine pentru PostgreSQL, SQL Server, și MySQL deoarece random()
NEWID()
sau RAND()
funcțiile vor fi transmise prin hibernare ca-este la ordinea SQL de.
pentru Oracle, deoarece randomitatea este dată deDBMS_RANDOM.VALUE
generator de numere, va trebui să-l referiți ca o funcție SQL (de exemplu, DBMS_RANDOM.VALUE()
):
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY DBMS_RANDOM.VALUE()", Song.class).getResultList();
asta e!
ateliere Online
Dacă v-a plăcut acest articol, pun pariu că veți iubi viitorul meu atelier online de 4 zile!
- atelier online de persistență Java de înaltă performanță (4 ore x 4 zile) între 19 și 22 aprilie
concluzie
randomizarea setului de rezultate al interogării SQL este o cerință comună, deci este util să știm ce este funcția SQL puteți utiliza în clauza ORDER BY în funcție de tipul bazei de date relaționale subiacente.