3

私はMSSQLServerを使用しています。

データベーススキーマを定義するとき、たとえば次のように多くのフィールドを含む(マテリアライズド化されていない)ビューを定義します(「トピック」はテーブルの名前であり、ビューはトピックテーブルの自己結合です)。 :

CREATE VIEW View_Topic_Ancestor AS
SELECT
    Subordinate.Id AS Subordinate_Id,
    Subordinate.Folder_Id AS Subordinate_Folder_Id,
    Subordinate.topicTitle AS Subordinate_topicTitle,
    Subordinate.topicXhtml AS Subordinate_topicXhtml,
    Subordinate.crossLinked AS Subordinate_crossLinked,
    Superior.Id AS Superior_Id,
    Superior.topicTitle AS Superior_topicTitle,
    Superior.topicXhtml AS Superior_topicXhtml,
    Superior.crossLinked AS Superior_crossLinked
FROM Topic AS Subordinate LEFT OUTER JOIN Topic AS Superior
ON Superior.Folder_Id = Subordinate.Folder_Id
AND 
Superior.LeftValue = (SELECT MAX(Ancestor.LeftValue)
    FROM Topic AS Ancestor
    WHERE Subordinate.LeftValue > Ancestor.LeftValue
    AND Subordinate.LeftValue < Ancestor.RightValue
    AND Subordinate.Folder_Id = Ancestor.Folder_Id)

後で(実行時に)次のように、selectステートメントでこのビューを使用します。

SELECT
    T.Id AS Shared_Id,
    V.Superior_Id,
    V.Superior_topicTitle,
    V.Subordinate_Id,
    V.Subordinate_Folder_Id,
    V.Subordinate_topicXhtml
FROM Topic AS T, View_Topic_Ancestor AS V
WHERE Folder_Id='e2eb2b68-738d-49ad-9787-a1e655b7973f'
AND T.crossLinked = V.Subordinate_Id

このSELECTステートメントは、ビューにある多くのフィールドを参照しません(選択しません)。たとえば、Subordinate_topicXhtmlフィールドを選択しますが、Superior_topicXhtmlフィールドは選択しません。

私の質問は次のとおりです。

1)ビューで定義されているが、ビューからの実行時選択で参照されていないフィールドは、パフォーマンスに大きな影響を与えますか?Superior_topicXhtmlフィールドに大量のデータが含まれている(非常に長い文字列である)と想定します。

2)これに対する答えを自分で確認するにはどうすればよいですか?テスト(ストップウォッチで経過時間を測定する)が唯一の方法ですか、それとも理論に基づいて答えを得ることができますか?SQLExpressでMicrosoftSQLServer2008用の「MicrosoftServerSQLManagementStudio」を使用しています。このクエリの「推定実行プラン」を取得する方法はわかりますが(解釈方法は学習していません)、これは、データが参照されていないフィールドから取得されているかどうかではなく、発生しているインデックスとループのみを示しています。

4

2 に答える 2

4

クエリオプティマイザは、ビューを定義するSQLと、ビューから「選択」するために作成したSQLを組み合わせて、クエリプランを作成します。この結合された最適化されたSQLで、特定の属性(列)が必要ない場合、それは使用されません。具体的には、最終選択でそれが必要ない場合、それはネットワーク経由で送信されません。また、Where句、Order Byなど、最適化されたSQL内で必要とされておらず、必要なすべての属性がたまたまインデックスに含まれている場合、そのクエリはインデックスのみを読み取ることができ、テーブルはまったく...インデックスに存在しない列を参照していると思っていても...クエリのクエリ実行プランを見ると、これを確認できます。

于 2008-12-29T20:07:36.180 に答える
0

クエリの実行計画が Management Studio に表示されている場合、マウスを使用して実行計画のノードにカーソルを合わせることができます。

ホバーすると、大きなツールチップが表示されます。これには、そのノードによって取得されたフィールドの「出力リスト」と、それらのフィールドのインスタンスが読み取られた数を示す「推定行数」フィールドが含まれます。

于 2008-12-29T21:34:04.117 に答える