Oracle データベースの上位 10 レコードを効率的にフィルタリングする: サブクエリと ROWNUM テクノロジー
この記事は、HISTORY テーブルから STORAGE_GB で並べ替え、特定の条件を満たす行を除外し、最終的に最初の 10 レコードのみを選択するという問題を解決することを目的としています。ソート前に ROWNUM を直接使用して結果を制限すると、問題が発生する可能性があります。
サブクエリを使用した解決策:
解決策は、並べ替え順序を含むすべての基準に基づいて必要なレコードを選択するサブクエリを作成することです。次に、このサブクエリをデータ ソースとして使用し、ROWNUM を使用して最初の 10 行を選択します。
<code class="language-sql">SELECT * FROM ( SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN ( SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009' ) ORDER BY STORAGE_GB DESC ) WHERE ROWNUM <= 10;</code>
最適化には EXISTS を使用します:
大規模なデータセットの場合、Oracle の ROWNUM は効率的ではありません。パフォーマンスを向上させるには、NOT IN の代わりに EXISTS 演算子の使用を検討してください。
<code class="language-sql">SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM HISTORY WHERE APP_ID = APP_ID AND TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009' ) ORDER BY STORAGE_GB DESC FETCH FIRST 10 ROWS ONLY;</code>
(注: LIMIT 10
は Oracle では直接サポートされていません。代わりに FETCH FIRST 10 ROWS ONLY
を使用する必要があります)
上記の方法により、Oracle データベースから条件を満たす上位 10 件のレコードを効率的に絞り込むことができます。 EXISTS
を使用してバージョンを選択すると、特に大規模なデータ セットを処理する場合、クエリの効率が大幅に向上します。
以上がフィルタリングを使用して Oracle の上位 10 レコードを効率的に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。