近日做个测试,过程如下,
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.   

    不好意思以上有个BUG, 视图索引的字段与查询字段不一致, 其实是一致的.
      

  2.   

    视图索引的优势不是在查询字段而是在多表关联和条件查询上,你做的这个测试我没做过,你可以用WITH指定使用视图索引,然后用STATISTICS IO看看两个查询的IO对比。系统优化器没用视图索引大概是觉得两者消耗差不多
      

  3.   

    查询vitest表的记录和那个视图索引应该没关系的
      

  4.   

    对查询结果字段的多次函数处理,主要是在耗CPU吧?
    明明是计算好的东西,为何不直接拿来用,而是去聚集索引扫描后,
    读出来再进行函数处理? 奇怪.
      

  5.   

    对查询结果字段的多次函数处理,主要是在耗CPU吧?
    明明是计算好的东西,为何不直接拿来用,而是去聚集索引扫描后,
    读出来再进行函数处理? 奇怪.
      

  6.   

    对查询结果字段的多次函数处理,主要是在耗CPU吧?
    明明是计算好的东西,为何不直接拿来用,而是去聚集索引扫描后,
    读出来再进行函数处理? 奇怪.
      

  7.   

    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/*警告: 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???楼主难道没有警告信息,错误提示很明显--警告: 优化程序无法使用索引
      

  8.   

    试过你的脚步, SQL2008 R2没有这个提示...
      

  9.   

    SQL08应该是去除了警告信息,上面是SQL2K的,索引视图应该对列处理后都会遇到此问题,相当于查询时加了函数处理列,如果楼主确实需要,可以写个过程实现
      

  10.   

    你那视图索引相当于没索引,它当然不能去直接扫你的视图索引,如果你基本有ID和COL2的非聚集索引,也可以索引扫描,而不会聚集索引