2

中間の具体化についてのこの興味深い記事を読んだ後、私はまだいくつかの質問があります。

私はこのクエリを持っています:

SELECT    *
FROM  ...
WHERE       isnumeric(MyCol)=1  and ( CAST( MyCol AS int)>1) 

ただし、where句の順序は決定論的ではありません

だから私はここで例外を得るかもしれません(彼が最初にキャストしようとした場合"k1k1"

これで問題は解決すると思います

SELECT MyCol 
FROM
    (SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC (MyCol ) > 1 ORDER BY MyCol ) bar
WHERE
    CAST(MyCol AS int) > 100
  • なぜ置くtop 100 + orderとVS私の通常のクエリが変わるのですか?

私はコメントを読んだ:

(「中間」結果-つまり、プロセス中に取得され、最終結果の計算に使用される結果)はTempDBに物理的に保存(「マテリアライズ」)され、そこから残りのユーザーに使用されます。 、ベーステーブルからクエリバックされる代わりに。

  • tempDBに保存されている場合、またはベーステーブルからクエリされている場合、どのような違いがありますか?同じデータです!
4

2 に答える 2

4

オプティマイザーによる再編成によるエラーを回避するためにサポートされている方法は、CASEを使用することです。

SELECT *
FROM YourTable
WHERE
    1 <=
    CASE
        WHEN aa NOT LIKE '%[^0-9]%'
        THEN CONVERT(int, aa)
        ELSE 0
    END;

中間の具体化はサポートされている手法ではないため、リスクが理解され受け入れられている特別な状況で、非常に専門的なユーザーのみが使用する必要があります。

TOP 100 PERCENT通常、SQLServer2005以降のオプティマイザでは無視されます。

于 2012-10-17T15:12:25.097 に答える
1

TOP句を内部クエリに追加することにより、SQL Serverが外部クエリを実行する前に最初にそのクエリを実行するように強制します。これにより、ISNUMERICがfalseを返すすべての行が破棄されます。

TOP句がないと、オプティマイザーはクエリを最初のクエリと同じになるように書き直すことができます。

于 2012-10-17T15:04:27.983 に答える