Maybaygiare.org

Blog Network

Vlad Mihalcea

Laatst gewijzigd:

stel je voor dat je een tool hebt die automatisch JPA kan detecteren en prestatieproblemen in slaapstand kan houden. Hypersistence Optimizer is dat Gereedschap!

Introduction

in dit artikel gaan we kijken hoe we een SQL query result set kunnen sorteren met behulp van een ORDER BY clausule die een willekeurige functie neemt die wordt geleverd door een database-specifieke functie.

Dit is een erg handige truc, vooral als je een gegeven resultaatset wilt schudden.

merk op dat het sorteren van een grote resultaatset met behulp van een willekeurige functie erg traag kan zijn, dus zorg ervoor dat je dat doet op kleine resultaatsets.

Als u een grote resultaatset moet shuffelen en deze daarna moet beperken, dan is het beter om iets als Oracle SAMPLE(N) of de TABLESAMPLE in SQL Server of PostgreSQL te gebruiken in plaats van een willekeurige functie in de ORDER BY-clausule.

databasetabel

laten we aannemen dat we een desktoptoepassing voor muziekspelers ontwikkelen, en we hebben de volgende song tabel in onze database.

de tabel met de lieddatabase

de tabel met de lieddatabase

de tabel met de song wordt als volgt ingevuld:

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

met behulp van een willekeurige functie in de SQL-volgorde volgens clausule

willen we de lijst met nummers schudden zodat elke nieuwe afspeellijst anders is dan een eerder gegenereerde. Wanneer we een bepaalde SQL query result set moeten sorteren, moeten we de ORDER BY clausule gebruiken.

echter, om de geretourneerde rijen te randomiseren, hebben we de volgorde per clausule nodig om een functie of databaseobject te gebruiken die een willekeurige waarde retourneert voor elke rij in de SQL-resultaatset.

zoals reeds vermeld, is het gebruik van een database-specifieke functie die willekeurige waarden retourneert alleen geschikt voor kleine resultaatsets, omdat anders de prestaties van de SQL-query zullen worden beïnvloed. Gelukkig vertegenwoordigt de tabel song de huidige afspeellijst van een desktoptoepassing, vandaar dat de grootte van de resultaatset redelijk is.

Oracle

Op Oracle moet u de functie DBMS_RANDOM.VALUE gebruiken, zoals wordt geïllustreerd door het volgende voorbeeld:

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

bij het uitvoeren van de SQL-query hierboven op Oracle, wordt de volgende resultaatset verkregen:

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)

merk op dat de nummers in willekeurige volgorde worden weergegeven, dankzij de DBMS_RANDOM.VALUE functie aanroep gebruikt door de ORDER BY-clausule.

de VALUE functie in het DBMS_RANDOM pakket retourneert een numerieke waarde in het [0, 1) interval met een precisie van 38 fractionele cijfers.

SQL Server

Op SQL Server moet u de functie NEWID gebruiken, zoals wordt geïllustreerd door het volgende voorbeeld:

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

bij het uitvoeren van de SQL-query hierboven op SQL Server, het volgende resultaat instellen wordt verkregen:

lied

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

merk op dat de nummers in willekeurige volgorde worden weergegeven, dankzij de NEWID() functie aanroep gebruikt door de ORDER BY-clausule.

de functie NEWID geeft een uniqueidentifier gegevenstype terug dat een 16-byte GUID vertegenwoordigt. Daarom zal elke nieuwe waarde die wordt geretourneerd door de functie NEWID vrijwel uniek zijn.

PostgreSQL

Op PostgreSQL moet u de functie random gebruiken, zoals geïllustreerd door het volgende voorbeeld:

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

bij het uitvoeren van de SQL-query hierboven op PostgreSQL, het volgende resultaat set wordt verkregen:

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

merk op dat de nummers in willekeurige volgorde worden weergegeven, dankzij de random() functie aanroep gebruikt door de ORDER BY-clausule.

de functie random geeft een numerieke waarde terug in het [0, 1) interval van het double precision type.

MySQL

Op MySQL moet u de functie RAND gebruiken, zoals geïllustreerd door het volgende voorbeeld:

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

bij het uitvoeren van de SQL-query hierboven op MySQL, wordt het volgende resultaat verkregen:

song

2pac Ft. DMX-Rise Of A Champion (GalilHD Remix)

JP Cooper ft. Mali-Koa-al deze liefde

Miyagi & Эндшпиль ft. Рем Дигга – I Got Love

Ed Sheeran & Passenger – No Diggity (Kygo Remix)

HAIM – Don ‘ t Save Me (Cyril Hahn Remix)

merk op dat de nummers in willekeurige volgorde worden weergegeven, dankzij de RAND() functie aanroep gebruikt door de order by-clausule.

de functie RAND geeft een numerieke waarde terug in het [0, 1) interval van een floating-point type.

PPV-en Slaapstand

Bij het gebruik van JPA en Slaapstand entiteit query ‘ s, kunt u net voorbij de random-functie om de ORDER BY-component, zoals geïllustreerd door de volgende JPQL query:

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

De JPQL query boven zal prima werken voor PostgreSQL, SQL Server, en MySQL sinds de random()NEWID() of RAND() functies zal worden doorgegeven door Overwinteren aan de SQL-OPDRACHT DOOR.

voor Oracle, aangezien de willekeur wordt gegeven door deDBMS_RANDOM.VALUE getalgenerator, moet u het als een SQL-functie (bijvoorbeeld DBMS_RANDOM.VALUE()):

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

dat is het!

online Workshops

als je dit artikel leuk vond, dan zal je mijn komende 4-daagse online Workshop geweldig vinden!

  • High-Performance Java Persistence Online Workshop (4 uur x 4 dagen) tussen 19 en 22 April

conclusie

randomiseren van de SQL query result set is een veel voorkomende vereiste, dus het is nuttig om te weten wat SQL functie die u kunt gebruiken in de order by-clausule, afhankelijk van het onderliggende relationele databasetype.

Transactions and Concurrency Control eBook

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

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.