为什么Sybase ASE在未添加实现计算列时执行表扫描

时间:2012-09-04 16:46:07

标签: database sybase-ase calculated-columns

当我将未实现的计算列添加到表中时,ASE决定复制整个表,而不会影响数据页的实际内容。

示例:

create table t (i int null)
go
set showplan on
go
alter table t
add c compute (i+1) not materialized
go

QUERY PLAN FOR STATEMENT 1 (at line 1).
...
       |   |INSERT Operator (VA = 1)
...
       |   |   |SCAN Operator (VA = 0)
       |   |   |  FROM TABLE
       |   |   |  t
       |   |   |  Table Scan.
...
       |   |  TO TABLE
       |   |  #syb__altab
...

如果您使用dbcc page检查网页内容,您可能会看到新旧网页相同

  1. 为什么ASE会做这个无用的操作?
  2. 是否可以避免它?

1 个答案:

答案 0 :(得分:0)

我认为这样做是因为没有物化的计算机列可能会在每次访问时产生不同的值。因此,为了确保数据完整性并且每个单元格都有应该存在的数据,它首先将其复制到一个位置,然后使用它来执行您要求它执行的功能。