1

次のクエリがあります。

select distinct type, account 
  from balances_tbl 
 where month = 'DEC-12'

このテーブルbalances_tblには、1 か月あたり 300 万件を超えるレコードがあります。特殊タイプとアカウントの行は、おそらく約 20,000 レコードです。列にmonth索引が付けられます。および列にも索引が付けられますtypeaccountクエリの実行には非常に長い時間がかかります (約 30 分)。

DISTINCT句を使用してこのクエリを高速化する方法はありますか?

4

5 に答える 5

6

3 つの列すべてを含むインデックスを追加する必要があります。(月、タイプ、アカウント)のインデックスをお勧めします。そうすれば、Oracle はインデックスをスキャンするだけで作業を行うことができます。

それ以外の場合は、完全なテーブル スキャンを実行してから、個別の値だけを見つける作業を行う必要があります。

テーブルを月ごとに分割することもお勧めします。ただし、それにはテーブルを再編成する必要があり、より多くの作業が必要になります。

于 2012-12-26T20:07:56.120 に答える
1

まず、DBAに、そのテーブル/インデックスの新しい統計があることを確認します。

次に、30分はそのクエリには長すぎEXPLAIN PLANます。が表示されない場合、Oracleはフルスキャンを実行していると思われるため、テーブルのすべての行にアクセスしています。1か月あたり約300万行あることを考えると、おそらく多くの行になる可能性があります。インデックスが作成されていると言うようmonthに、次のコマンドでインデックスアクセスを強制してみることができますmonth

select /*+ index(b <index_on_month)>*/ distinct type, account 
from balances_tbl b
where month = 'DEC-12'

ここで、は列<index_on_month>のインデックスの名前です。monthこれは日付関連のフィールドであるため、インデックスに優れたクラスタリング係数がある可能性があります。

とにかく、実行計画を見ずに、なぜこれほど時間がかかるのかを判断するのは非常に困難です。

于 2012-12-26T21:27:12.140 に答える
-1

集計関数を追加して、月の列にインデックスがあることを確認してください。サーバーが貧弱なものでない限り、私はこれほど長くはかからないはずです。

試す:

select type, 
       account,
       count(*) as dummy
from   balances_tbl 
where  month = 'DEC-12'
group by type,
       account
于 2012-12-27T11:43:24.043 に答える
-1

月単位のパーティションを作成するか、オラクルの最適化ヒントを使用してデータをより高速に取得できます

これらはあなたのクエリに役立つヒントです

 1) /*+ ALL_ROWS */
 2) /*+ FIRST_ROWS(n) */ 
 3) /*+ parallel */
于 2012-12-27T07:16:24.473 に答える
-2

これが最も簡単な解決策です-インデックス、プラン、およびこれらすべては必要ありません...:

SELECT DISTINCT d.deptno, dname FROM scott.dept D, scott.emp E WHERE D.deptno = E.deptno
/  
-- Same as Distinct --
SELECT deptno, dname FROM scott.dept D WHERE EXISTS ( SELECT 'X' FROM scott.emp E WHERE E.deptno = D.deptno)
/
于 2012-12-27T14:40:15.813 に答える