Imagine having a tool that can automatically detect JPA and Hibernate performance issues. Hypersistence Optimizer on se työkalu!
Introduction
tässä artikkelissa tarkastellaan, miten SQL-kyselyn tulosjoukko voidaan lajitella lausekkeella, joka ottaa TIETOKANTAKOHTAISEN funktion tarjoaman SATUNNAISFUNKTION.
Tämä on erittäin kätevä kikka, varsinkin jos haluaa sekoittaa tietyn tulosjoukon.
huomaa, että suuren tulosjoukon lajittelu SATUNNAISFUNKTION avulla saattaa osoittautua hyvin hitaaksi, joten varmista, että teet sen pienillä tulosjoukoilla.
Jos joudut sekoittamaan suuren tulosjoukon ja rajoittamaan sitä jälkeenpäin, on parempi käyttää jotain Oraclen
SAMPLE(N)
taiTABLESAMPLE
SQL-palvelimessa tai PostgreSQL: ssä satunnaisfunktion sijaan lausekkeittain järjestyksessä.
Tietokantataulukko
oletetaan, että kehitämme musiikkisoittimen työpöytäsovellusta, ja meillä on seuraava song
taulukko Tietokannassamme.
song
taulukko on asuttu seuraavasti:
id | artist | title |
---|---|---|
1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
2 | HAIM | Don’t Save Me (Cyril Hahn Remix) |
3 | 2Pac ft. DMX | Rise Of a Champion (GalilHD Remix) |
4 | Ed Sheeran & Passenger | No Diggity (Kygo Remix) | 5 | jp Cooper ft. Mali-Koa | All This Love |
käyttämällä satunnaista funktiota SQL-järjestyksessä lausekkeittain
haluamme sekoittaa kappalelistaa siten, että jokainen uusi soittolista on erilainen kuin aiemmin luotu. Aina kun meidän täytyy lajitella tietyn SQL kyselyn tulosjoukko, meidän on käytettävä järjestyksessä lauseke.
palanneiden rivien satunnaistamiseen tarvitaan kuitenkin LAUSEKKEITTAIN järjestys, jossa käytetään funktiota tai tietokantaobjektia, joka palauttaa satunnaisarvon jokaiselle SQL-tulosjoukon riville.
kuten jo mainittiin, satunnaisarvoja palauttavan tietokantakohtaisen funktion käyttäminen sopii vain pienille tulosjoukoille, koska muuten SQL-kyselyn suorituskyky tulee vaikuttamaan. Onneksi meidän tapauksessamme song
taulukko edustaa työpöytäsovelluksen nykyistä soittolistaa, joten tulosjoukon koko on kohtuullinen.
Oracle
Oraclessa on käytettävä DBMS_RANDOM.VALUE
funktiota, kuten seuraavasta esimerkistä ilmenee:
SELECT artist||' - '||title AS songFROM songORDER BY DBMS_RANDOM.VALUE
suoritettaessa yllä olevaa SQL-kyselyä Oraclessa saadaan seuraava tulosjoukko:
HAIM – Don ’ t Save Me (Cyril Hahn Remix)
Ed Sheeran&Passenger – No Diggity (Kygo Remix)
Miyagi&Эндшпиль ft. Рем Дигга – I Got Love
JP Cooper ft. Mali-Koa-All This Love
2Pac ft. DMX-Rise Of a Champion (GalilHD Remix)
huomaa, että kappaleet on listattu satunnaisessa järjestyksessä, kiitos DBMS_RANDOM.VALUE
funktiokutsun, jota the ORDER BY clause käyttää.
VALUE
funktioDBMS_RANDOM
paketti palauttaa numeerisen arvon [0, 1) väliltä 38 murtoluvun tarkkuudella.
SQL Server
SQL Server-palvelussa on käytettävä NEWID
funktiota, kuten seuraavasta esimerkistä ilmenee:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY NEWID()
kun yllä olevaa SQL-kyselyä suoritetaan SQL Server-palvelussa, seuraava tulosjoukko on saatu:
Miyagi & эндшпиль ft. Рем Дигга – I Got Love
HAIM-Don ’ t Save Me (Cyril Hahn Remix)
2Pac ft. DMX-Rise Of a Champion (GalilHD Remix)
Ed Sheeran & Passenger – No Diggity (Kygo Remix)
JP Cooper ft. Mali-Koa-All This Love
huomaa, että kappaleet on listattu satunnaisessa järjestyksessä, kiitos NEWID()
funktiokutsun, jota the ORDER BY clause käyttää.
NEWID
funktio palauttaauniqueidentifier
tietotyypin, joka edustaa 16-tavuista GUIDIA. Näin ollen jokainenNEWID
funktion palauttama uusi arvo tulee olemaan käytännössä ainutlaatuinen.
PostgreSQL
PostgreSQL: ssä on käytettävä random
funktiota, kuten seuraavasta esimerkistä ilmenee:
SELECT artist||' - '||title AS songFROM songORDER BY random()
yllä olevaa SQL-kyselyä suoritettaessa PostgreSQL: ssä saadaan seuraava tulosjoukko:
jp Cooper Ft. Mali-Koa-All This Love
2Pac ft. DMX – Rise Of a Champion (GalilHD Remix)
HAIM – Don ’ t Save Me (Cyril Hahn Remix)
Ed Sheeran & Passenger – No Diggity (Kygo Remix)
Miyagi & Эндшпиль ft. Рем Дигга-I Got Love
huomaa, että kappaleet on listattu satunnaisessa järjestyksessä, kiitos random()
funktiokutsun, jota ORDER BY clause käyttää.
random
funktio palauttaa numeerisen arvon , 1) väliltädouble precision
tyyppi.
MySQL
MySQL: ssä on käytettävä RAND
funktiota, kuten seuraavasta esimerkistä ilmenee:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY RAND()
kun yllä olevaa SQL-kyselyä suoritetaan MySQL: ssä, saadaan seuraava tulosjoukko
2Pac ft. DMX-Rise Of a Champion (GalilHD Remix)
JP Cooper ft. Mali-Koa-All This Love
Miyagi & Эндшпиль ft. Рем Дигга – I Got Love
Ed Sheeran & Passenger – No Diggity (Kygo Remix)
HAIM – Don ’ t Save Me (Cyril Hahn Remix)
huomaa, että kappaleet on listattu satunnaisessa järjestyksessä, kiitos RAND()
funktiokutsu, jota käytetään järjestyksessä Lausekkeittain.
RAND
funktio palauttaa numeerisen arvon liukulukutyypin [0, 1) välein.
JPA ja Hibernate
kun käytät JPA-ja Hibernate-entiteettikyselyjä, voit vain siirtää satunnaisfunktion järjestykseen lausekkeella, kuten seuraava JPQL-kysely osoittaa:
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY random()", Song.class).getResultList();
yllä oleva jpql-kysely toimii mainiosti PostgreSQL: lle, SQL Serverille ja MySQL: lle, koska random()
NEWID()
tai RAND()
funktiot siirtyvät Hibernate AS-IS: n kautta SQL-järjestykseen mennessä.
oraakkelille, koska satunnaisuuden antaa DBMS_RANDOM.VALUE
lukugeneraattori, on se viitattava SQL-funktiona (esim., DBMS_RANDOM.VALUE()
):
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY DBMS_RANDOM.VALUE()", Song.class).getResultList();
That ’ s it!
Nettityöpajat
Jos tykkäsit tästä artikkelista, ihastut varmasti tulevaan 4-päiväiseen Nettityöpajaani!
- korkean suorituskyvyn Java-pysyvyys Online-työpaja (4 tuntia x 4 päivää) 19.-22. Huhtikuuta välisenä aikana
johtopäätös
SQL-kyselyn tulosjoukon Satunnaistaminen on yleinen vaatimus, joten on hyödyllistä tietää mitä SQL funktio voit käyttää järjestyksessä lauseke riippuen taustalla relaatiotietokannan tyyppi.