ホームページ >データベース >mysql チュートリアル >Oracle でフィルタリングと順序付けを使用して上位 10 レコードを効率的に選択するにはどうすればよいですか?

Oracle でフィルタリングと順序付けを使用して上位 10 レコードを効率的に選択するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-18 15:42:11168ブラウズ

How to Efficiently Select the Top 10 Records in Oracle with Filtering and Ordering?

Oracle トップ 10 レコードの選択: フィルタリング、順序付け、および最適化

Oracle で上位 10 件のレコードを取得するのは通常は簡単ですが、フィルターを追加してパフォーマンスを優先すると課題が生じます。最近の Stack Overflow の質問では、この点が強調されており、特定の条件を満たすレコードを除外しながら、特定の列に基づいて上位 10 件のレコードを選択することに重点が置かれています。

元のクエリとその欠点

最初の SQL クエリは、null 以外のストレージ容量、特定の日付からのレコードの除外、ストレージ容量による降順などのいくつかの基準に基づいて一意のレコードを選択することを目的としていました。 ただし、クエリは結果を上位 10 位に正しく制限できませんでした。

<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 
        APP_ID NOT IN (SELECT APP_ID
                       FROM HISTORY
                        WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') </code>

単に ROWNUM <= 10 をこのクエリに追加しても、正しいトップ 10 は生成されません。ROWNUM は、 句が処理されるORDER BYに割り当てられるためです。

解決策: サブクエリのアプローチ

効果的なソリューションでは、サブクエリを使用してフィルタリングと順序付けを正しく適用しました。

<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>

このネストされた構造により、レコードが最初に並べられ、次に上位 10 件が選択されます。

パフォーマンスの改善

順序の修正以外にも、EXISTS の代わりに NOT IN を使用すると、パフォーマンスが大幅に向上します。 EXISTS 一般に、最適化の機会が向上し、結合が最小限に抑えられ、クエリの実行速度が向上します。

以上がOracle でフィルタリングと順序付けを使用して上位 10 レコードを効率的に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。