Maybaygiare.org

Blog Network

Vlad Mihalcea

Last modified:

Představte si, že nástroj, který může automaticky detekovat JPA a Hibernate problémy s výkonem. Hypersistence Optimizer je ten nástroj!

Úvod

V tomto článku se budeme vidět, jak můžeme třídit SQL dotazu sada výsledků pomocí ORDER BY klauzule, že se NÁHODNÝ funkce poskytované databáze-specifické funkce.

Jedná se o velmi šikovný trik, zvláště když chcete zamíchat danou sadu výsledků.

všimněte si, že třídění velké sady výsledků pomocí náhodné funkce se může ukázat jako velmi pomalé, takže se ujistěte, že to děláte na malých sadách výsledků.

Pokud máte shuffle velký výsledek nastavit a omezit to potom, pak je lepší použít něco jako Oracle SAMPLE(N) nebo TABLESAMPLE v SQL Server nebo PostgreSQL namísto náhodné funkce v klauzuli ORDER BY.

tabulky Databáze

předpokládejme, že pracujeme na hudební přehrávač desktopové aplikace, a jsme následující song tabulky v databázi.

píseň databázové tabulky

píseň databázové tabulky

song tabulka se vyplní takto:

id artist title
1 Miyagi & Эндшпиль ft. Рем Дигга I Got Love
2 HAIM Don’t Save Me (Cyril Hahn Remix)
3 2Pac ft. DMX Rise Of Champion (GalilHD Remix)
4 Ed Sheeran & Osobní no Diggity (jasmine thompson Remix)
5 JP Cooper ft. Mali-Koa Tohle Všechno je Láska.

Pomocí NÁHODNÉ funkce v SQL ORDER BY klauzule

chcete zamíchat seznam skladeb tak, že každý nový playlist je jiný než dříve vytvořené. Kdykoli potřebujeme třídit danou sadu výsledků dotazu SQL, musíme použít klauzuli ORDER BY.

Nicméně, aby se náhodně vrátil řádky, musíme klauzuli ORDER BY použít funkci nebo databázový objekt, který vrací náhodné hodnoty pro každý řádek obsažené v SQL sadu výsledků.

Jak již bylo zmíněno, použití databáze-specifické funkce, která vrací náhodné hodnoty je vhodné pro malé sady výsledků pouze, jak jinak, dotaz SQL výkon bude ovlivněn. Naštěstí v našem případě tabulka song představuje aktuální seznam skladeb desktopové aplikace, proto je velikost sady výsledků přiměřená.

Oracle

Na Oracle, musíte použít DBMS_RANDOM.VALUE funkce, jak je znázorněno v následujícím příkladu:

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

Při provádění SQL dotazu výše na Oracle, následující výsledek sada je získat:

písnička

HAIM – ne, Zachraň Mě (Cyril Hahn Remix)

Ed Sheeran & Passenger – no Diggity (jasmine thompson Remix)

Mijagi & Эндшпиль ft. Рем дигга-mám lásku p –

JP Cooper ft. Mali-Koa-All This Love

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

Všimněte si, že písně jsou uvedeny v náhodném pořadí, díky DBMS_RANDOM.VALUE volání funkce používá klauzuli ORDER BY.

VALUE funkce DBMS_RANDOM balíček vrátí číselnou hodnotu v [0, 1) interval s přesností na 38 zlomkové číslice.

SQL Server

Na serveru SQL Server, musíte použít NEWID funkce, jak je znázorněno v následujícím příkladu:

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

Při provádění SQL dotazu výše na serveru SQL Server, následující výsledek sada je získat:

písnička

Mijagi & Эндшпиль ft. Рем дигга-mám lásku p –

Haim-nezachraň mě (Cyril Hahn Remix)

2pac ft. DMX – Rise Of Champion (GalilHD Remix)

Ed Sheeran & Passenger – no Diggity (jasmine thompson Remix)

JP Cooper ft. Mali-Koa – To Vše je Láska.

Všimněte si, že písně jsou uvedeny v náhodném pořadí, díky NEWID() volání funkce používá klauzuli ORDER BY.

NEWID vrací uniqueidentifier datový typ představující 16 bajtů GUID. Proto každá nová hodnota vrácená funkcí NEWID bude prakticky jedinečná.

PostgreSQL

PostgreSQL, budete muset použít random funkce, jak je znázorněno v následujícím příkladu:

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

Při provádění SQL dotazu výše na PostgreSQL, následující výsledek sada je získat:

písnička

JP Cooper ft. Mali-Koa-All This Love

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

HAIM – ne, Zachraň Mě (Cyril Hahn Remix)

Ed Sheeran & Passenger – no Diggity (jasmine thompson Remix)

Mijagi & Эндшпиль ft. Notice – I Got Love

všimněte si, že písně jsou uvedeny v náhodném pořadí, a to díky random() volání funkce používané podle klauzule order by.

random funkce vrátí číselnou hodnotu v [0, 1) interval double precision typu.

MySQL

Na MySQL, musíte použít RAND funkce, jak je znázorněno v následujícím příkladu:

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

Při provádění SQL dotazu výše na MySQL, následující výsledek sada je získat:

písnička

2Pac ft. DMX-Rise of a Champion (GalilHD Remix)

JP Cooper ft. Mali-Koa-All This Love

Miyagi & Ft Ft. Рем Дигга – mám Lásku,

Ed Sheeran & Passenger – no Diggity (jasmine thompson Remix)

HAIM – ne, Zachraň Mě (Cyril Hahn Remix)

Všimněte si, že písně jsou uvedeny v náhodném pořadí, díky RAND() volání funkce používá klauzuli ORDER BY.

funkce RAND vrací číselnou hodnotu v intervalu [0, 1) typu s plovoucí desetinnou čárkou.

JPA a Hibernate

Při použití JPA a Hibernate entity dotazy, můžete se jen projít náhodné funkce pro klauzuli ORDER BY, jak ilustruje následující JPQL dotazu:

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

JPQL dotazu výše bude fungovat v pohodě pro PostgreSQL, SQL Server, a MySQL, protože random()NEWID() nebo RAND() funkce bude předán do režimu Spánku, jako je SQL ORDER BY.

Pro Oracle, protože náhodnost je dána DBMS_RANDOM.VALUE number generator, budete muset něj odkazovat jako SQL funkci (např. DBMS_RANDOM.VALUE()):

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

a je to!

online workshopy

Pokud se vám tento článek líbil, vsadím se, že se vám bude líbit můj nadcházející 4denní online Workshop!

  • Vysoký Výkon Java Persistence on-Line Workshop (4 hodiny x 4 dny) mezi 19. a 22. dubna

Závěr

Randomizing SQL dotazu sada výsledků je společný požadavek, takže, to je užitečné vědět, co SQL funkci můžete použít v klauzuli ORDER BY v závislosti na základní relační typ databáze.

Transactions and Concurrency Control eBook

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.