Maybaygiare.org

Blog Network

Vlad Mihalcea

Sidst ændret:

Forestil dig at have et værktøj, der automatisk kan registrere JPA og dvale ydelsesproblemer. Hyperssistensoptimering er det værktøj!

introduktion

i denne artikel skal vi se, hvordan vi kan sortere et FORESPØRGSELSRESULTATSÆT ved hjælp af en ordre efter klausul, der tager en tilfældig funktion leveret af en databasespecifik funktion.

dette er et meget praktisk trick, især når du vil blande et givet resultatsæt.

Bemærk, at sortering af et stort resultatsæt ved hjælp af en tilfældig funktion kan vise sig at være meget langsom, så sørg for at gøre det på små resultatsæt.

Hvis du skal blande et stort resultatsæt og begrænse det bagefter, er det bedre at bruge noget som Oracle SAMPLE(N) eller TABLESAMPLE i en tilfældig funktion i rækkefølge efter klausul.

databasetabel

lad os antage, at vi udvikler en Music player desktop-applikation, og vi har følgendesong tabel i vores database.

sangdatabasetabellen

sangdatabasetabellen

song tabellen udfyldes som følger:

id artist title
1 Miyagi & Эндшпиль ft. Рем Дигга I Got Love
2 HAIM Don’t Save Me (Cyril Hahn Remix)
3 2Pac ft. Rise of a Champion
4 Ed Sheeran & passager ingen Diggity (Kygo Remiks)
5 jp Cooper ft. Mali-Koa al denne kærlighed

brug af en tilfældig funktion i rækkefølge efter klausul

vi vil blande sanglisten, så hver nye afspilningsliste er anderledes end en tidligere genereret. Når vi har brug for at sortere et givet FORESPØRGSELSRESULTATSÆT, er vi nødt til at bruge ordreklausulen.

for at randomisere de returnerede rækker har vi dog brug for klausulen ORDER BY for at bruge en funktion eller et databaseobjekt, der returnerer en tilfældig værdi for hver række, der er indeholdt i resultatsættet.

som allerede nævnt er brug af en databasespecifik funktion, der returnerer tilfældige værdier, kun egnet til små resultatsæt. Heldigvis repræsenterer song tabellen i vores tilfælde den aktuelle afspilningsliste for en desktop-applikation, hvorfor størrelsen på resultatsættet er rimelig.

Oracle

på Oracle skal du bruge funktionenDBMS_RANDOM.VALUE som illustreret ved følgende eksempel:

SELECT artist||' - '||title AS songFROM songORDER BY DBMS_RANDOM.VALUE

Når du udfører forespørgslen ovenfor på Oracle, opnås følgende resultatsæt:

song

HAIM – red mig ikke (Cyril Hahn Remiks)

Ed Sheeran& passager – ingen Diggity (Kygo Remiks)

Miyagi& ren Ft. – Jeg fik Kærlighed

jp Cooper ft. Mali-Koa – al denne kærlighed

2pac ft. Bemærk, at sangene bliver opført i tilfældig rækkefølge takket være DBMS_RANDOM.VALUE funktionsopkald, der bruges af Order by-klausulen.

VALUE funktionen iDBMS_RANDOM pakken returnerer en numerisk værdi i [0, 1) intervallet med en præcision på 38 fraktionerede cifre.

på kvm-serveren skal du bruge funktionen NEWID som illustreret ved følgende eksempel:

SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY NEWID()

Når du udfører følgende resultatsæt er opnået:

sang

Miyagi & ret ft. Jeg fik Kærlighed

Haim – red mig ikke (Cyril Hahn remiks)

2pac ft. Ed Sheeran& passager – ingen Diggity (Kygo Remiks)

JP Cooper ft. Mali – Koa-al denne kærlighed

Bemærk, at sangene vises i tilfældig rækkefølge takket være NEWID() funktionsopkald, der bruges af Order by-klausulen.

NEWID funktionen returnerer enuniqueidentifier datatype, der repræsenterer en 16-byte GUID. Derfor vil hver ny værdi, der returneres af NEWID – funktionen, være næsten unik.

Postgreskl

på Postgreskl skal du bruge funktionen random som illustreret ved følgende eksempel:

SELECT artist||' - '||title AS songFROM songORDER BY random()

Når du udfører følgende resultatsæt er opnået:

sang

jp Cooper ft. Mali-Koa – al denne kærlighed

2pac ft. HAIM – red mig ikke (Cyril Hahn Remiks)

Ed Sheeran & Passenger – No Diggity (Kygo Remiks)

Miyagi & ren Ft. Bemærk, at sangene vises i tilfældig rækkefølge takket værerandom()funktionsopkald, der bruges af Order by-klausulen.

random funktionen returnerer en numerisk værdi i [0, 1) intervallet fordouble precision type.

Myskl

på Myskl skal du bruge funktionen RAND som illustreret ved følgende eksempel:

SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY RAND()

Når du udfører forespørgslen ovenfor på Myskl, vises følgende resultat sæt opnås:

sang

2pac ft. JP Cooper ft. Mali-Koa – al denne kærlighed

Miyagi& liter Ft. Jeg fik Kærlighed

ed sheeran & passager – ingen diggity (Kygo Remiks)

Haim – gem mig ikke (Cyril Hahn remiks)

bemærk, at sangene vises i tilfældig rækkefølge takket være RAND() funktionsopkald bruges af ordren efter Klausul.

RAND funktionen returnerer en numerisk værdi i [0, 1) intervallet af en flydende punkttype.

JPA og Hibernate

når du bruger JPA-og Hibernate-enhedsforespørgsler, kan du bare videregive den tilfældige funktion til ordreforespørgslen efter klausul som illustreret af følgende JPV-forespørgsel:

List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY random()", Song.class).getResultList();

JPV-forespørgslen ovenfor fungerer fint for Postgreskl, siden random()NEWID() eller RAND() funktionerne vil blive bestået af Hibernate as-is til KVL-ordren af.

For Oracle, da tilfældigheden er givet af DBMS_RANDOM.VALUE talgenerator, skal du henvise til det som en KVM-funktion (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 værksteder

Hvis du nød denne artikel, vil jeg vædde på, at du vil elske mit kommende 4-dages online værksted!

  • højtydende Java Persistens online værksted (4 timer 4 dage) mellem den 19.og 22. April

konklusion

randomisering af FORESPØRGSELSRESULTATSÆTTET er et fælles krav, så det er nyttigt at vide, hvilken funktion Du kan bruge i klausulen rækkefølge efter, afhængigt af den underliggende relationsdatabasetype.

Transactions and Concurrency Control eBook

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.