2012-01-10 8 views
3

私は、同じ結果をもたらすマイクロソフトのアクセスで次の2つのクエリを実行していますが、最初のクエリは約10分かかりますが、2番目のクエリは約5秒で実行されます。私はここで完全に失われている。最初のクエリは別の整数フィールドの整数フィールドを結合し、2番目のクエリはcint(text)フィールドを整数フィールドに結合し、より高速に実行されます。 10分でなぜintフィールドのjoin Cint(charフィールド)がintよりもintに高速ですか?

実行します:

私はtblA.number =整数フィールドに5秒で

SELECT A, B, sum(d) as C 
FROM tblA 
INNER JOIN (tblB INNER JOIN tblC ON tblB.A = tblC.A) 
    ON tblA.number = tbl B.B) 
GROUP BY A, B 
HAVING F like '*808*' 

ランを設定します - これは正常な状況ではないcint(tblA.A)

I set tblA.number = text field 
SELECT A, B, sum(d) as C 
FROM tblA 
INNER JOIN (tblB INNER JOIN tblC ON tblB.A = tblC.A) 
    ON cint(tblA.number) = tbl B.B) 
GROUP BY A, B 
HAVING F like '*808*' 
+0

テストを繰り返しても、同様の結果が得られますか(1回限りの最適化コストはありません)? 'tblB'の定義は何ですか? –

+0

最初のクエリであなたのtblA.numberが数字であることは確かですか? – wickedone

+0

「HAVING A like」* 808 * '':この欄の列Aは、数字からテキストに変更するのと同じフィールドですか? – mwolfe02

答えて

0

に気づきます。 ..テキストフィールドのみのインデックスがない限り。

+0

どちらのインデックスもありませんでした。しかし、私は整数フィールドのインデックスを作成し、それはテキストフィールドと同じくらい速く実行されます。しかしインデックスがないと、私はなぜシントが速いのか分かりません。 – kdonah3

0

心に来ていくつかの可能性:

  • 多分2番目のクエリでは、テキストフィールドまたは式が異なると戦略に参加し、より適切なを選択するクエリオプティマイザの原因となります。
  • 問合せオプティマイザは、2番目のケースではすべての数値が非常に小さいことを検出して、intより小さいデータ型を使用してより高速な読み込みを行うことができるかもしれません。
  • テキストフィールドがあると、ページ内でデータの配置が異なるため、読み込みとキャッシュのパフォーマンスが向上します。
  • は多分1つのテスト残念ながら

の間に非常に否定的な方法であなたのテストマシンに影響を与え、いくつかのバックグラウンド活性があった、クエリの計画と最適化における多くの要因があります。時には、なぜ物事が起こるのかを理解することはできません。

1

あなたはtblA.numberがcharデータ型であると言っていますか?

文字列を数値に変換してからtblB.B列の数値と比較するので、cint()を使用する方が高速になると思います。

文字を比較する文字列を比較すると、2つの数字の比較に近いものが実行されることに驚くことはありません。

最初の例では、データ型が一致しないため、最初のtblA.numberは文字列であるため、tblB.B列をその比較用の文字列に変換する可能性があります。

数字を文字列に変換するのが遅くなる可能性があります(文字列スペースに多くのメモリを割り当てる必要があります。文字列を投げるときにガベージコレクションの問題があります)。文字列を作成するだけでなく、文字列の比較を行うことが遅くなります。

cint()を使用すると、文字列を数値に変換(キャスト)した後、数値比較(文字列比較よりも確かに高速です)を行っています。

私は上記の理由は確かではありませんが、確かに驚くことはありません。前述のように、ShowPlanを使用すると、ここでいくつかの情報が得られる可能性があります。

+0

アクセスにshowplanはありませんが、あなたの答えは正しいと思われます。 2つのタイプのフィールドを比較して変換を説明すると、そうでない場合には使用できないインデックスを使用できるように操作の順序が変更される可能性があります。 – Ben

関連する問題