Maybaygiare.org

Blog Network

Vlad Mihalcea

Last modified:

JPAとHibernateのパフォーマンスの問題を自動的に検出できるツールがあると想像してください。 超自然オプティマイザは、そのツールです!

はじめに

この記事では、データベース固有の関数によって提供されるランダムな関数を使用するORDER BY句を使用してSQLクエこれは、特に指定された結果セットをシャッフルする場合に、非常に便利なトリックです。

これは非常に便利なトリックです。

ランダム関数を使用して大きな結果セットをソートすると非常に遅くなる可能性があることに注意してください。大きな結果セットをシャッフルして後で制限する必要がある場合は、ORDER BY句のランダム関数の代わりに、Sql ServerまたはPostgreSQLのOracleSAMPLE(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>

VALUEDBMS_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を表すuniqueidentifierNEWID関数によって返される新しい値は、事実上一意になります。

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>

randomdouble 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句で指定します。

Transactions and Concurrency Control eBook

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

コメントを残す

メールアドレスが公開されることはありません。