zoukankan      html  css  js  c++  java
  • sql 试图索引

     
    
    视图是对数据(一种元数据类型)的一种描述。当创建了一个典型视图时,通过封装一个 SELECT 语句(定义一个结果集来表示为虚拟表)来定义元数据。当在另一个查询的 FROM 子句中引用视图时,将从系统目录检索该元数据,并替代该视图的引用扩展元数据。视图扩展之后,SQL Server 查询优化器会为执行查询编译一个执行计划。查询优化器会搜索针对某个查询的一组可能的执行计划,并根据对执行每个查询计划所需的实际时间的估计,选择所能找到的成本最低的计划。
    
    通过在数据库视图上创建一个唯一的聚簇索引来在磁盘上实物化。在唯一聚簇索引创建之后,该视图的结果集立即被实物化并保存在数据库的物理存储中,从而查询执行期间节约了执行大开销操作的开销。在视图被实物化后,就可以在该索引视图上创建多个非聚簇索引了。
    
    
    ------------限制太多,没有索引来的快。以至于现实中我很少使用。太费劲。当然有它存在的好处(比如出系统报告数据时,索引视图可以将预先计算物化到磁盘上)。这里只是将我的理解简单总结如下。
    
    对于非索引视图,解析查询所必需的视图部分会在运行时被具体化。任何计算(比如:联接或聚合)都在每个引用视图的查询执行时完成1。在视图上创建了唯一的聚集索引后,该视图的结果集随即被具体化,并保存在数据库的物理存储中,从而在执行时节省了执行这一高成本操作的开销。
    
    索引视图的优点也就是其提高查询性能的方式:
     1、预先计算聚合并将其保存在索引中,从而在查询执行时,最小化高成本的计算。
     2、预先联接各个表并保存最终获得的数据集。
     3、保存联接或聚合的组合。
    
    索引视图
    
     创建索引视图的要求:
     1、ANSI_NULLS 和 QUOTED_IDENTIFIER 选项必须设置为 ON.
     2、视图只能引用基表,不能够引用视图。并且是同一数据库中、所有者也必须相同。
     3、必须使用 SCHEMABINDING 选项创建视图。即架构绑定将视图绑定到基表的架构上。
     4、必须已使用 SCHEMABINDING 选项创建了视图引用的用户定义函数。
     5、创建索引时 ANSI_PADDING、ANSI_NULLS、QUOTED_IDENTIFIER、ANSI_WARNINGS、CONCAT_NULL_YIELDS_NULL 为 ON,
         NUMERIC_ROUNDABORT 选项必须设置为 OFF。这是默认设置。
     6、如果视图定义中的 SELECT 语句指定了一个 GROUP BY 子句,则唯一聚集索引的键只能引用在 GROUP BY 子句中指定  的列。
     7、即使 CREATE INDEX 语句中未引用 text、ntext 或 image 列,视图中也不能包含这些列。
     8、创建聚集索引或非聚集索引时,IGNORE_DUP_KEY 选项必须设置为 OFF(默认设置)。
     9、视图中不能 有 ORDER BY TOP UNIONEXCEPT DISTINCT  CROSS APPLY 或 OUTER APPLY 运算符、排名函数。   COMPUTE 或 COMPUTE BY 子句。
     10、如果指定了 GROUP BY,则视图选择列表必须包含 COUNT_BIG(*) 表达式,且视图定义不能指定 HAVING、ROLLUP、  CUBE 或 GROUPING SETS。
     11、对视图创建的第一个索引必须是唯一聚集索引。创建唯一聚集索引后,可以创建其他非聚集索引。
     12、视图中列数据具有确定性,即不能出现可能为 NULL的情况。还有就是不能用 * 代替列,必须手动 描述查询的列。
    
     13、浮点列不能作为唯一聚簇索引列。
     14、索引视图中部支持 AVG。如果视图中包含 聚合函数 ,则视图的 SELECT 语句中必须默认包含 count_big(*)
    
    
    SQL SERVER2008 联机案例
    
     SET NUMERIC_ROUNDABORT OFF;
     SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
        QUOTED_IDENTIFIER, ANSI_NULLS ON;
        GO
        CREATE VIEW Sales.vOrders
    WITH SCHEMABINDING
    AS
        SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Revenue,
            OrderDate, ProductID, COUNT_BIG(*) AS COUNT
        FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o
        WHERE od.SalesOrderID = o.SalesOrderID
        GROUP BY OrderDate, ProductID;
    GO
    CREATE UNIQUE CLUSTERED INDEX IDX_V1 
        ON Sales.vOrders (OrderDate, ProductID);
    
     
    
  • 相关阅读:
    [POI2013]BAJ-ytecomputer [动态规划]
    【2019.10.15】网课 Za
    【初赛】
    [NOI2014]魔法森林[最短路 spfa]
    【洛谷2019金秋营模拟赛1】
    【luogu1315】 观光公交[贪心]
    【luogu4450】收集邮票 [期望dp]
    [HAOI2012]高速公路 [线段树 期望]
    ALGO-185 Trash Removal
    精度计算——减法
  • 原文地址:https://www.cnblogs.com/hanke123/p/4761951.html
Copyright © 2011-2022 走看看