7

そのため、Visual Studio 2010でクエリを作成していました(つまり、サーバーエクスプローラーを開き、サーバーを右クリックして[新しいクエリ]を選択しました)。クエリには条件が含まれています

A AND B AND C AND D AND E AND F AND (G OR H)

これは連言標準形(CNF)です。クエリ(MSSQL Server 2008に接続されている)を実行すると、テキストが次のように変更されました。

A AND B AND C AND D AND E AND F AND G OR
A AND B AND C AND D AND E AND F AND H

これは選言標準形(DNF)です。

私がオンラインで見つけた小さなことから、DNFはSQLが接続詞を別々に実行し、最後にそれらを結合することを可能にしているようです。

しかし、このようなものでは、非常に多くの条件が繰り返されるため、DNFは実際にCNFよりも優れていますか?そうでない場合、オプティマイザーに条件をそのまま取得させるにはどうすればよいですか?もしそうなら、それはより短くてきれいなので、アプリケーションコードでCNF形式でクエリを書くべきですか、それともオプティマイザーの時間を節約するためにDNF形式で書くべきですか?

4

2 に答える 2

2

この状況でのDNF/CNFの相対的な利点について、またはこの方法でオプティマイザーを強制する方法についてもわかりません。

一般的に言って、オプティマイザーに「知覚された」、「現在の」最適化を、生成される最適化よりも強制的に行わせたくはありません(これには例外がありますが、通常はまれです)。これは主に、他のアクション(インデックスの追加など)の副作用として、「最良の」最適化が時間の経過とともに変化する可能性があるという事実と関係があります。オプティマイザーに特定の最適化を採用するように強制している場合は、新しいもののパフォーマンスが向上する可能性がある場合でも、オプティマイザーをそのパスにロックします。

そのため、読み取りと保守が最も簡単な形式(CNF)でクエリを記述し、必要に応じてオプティマイザーに変更させる必要があります。これが、SQLが宣言型言語であるという点であり、オプティマイザーがいじくり回すことができます。必要に応じて物事。

于 2011-07-25T17:01:45.527 に答える
0

頭のてっぺんから、GまたはHのインデックス付けについて疑問に思います。Gがインデックス付けされていても、Hがインデックス付けされていなかった場合は、論理和の方が理にかなっているかもしれません。

とにかく、パフォーマンスアナライザーを自分で実行して、パフォーマンスの正味の違いを確認できます。

それに加えて、飛び込みたい場合にアクセスできる可能性のあるいくつかの調査があります:調査資料:http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber = 842265&abstractAccess = no&userType = inst

于 2011-07-25T17:18:45.607 に答える