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 deTABLESAMPLE
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 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:
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 hetDBMS_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:
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 eenuniqueidentifier
gegevenstype terug dat een 16-byte GUID vertegenwoordigt. Daarom zal elke nieuwe waarde die wordt geretourneerd door de functieNEWID
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:
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 hetdouble 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:
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.