2

テーブルからを取得しようとしましたがcount(*) 、これには約 700 万件のレコードがあり、結果を返すのに 1 時間以上かかりました。

また、テーブルには 123 列のインデックスが作成された 153 列があるため、次のクエリを並行して実行しようとしましたが、役に立ちませんでした。

select /*+ parallel (5) */ count(123) from <table_name>

別の方法があれば提案してください。

Toad でテーブルを実行descしたとき、インデックス タブには no の値が保持されています。行の。その値がそこでどのように更新されているか考えていますか?

4

3 に答える 3

4

言及すべきいくつかの問題:

  1. "select count(*) from table" でインデックスを使用するには、インデックス付きの列が null 非許容であるか、インデックスがビットマップ型である必要があります。
  2. 列に null がないことがわかっているが、null 制約がない場合は、「column_name が null でないテーブルから count(*) を選択」を使用します。
  3. もちろん、テーブルよりもインデックスをスキャンする方が効率的である必要がありますが、テーブルの列が非常に多いため、おそらく問題ありません。
  4. 並列インデックス スキャンが本当に必要な場合は、並列ではなく、parallel_index ヒントを使用してください。しかし、行数が 700 万行しかないため、並列処理の必要がない場合があります。
  5. 実行計画をチェックして、インデックスや並列クエリが使用されているかどうかを確認する必要があります。
  6. 推定行数を使用できる場合は、sample 句の使用を検討してください。たとえば、「select 1000*count(*) from table sample(0.1)」などです。
于 2013-06-26T16:49:39.173 に答える
0
select /*+ parallel (5) */ 

並列度が奇数のようです。明らかに 5 は奇数で、それは奇妙です。DoP は 2 の累乗倍数である必要があります (詳細については以下を参照してください)。

とにかく、並列クエリを使用する理由はありますか? 少なくとも 5 つの予備のプロセッサがありますか? そうでない場合は、PQ スレーブを管理するオーバーヘッドが少なくともパフォーマンスの低下に寄与している可能性が高くなります。


DOP = n*2 にする必要があるのはなぜですか? 3 つ以上のバッチ ジョブを同時に実行するとパフォーマンスが低下するというキューイング理論に基づく確立されたヒューリスティックがあります。 詳細をご覧ください。 (キューイング理論では実際には 1.8 の数値が推奨されていると思いますが、データベース ジョブは I/O やディスクに拘束されることが多いため、通常は 2 で十分です。)

最初に「2 の累乗」と言いましたが、これは主にマルチコア サーバーが 2 のべき乗の CPU を搭載する傾向があるためですが、2 の倍数の方がより正確です。12 個の CPU を搭載しているボックスやその他の数のボックスがあるためです。

現在、64 コアのボックスを使用している場合、5 または 37 の DOP で問題ありません。これは、多くのスレッドを同時に実行するのに十分な CPU があるためです。しかし、小さなクアッドコア ボックスを使用している場合は、4 つのプロセッサすべてに作業を均等に分散させる唯一の値であるため、2、4、または 8 のみが意味を持ちます。クアッドコア ボックスで 5 つのスレッドを実行すると、1 つの CPU が他の 3 つよりも多くの作業を行うことになります。他の 3 つのスレーブを待たせて、完了するまでに時間がかかる可能性があります。そのDOP=5ため、実際には よりも長い経過時間になる可能性がありDOP=4ます。

DOP=n*2あくまで経験則であり、決まったものではありません。ただし、これは健全な推論に基づくものであり、なぜ異なることを行っているのかを知っておく必要があります。明らかに、適切な DOP を選択したことを確認するために、いくつかの実験を行う必要がありました (どのような値に決めたとしても)。

于 2013-06-26T16:31:07.113 に答える