近日做个测试,过程如下,
1. 建测试表(vitest), 插入100万行记录.2. 建视图, 对其中某varchar字段进行嵌套几次且比较复杂的字符串处理.
create view dbo.v_vitest WITH SCHEMABINDING as
select ID,stuff(replace(substring(col2,2,4)+'_computer','com','conn'),5,3,'tb5') empname
from dbo.vitest3. 建视图索引.
create unique clustered index idx_v_vitest on v_vitest(ID)4.测试update vitest的记录,成本增加了. --> 属正常, 可解释.5.测试查询vitest的记录, 处理方式跟视图处理方式一致, 为何看查询计划是聚集索引扫描,
而不是直接读视图索引就行了呢?? 求解释.
select stuff(replace(substring(empname,2,4)+'_computer','com','conn'),5,3,'tb5') empname
from dbo.vitest
1. 建测试表(vitest), 插入100万行记录.2. 建视图, 对其中某varchar字段进行嵌套几次且比较复杂的字符串处理.
create view dbo.v_vitest WITH SCHEMABINDING as
select ID,stuff(replace(substring(col2,2,4)+'_computer','com','conn'),5,3,'tb5') empname
from dbo.vitest3. 建视图索引.
create unique clustered index idx_v_vitest on v_vitest(ID)4.测试update vitest的记录,成本增加了. --> 属正常, 可解释.5.测试查询vitest的记录, 处理方式跟视图处理方式一致, 为何看查询计划是聚集索引扫描,
而不是直接读视图索引就行了呢?? 求解释.
select stuff(replace(substring(empname,2,4)+'_computer','com','conn'),5,3,'tb5') empname
from dbo.vitest
明明是计算好的东西,为何不直接拿来用,而是去聚集索引扫描后,
读出来再进行函数处理? 奇怪.
明明是计算好的东西,为何不直接拿来用,而是去聚集索引扫描后,
读出来再进行函数处理? 奇怪.
明明是计算好的东西,为何不直接拿来用,而是去聚集索引扫描后,
读出来再进行函数处理? 奇怪.
go
insert tb select 1,'abc' union all select 2,'bbbc'
go
create view dbo.v_tb
WITH SCHEMABINDING
as
select a.id,a.name+'a' as name from dbo.tb a
go
create unique clustered index idx_name on v_tb(name)
go/*警告: create table tb(id int primary key,name varchar(20))
go
insert tb select 1,'abc' union all select 2,'bbbc'
go
create view dbo.v_tb
WITH SCHEMABINDING
as
select a.id,a.name+'a' as name from dbo.tb a
go
create unique clustered index idx_name on v_tb(name)
go/*警告: 优化程序无法使用索引,因为视图的选择列表包含非聚合表达式。http://topic.csdn.net/t/20050105/18/3701846.html???楼主难道没有警告信息,错误提示很明显--警告: 优化程序无法使用索引