SQL Server中计算列的奇怪行为


12

在阅读我的70-433考试书的同时,我想到了一些我看不到的东西,但我相信它会起作用。该段内容如下:

该列还必须标记为PERSISTED,这意味着SQL Server会将计算列的表达式的结果物理存储在数据行中,而不是每次在查询中引用它时都对其进行计算。

由此我了解两件事:

  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页的顶部
斯图尔特·布莱克勒

Answers:


9

2.由于没有为计算列存储任何内容,因此我假设无法为该列创建索引。

这个假设是不正确的- 两种都可以索引。无论哪种情况,计算列都必须是确定性的,但是当持久保留计算列时,放宽了对计算也要精确的要求(即,它可能涉及浮点运算)。

如何为不持久的事物创建索引,从长远来看这是否有害?

无论哪种情况,函数的结果都“ 保留” 在索引中-唯一的区别是表中是否保留了该函数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.