JPAとHibernateのパフォーマンスの問題を自動的に検出できるツールがあると想像してください。 超自然オプティマイザは、そのツールです!
はじめに
この記事では、データベース固有の関数によって提供されるランダムな関数を使用するORDER BY句を使用してSQLクエこれは、特に指定された結果セットをシャッフルする場合に、非常に便利なトリックです。
これは非常に便利なトリックです。
ランダム関数を使用して大きな結果セットをソートすると非常に遅くなる可能性があることに注意してください。大きな結果セットをシャッフルして後で制限する必要がある場合は、ORDER BY句のランダム関数の代わりに、Sql ServerまたはPostgreSQLのOracle
SAMPLE(N)
データベーステーブル
音楽プレーヤーのデスクトップアプリケーションを開発していると仮定し、データベースに次のsong
テーブルがp>
song
テーブルには次のように入力されます:
id | artist | title |
---|---|---|
1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
2 | HAIM | Don’t Save Me (Cyril Hahn Remix) |
3 | 2Pac ft. DMX | チャンピオンの台頭(GalilHDリミックス) |
4 | エドSheeran&乗客 | いいえDiggity(Kygoリミックス) |
5 | Jp Cooper Ft. Mali-Koa | All This Love |
SQL ORDER BY句でランダム関数を使用して
新しいプレイリストが以前に生成されたプレイリストとは異なるように曲リストをシャッフルしたい。 特定のSQLクエリ結果セットをソートする必要があるときはいつでも、ORDER BY句を使用する必要があります。ただし、返された行をランダム化するには、ORDER BY句を使用して、SQL結果セットに含まれる各行に対してランダムな値を返す関数またはデータベースオブ
すでに述べたように、ランダムな値を返すデータベース固有の関数を使用することは、小さな結果セットにのみ適しています。 幸いなことに、私たちの場合、song
テーブルはデスクトップアプリケーションの現在のプレイリストを表しているため、結果セットのサイズは妥当です。
Oracle
Oracleでは、次の例に示すように、DBMS_RANDOM.VALUE
関数を使用する必要があります。
SELECT artist||' - '||title AS songFROM songORDER BY DBMS_RANDOM.VALUE
Oracleで上記のSQLクエリを実行すると、次の結果セッ:
HAIM–Don’t Save Me(Cyril Hahn Remix)
Ed Sheeran&Passenger–No Diggity(Kygo Remix)
Miyagi&Эндшпиль Ft. Рем дигга-私は愛を得たP–
jp cooper ft. Mari-Koa-All This Love
2pac ft. DMX-Rise Of A Champion(GalilHD Remix)
ORDER BY句で使用されるDBMS_RANDOM.VALUE
関数呼び出しのおかげで、曲がランダムな順序でリストされていることに注意してください。p>
VALUE
DBMS_RANDOM
パッケージの関数は、[0,1)間隔の数値を38桁の小数部の精度で返します。
SQL Server
SQL Serverでは、次の例に示すように、NEWID
関数を使用する必要があります。
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY NEWID()
SQL Serverで上記のSQLクエリを実行すると、次の結果セットが取得されます。
歌詞
歌
歌
歌
歌
歌
歌
2pac ft.歌詞の意味:私は愛を得た
haim–私を保存しないでください(CYRIL Hahn Remix)
2pac ft.歌詞の意味:2pac ft.歌詞の意味:2pac ft.歌詞の意味: DMX-Rise Of A Champion(GalilHD Remix)
Ed Sheeran&Passenger–No Diggity(Kygo Remix)
JP Cooper ft. Mali–Koa-All This Love
ORDER BY句で使用されるNEWID()
関数呼び出しのおかげで、曲がランダムな順序でリストされていることに注意してください。p>
NEWID
関数は、16バイトのGUIDを表すuniqueidentifier
NEWID
関数によって返される新しい値は、事実上一意になります。
PostgreSQL
PostgreSQLでは、次の例に示すように、random
関数を使用する必要があります。
SELECT artist||' - '||title AS songFROM songORDER BY random()
PostgreSQLで上記のSQLクエリを実行すると、次の結果セットが得られます。
jp cooper ft. Mari-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
order by句で使用されるrandom()
関数呼び出しのおかげで、曲がランダムな順序でリストされていることに注意してください。p>
random
double precision
タイプの[0,1)間隔の数値を返します。
MySQL
MySQLでは、次の例に示すように、RAND
関数を使用する必要があります。
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY RAND()
上記のSQLクエリをMySQLで実行すると、次の結果セットが得られます。
2pac ft. DMX-Rise Of A Champion(GalilHD Remix)
JP Cooper ft. Mali-Koa-All This Love
宮城県&Эндшпиль Ft. Рем дигга–I Got Love
ed sheeran&passenger–no diggity(Kygo Remix)
haim–don’t save me(CYRIL Hahn Remix)
曲はランダムな順序でリストされていることに注意してください。RAND()
order byで使用される関数呼び出しのおかげで、曲がランダムな順序でリストされていることに注意してください。節。p>
RAND
関数は、浮動小数点型の[0,1)間隔の数値を返します。
JPAとHibernate
JPAとHibernateエンティティクエリを使用する場合、次のJPQLクエリに示すように、ランダム関数をORDER BY句に渡すことがでrandom()
,NEWID()
RAND()
関数は、hibernateによってsql order byにそのまま渡されます。オラクルの場合、ランダム性はDBMS_RANDOM.VALUE
番号ジェネレータによって与えられるので、それをSQL関数として参照する必要があります(例:DBMS_RANDOM.VALUE()
):
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY DBMS_RANDOM.VALUE()", Song.class).getResultList();
それだけです!p>
オンラインワークショップ
あなたはこの記事を楽しんだ場合、私はあなたが私の今後の4日間のオンラインワークショップを
- High-Performance Java Persistence Online Workshop(4hours x4days)between the19th and22nd of April
結論
SQLクエリ結果セットをランダム化することは一般的な要件であるため、どのSQL関数を使用できるかを知ることは有用である。基になるリレーショナルデータベースの種類に応じてorder by句で指定します。