在阅读我的70-433考试书的同时,我想到了一些我看不到的东西,但我相信它会起作用。该段内容如下:
该列还必须标记为PERSISTED,这意味着SQL Server会将计算列的表达式的结果物理存储在数据行中,而不是每次在查询中引用它时都对其进行计算。
由此我了解两件事:
- 阿非持续计算列计算每次它是在查询中引用时间
- 由于没有为计算列存储任何内容,因此我假设无法为该列创建索引。
阅读它之后,我认为这有点奇怪,因为我设法在上一个项目的非持久列上创建了索引。
如何为不持久的事物创建索引,从长远来看这是否有害?
为了证明这一点,我运行了以下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页的顶部
—
斯图尔特·布莱克勒