Maybaygiare.org

Blog Network

Vlad Mihalcea

ultima modificare:

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 OracleSAMPLE(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 bazei de date cântec

tabelul bazei de date cântec

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:

cântec

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țiaVALUE 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:

cântec

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ă de NEWID 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:

song

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țiarandom 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:

cântec

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țiaRAND 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.

Transactions and Concurrency Control eBook

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

Lasă un răspuns

Adresa ta de email nu va fi publicată.