私の70-433試験の本を読んでいる間、私は機能していないと思われる何かを考えましたが、それでも機能すると信じています。パッセージは次のようなものを読みました:
また、列はPERSISTEDとしてマークする必要があります。つまり、SQL Serverは、クエリで参照されるたびに計算するのではなく、計算列の式の結果をデータ行に物理的に格納します。
これから、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ページの最上部にある
—
スチュアート・ブラックラー