Maybaygiare.org

Blog Network

Vlad Mihalcea

Last modified:

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) tai TABLESAMPLE 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.

kappaletietokantataulukko

kappaletietokantataulukko

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:

song

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 funktio DBMS_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:

Song

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 palauttaa uniqueidentifier tietotyypin, joka edustaa 16-tavuista GUIDIA. Näin ollen jokainen NEWID 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:

Song

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

Song

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.

Transactions and Concurrency Control eBook

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

Vastaa

Sähköpostiosoitettasi ei julkaista.