如果视图仅仅是一段SQL语句(不是实际存在的物理数据),那么实际通过视图查询的时候,得到该视图的查询语句执行的时间开销依然是需要的吧?所以有些通过视图得到的查询是否还是直接通过表查询来的速度快呢?

解决方案 »

  1.   

    索引视图与非索引视图http://msdn.microsoft.com/zh-cn/library/ms190237%28SQL.90%29.aspx
      

  2.   

    意思就是实际利用视图进行查询的时候,该视图依然需要通过SQL语句即时查询得到了,对吗?
      

  3.   

    --视图
    --视图是命名的虚拟表,它由查询来定义,可以当做表使用.与持久层不同的是,视图中的数据没有物理表现形式,除非你为其创建索引.
    --当你在一个未创建索引的视图执行查询时,SQL server实际访问的是基础表.--建立视图必须满足3个条件
    --1.不能再查询中使用order by,除非定义中包含TOP或FOR xml.   
    --但在视图外部可以使用ORDER BY
      SELECT * FROM dbo.VIEWS ORDER BY VID
    --2.所有的结果列必须有名称,而且名称必须是唯一的.
    --3.所有结果列的名称必须是唯一的.--***在视图,内联函数,派生表或子查询定义中使用ORDER BY子句时,子句只确定用于TOP()返回的行.ORDER BY 不保证在查询这些构造时
    --***返回有序的结果集,除非在查询本身也指定了ORDER BY.--刷新视图
    EXEC sp_refreshview 'VGrop'  --VGrop视图名称
    IF OBJECT_ID('Sales') IS NOT NULL DROP TABLE Sales
    GO
    CREATE TABLE Sales
    (
        MNTH DATETIME NOT NULL PRIMARY KEY,
        QTY INT NOT NULL
    )
    INSERT INTO Sales
    SELECT '20041201',100 UNION ALL
    SELECT '20050101',110 UNION ALL
    SELECT '20050201',120 UNION ALL
    SELECT '20050301',130 UNION ALL
    SELECT '20050401',140 UNION ALL
    SELECT '20050501',150 UNION ALL
    SELECT '20050601',150 UNION ALL
    SELECT '20050701',140 UNION ALL
    SELECT '20050801',140 UNION ALL
    SELECT '20050901',130 UNION ALL
    SELECT '20051001',120 UNION ALL
    SELECT '20051101',170 UNION ALL
    SELECT '20051201',180UNION ALL
    SELECT '20060101',180 UNION ALL
    SELECT '20060201',160 UNION ALL
    SELECT '20060301',150 
    --返回销售趋势连续相同的月份(相对于上个月而讲)
    --计算趋势
    IF OBJECT_ID('VSgn') IS NOT NULL DROP view VSgn
    GO
    CREATE VIEW VSgn
    AS
    select s1.*
    ,SIGN(s1.QTY-s2.QTY) AS SGN   --sign()大于0结果为1,小于0结果为-1,等于0,结果为0。
    from Sales s1 left join Sales s2 on DATEDIFF(MM,s2.MNTH,s1.MNTH)=1
    GO--创建分组因子
    IF OBJECT_ID('VGrop') IS NOT NULL DROP view VGrop
    GO
    CREATE VIEW VGrop
    AS
    select s1.*,MIN(s2.MNTH) as grp
    from VSgn s1 left join VSgn s2 on s1.SGN<>s2.SGN and s1.MNTH<s2.MNTH group by s1.MNTH,s1.qty,s1.sgn
    GO
    select MIN(mnth) as s
    ,MAX(dateadd(m,-1,grp)) as e
    ,case when sgn=1 then 'up'
          when sgn=0 then 'same'
          when sgn=-1 then 'down'
          end
    from VGrop group by sgn,grp order by s--更新视图
    --修改视图,实际上是修改基础表.--更新视图应注意的事项:
    --1.只要视图有一列不能隐式获取值,就不能向视图中插入数据.如果列允许NULL,有默认值,设置了IDENTITY属性,则说明可以隐式获取值
    --2.如果视图由一个连接查询定义,update和insert语句只能影响连接查询的一端.insert语句必须定义目标列表,这些列只属于联接的一端
    --  update语句修改的列也必须属于连接的一端.不能从由联接查询定义的视图中删除数据.
    --3.不能修改作为计算结果的列
    --4.如果创建视图时指定WITH CHECK OPTION选项,与视图的查询筛选器有冲突的insert和update将被拒绝.
    --视图的选项
    --1.enctyption  对创建视图的文本进行加密 
    --  查看创建视图的文本
        exec sp_helptext 'dbo.vsgn'   --vsgn视图名
    --2.schemabiding 不允许修改基对象或修改被引用的列.
    --3.check option 视图会防止与视图视图筛选器有冲突的INSERT 或UPDATE语句.
    --4.view_metadata--索引视图
    --创建索引视图
    --1.必须在视图上创建一个唯一聚集索引.只有创建了唯一聚集索引才可以创建其他非聚集索引.
    --2.创建索引视图,必须用SCHEMABINDING选项来创建.
    --3.如果索引视图中对数据进行聚合,必须包含count_big()聚合函数.
    USE Northwind
    CREATE VIEW DBO.VcustsWithOrders WITH SCHEMABINDING 
    AS

        SELECT O.EmployeeID
        ,SUM(OD.Quantity) AS TotalQty
        ,COUNT_BIG(*) AS CNT 
        FROM DBO.Orders O JOIN DBO.[Order Details] OD ON O.OrderID=OD.OrderID 
        GROUP BY O.EmployeeID
    )
    GO
    CREATE UNIQUE CLUSTERED INDEX IDX_UQ_CLS_EmployeeID ON VcustsWithOrders(EmployeeID)
    GO
    索引还是会提高查询速度的