Maybaygiare.org

Blog Network

Vlad Mihalcea

Ultima modifica:

Immagina di avere uno strumento in grado di rilevare automaticamente JPA e ibernare i problemi di prestazioni. Hypersistence Optimizer è quello strumento!

Introduzione

In questo articolo, vedremo come ordinare un set di risultati di query SQL utilizzando una clausola ORDER BY che accetta una funzione CASUALE fornita da una funzione specifica del database.

Questo è un trucco molto utile, soprattutto quando si desidera mescolare un determinato set di risultati.

Nota che l’ordinamento di un set di risultati di grandi dimensioni utilizzando una funzione CASUALE potrebbe risultare molto lento, quindi assicurati di farlo su set di risultati piccoli.

Se devi mescolare un set di risultati di grandi dimensioni e limitarlo in seguito, allora è meglio usare qualcosa come Oracle SAMPLE(N)o TABLESAMPLE in SQL Server o PostgreSQL invece di una funzione casuale nella clausola ORDER BY.

Tabella del database

Supponiamo che stiamo sviluppando un’applicazione desktop del lettore musicale e abbiamo la seguente tabella song nel nostro database.

La tabella del database dei brani

La tabella del database dei brani

La tabellasong viene compilata come segue:

id artist title
1 Miyagi & Эндшпиль ft. Рем Дигга I Got Love
2 HAIM Don’t Save Me (Cyril Hahn Remix)
3 2Pac ft. DMX Aumento Di Un Campione (GalilHD Remix)
4 Ed Sheeran & Passeggero No Diggity (Kygo Remix)
5 JP Cooper ft. Mali-Koa All This Love

Usando una funzione CASUALE nell’ORDINE SQL PER clausola

Vogliamo mescolare l’elenco dei brani in modo che ogni nuova playlist sia diversa da quella generata in precedenza. Ogni volta che abbiamo bisogno di ordinare un determinato set di risultati di query SQL, dobbiamo usare la clausola ORDER BY.

Tuttavia, per randomizzare le righe restituite, abbiamo bisogno della clausola ORDER BY per utilizzare una funzione o un oggetto database che restituisca un valore casuale per ogni riga contenuta nel set di risultati SQL.

Come già accennato, l’utilizzo di una funzione specifica del database che restituisce valori casuali è adatto solo per piccoli set di risultati, altrimenti le prestazioni della query SQL saranno influenzate. Fortunatamente ,nel nostro caso, la tabellasong rappresenta la playlist corrente di un’applicazione desktop, quindi la dimensione del set di risultati è ragionevole.

Oracle

Su Oracle, è necessario utilizzare la funzioneDBMS_RANDOM.VALUE, come illustrato nel seguente esempio:

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

Quando si esegue la query SQL sopra su Oracle, si ottiene il seguente set di risultati:

canzone

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

Ed Sheeran & Passeggero – No Diggity (Kygo Remix)

Miyagi & Эндшпиль ft. – Ho avuto amore

JP Cooper ft. Mali-Koa-Tutto questo amore

2Pac ft. DMX-Rise Of A Champion (GalilHD Remix)

Si noti che le canzoni vengono elencate in ordine casuale, grazie alla chiamata di funzioneDBMS_RANDOM.VALUE utilizzata dalla clausola ORDER BY.

La funzioneVALUEnel pacchettoDBMS_RANDOM restituisce un valore numerico nell’intervallo [0, 1) con una precisione di 38 cifre frazionarie.

SQL Server

In SQL Server, è necessario utilizzare il tag NEWID funzione, come illustrato dal seguente esempio:

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

Quando si esegue la query SQL al di sopra di SQL Server, il seguente set di risultati, si ottiene:

canzone

Miyagi & Эндшпиль ft. In questo modo si può ottenere un buon risultato. In questo modo si può ottenere il massimo della qualità e della qualità del prodotto. Mali-Koa-All This Love

Si noti che le canzoni vengono elencate in ordine casuale, grazie alla chiamata di funzione NEWID() utilizzata dalla clausola ORDER BY.

La funzioneNEWIDrestituisce un tipo di datiuniqueidentifier che rappresenta un GUID a 16 byte. Quindi, ogni nuovo valore restituito dalla funzioneNEWID sarà praticamente unico.

PostgreSQL

Su PostgreSQL, è necessario utilizzare il tag random funzione, come illustrato dal seguente esempio:

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

Quando si esegue la query SQL di sopra su PostgreSQL, il seguente set di risultati, si ottiene:

canzone

JP Cooper ft. Mali-Koa-Tutto questo amore

2Pac ft. DMX – Aumento Di Un Campione (GalilHD Remix)

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

Ed Sheeran & Passeggero – No Diggity (Kygo Remix)

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

Si noti che le canzoni vengono elencate in ordine casuale, grazie alla chiamata di funzione random() utilizzata dalla clausola ORDER BY.

La funzionerandomrestituisce un valore numerico nell’intervallo [0, 1) del tipodouble precision.

MySQL

Su MySQL, è necessario utilizzare il tag RAND funzione, come illustrato dal seguente esempio:

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

Quando si esegue la query SQL di sopra su MySQL, il seguente set di risultati, si ottiene:

canzone

2Pac ft. DMX-Ascesa di un campione (GalilHD Remix)

JP Cooper ft. Mali-Koa-Tutto questo Amore

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

Ed Sheeran & Passeggero – No Diggity (Kygo Remix)

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

si Noti che le canzoni sono elencati in ordine casuale, grazie per il RAND() chiamata di funzione utilizzata con la clausola ORDER by.

La funzioneRAND restituisce un valore numerico nell’intervallo [0, 1) di un tipo a virgola mobile.

JPA e Hibernate

Quando si utilizza JPA e Hibernate entità query, è possibile passare solo la funzione random per la clausola ORDER BY, come illustrato dal seguente JPQL query:

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

Il JPQL query di cui sopra funziona bene per PostgreSQL, SQL Server, e MySQL dato che il random()NEWID() o RAND() funzioni sarà passato da Hibernate per SQL ORDINE.

Per Oracle, poiché la casualità è data dalDBMS_RANDOM.VALUE generatore di numeri, dovrai fare riferimento a esso come una funzione SQL (ad esempio, DBMS_RANDOM.VALUE()):

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

Questo è tutto!

Workshop online

Se ti è piaciuto questo articolo, scommetto che amerai il mio prossimo workshop online di 4 giorni!

  • ad Alte Prestazioni Java Persistence Online Laboratorio (4 ore x 4 giorni) tra il 19 e il 22 aprile

Conclusione

Randomizzazione SQL set di risultati della query è un requisito comune, quindi è utile sapere che tipo funzione SQL è possibile utilizzare la clausola ORDER BY a seconda del database relazionale sottostante tipo.

Transactions and Concurrency Control eBook

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.