SQL Serverの計算列での奇妙な動作


12

私の70-433試験の本を読んでいる間、私は機能していないと思われる何かを考えましたが、それでも機能すると信じています。パッセージは次のようなものを読みました:

また、列はPERSISTEDとしてマークする必要があります。つまり、SQL Serverは、クエリで参照されるたびに計算するのではなく、計算列の式の結果をデータ行に物理的に格納します。

これから、2つのことを理解できます。

  1. 非持続計算列は、それがクエリで参照されるたびに計算されます
  2. 計算列には何も格納されないため、列にはインデックスを作成できないと想定しています。

読んだ後、以前のプロジェクトで非永続列にインデックスを作成できたので、これは少し奇妙だと思いました。

永続化されていないもののインデックスを作成するにはどうすればよいですか?これは長期的に有害です?


これを証明するために、次のSQLステートメントを実行しました。

CREATE TABLE testTable
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    telephone VARCHAR(14),
    c_areaCode AS (SUBSTRING(telephone,0,5)),
    cp_areaCode AS (SUBSTRING(telephone,0,5)) PERSISTED
)

INSERT INTO testTable VALUES('09823 000000');
INSERT INTO testTable VALUES('09824 000000');
INSERT INTO testTable VALUES('09825 000000');

CREATE NONCLUSTERED INDEX IX_NotPersisted ON testTable(c_areaCode);
CREATE NONCLUSTERED INDEX IX_Persisted ON testTable(cp_areaCode);

そして、次のクエリを実行します。

DBCC FREEPROCCACHE
DBCC FREESYSTEMCACHE('ALL');
DBCC DROPCLEANBUFFERS
GO
SELECT cp_areaCode FROM testTable;
GO
SELECT c_areaCode FROM testTable;

上記のコードのクエリプランを見てみると、両方の選択クエリが非永続インデックスを使用していることがわかります。繰り返しますが、どのように?

ここに画像の説明を入力してください


70から433本を持っているものについては、引用されたテキストは、111ページの最上部にある
スチュアート・ブラックラー

回答:


9

2.計算列には何も格納されていないため、列にはインデックスを作成できないと想定しています。

この仮定は真実ではありません。どちらの種類にもインデックスを付けることができます。どちらの場合も計算列は決定的である必要がありますが、計算列が永続化されると、計算も正確であるという要件が緩和されます(つまり、浮動小数点演算を含むことができます)。

永続化されていないもののインデックスを作成するにはどうすればよいですか?これは長期的に有害です?

どちらの場合でも、関数の結果はインデックスに「保持」れます-唯一の違いは、テーブルに保持されるかどうかです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.