这样的视图
CREATE  VIEW dbo.rs_user_view
AS
SELECT DISTINCT 
      b.id, a.ysid, a.xm, a.gh, a.csrq, b.ddyy, a.xb, b.msdm, b.msmc, b.dqdm, b.zw, b.zwmc, 
      a.sfzhm, b.type, b.typemc, b.ddtime, a.cbzt, a.cbztmc, a.hf, a.xl, a.jgssj, a.sxzy, 
      a.sfzqfsj, a.sfzdqsj, a.nz, a.hsbz, a.qtbz, a.ycqts,a.dx
FROM (SELECT ysid AS ysid, sfzqfsj, sfzdqsj, xm, xb, gh, hf, xl, sfzhm, jgssj, sxzy, csrq, 
              cbzt, nz, hsbz, qtbz, ycqts,dx,
                  (SELECT mc
                 FROM rs_sz
                 WHERE rs_sz.dm = cbzt) AS cbztmc
        FROM rs_yszl) a INNER JOIN
          (SELECT ysid AS kk, ddyy, c.msdm, c.dqdm, zw, c.id, type,
                   (SELECT mc
                  FROM rs_sz
                  WHERE rs_sz.dm = type) AS typemc, msmc,
                   (SELECT mc
                  FROM rs_sz
                  WHERE rs_sz.dm = zw) AS zwmc, ddtime
         FROM rs_ddb c, rs_bm d
         WHERE c.msdm = d .msdm AND ddtime =
                   (SELECT MAX(ddtime)
                  FROM rs_ddb
                  WHERE ysid = c.ysid)) b ON a.ysid = b.kk这个视图经常被用来查询,使用这个视图的时候,服务器内存占用很大,有时会不能查询。
有没办法优化下?
我是想建立索引视图,但不知道如何建立?请教大家了。

解决方案 »

  1.   

    在对视图创建聚集索引之前,该视图必须符合下列要求: 当执行 CREATE VIEW 语句时,ANSI_NULLS 和 QUOTED_IDENTIFIER 选项必须设置为 ON。OBJECTPROPERTY 函数通过 ExecIsAnsiNullsOn 或 ExecIsQuotedIdentOn 属性为视图报告此信息。
    要执行所有 CREATE TABLE 语句以创建视图引用的表,ANSI_NULLS 选项必须设置为 ON。
    视图不能引用任何其他视图,只能引用基表。
    视图引用的所有基表必须与视图位于同一数据库中,并且所有者也与视图相同。
    必须使用 SCHEMABINDING 选项创建视图。架构绑定将视图绑定到基础基表的架构。
    必须已使用 SCHEMABINDING 选项创建了视图引用的用户定义函数。
    表和用户定义函数必须由视图中由两部分组成的名称引用。不允许由一部分、三部分和四部分组成的名称引用它们。
    视图中的表达式引用的所有函数必须是确定的。OBJECTPROPERTY 函数的 IsDeterministic 属性报告用户定义函数是否是确定的。有关详细信息,请参阅确定性函数和不确定性函数。注意:  
    引用 SQL Server 2005 中的索引视图中的 datetime 和 smalldatetime 字符串文字时,建议使用确定的日期格式样式将文字显式转换为所需日期类型。有关确定的日期格式样式列表,请参阅 CAST 和 CONVERT (Transact-SQL)。将字符串隐式转换为 datetime 或 smalldatetime 所涉及的表达式被视为是不确定的,除非兼容级别设置为 80 或更低。这是因为结果取决于服务器会话的 LANGUAGE 和 DATEFORMAT 设置。例如,表达式 CONVERT (datetime, '30 listopad 1996', 113) 的结果取决于 LANGUAGE 设置,因为字符串 listopad 在不同语言中表示不同的月份。同样,在 DATEADD(mm,3,'2000-12-01') 表达式中,SQL Server 基于 DATEFORMAT 设置解释 '2000-12-01' 字符串。
     非 Unicode 字符数据在排序规则间的隐式转换也被视为是不确定的,除非兼容级别设置为 80 或更低。 在 90 兼容模式下,不允许对包含这些表达式的视图创建索引。但是,包含已升级数据库中的这些表达式的现有视图是可维护的。如果使用索引视图(其中包含从字符串到日期的隐式转换),请确保 LANGUAGE 和 DATEFORMAT 的设置在数据库和应用程序中保持一致,以避免可能的索引视图损坏。
    如果视图定义使用聚合函数,SELECT 列表还必须包括 COUNT_BIG (*)。
    用户定义函数的数据访问属性必须为 NO SQL,外部访问属性必须是 NO。
    公共语言运行时 (CLR) 函数只能显示在视图的 SELECT 列表中,并且只能引用不属于聚集索引键的字段。这些函数不能出现在视图的 WHERE 子句中,也不能出现在视图中的 JOIN 操作的 ON 子句中。
    在视图定义中使用的 CLR 函数和 CLR 用户定义类型方法必须具有下表所示的属性设置。
    属性  注意  
    DETERMINISTIC = TRUE
     必须显式声明为 Microsoft .NET Framework 方法的属性。
     
    PRECISE = TRUE
     必须显式声明为 .NET Framework 方法的属性。
     
    DATA ACCESS = NO SQL
     通过将 DataAccess 属性设置为 DataAccessKind.None 并将 SystemDataAccess 属性设置为 SystemDataAccessKind.None 来确定。
     
    EXTERNAL ACCESS = NO
     对于 CLR 例程,该属性的默认设置为 NO。
     
    有关设置 CLR 例程方法的属性的详细信息,请参阅 Custom Attributes for CLR Routines。注意:  
    我们建议 CLR 例程方法的属性设置不要与该方法的功能相悖。如果相悖,可能会导致数据损坏。
     
    视图中的 SELECT 语句不能包含下列 Transact-SQL 语法元素: 
    指定列的 * 或 table_name.* 语法。必须明确给出列名。
    不能在多个视图列中指定用作简单表达式的表列名。如果对列的所有(或除了一个引用之外的所有)引用是复杂表达式的一部分或是函数的一个参数,则可以多次引用该列。例如,下面的 SELECT 列表无效:  复制代码 
    SELECT ColumnA, ColumnB, ColumnA
     
    下面的 SELECT 列表有效:  复制代码 
    SELECT SUM(ColumnA) AS SumColA, ColumnA % ColumnB AS ModuloColAColB, COUNT_BIG(*) AS cBig FROM dbo.T1 GROUP BY ModuloColAColB
     在 GROUP BY 子句中使用的列的表达式或基于聚合结果的表达式。
    派生表。
    通用表表达式 (CTE)。
    行集函数。
    UNION、EXCEPT 或 INTERSECT 运算符。
    子查询。
    外联接或自联接。
    TOP 子句。
    ORDER BY 子句。
    DISTINCT 关键字。
    COUNT(*)(允许 COUNT_BIG(*)。)
    AVG、MAX、MIN、STDEV、STDEVP、VAR 或 VARP 聚合函数。如果在引用索引视图的查询中指定了 AVG(expression),则当视图 SELECT 列表中包含 SUM(expression) 和 COUNT_BIG(expression) 时,优化器可经常计算所需结果。例如,索引视图 SELECT 列表不能包含表达式 AVG(column1)。如果视图 SELECT 列表包含表达式 SUM(column1) 和 COUNT_BIG(column1),则 SQL Server 可以计算引用视图并指定 AVG(column1) 的查询的平均数。
    引用可为空表达式的 SUM 函数。
    CLR 用户定义聚合函数。
    全文谓词 CONTAINS 或 FREETEXT。
    COMPUTE 或 COMPUTE BY 子句。
    CROSS APPLY 或 OUTER APPLY 运算符。
    表提示(仅适用于不低于 90 的兼容级别)。
    联接提示。
    指定 GROUP BY 后,视图 SELECT 列表必须包含 COUNT_BIG(*) 表达式,并且视图定义不能指定 HAVING、CUBE 或 ROLLUP。
    CREATE INDEX 语句的要求
    对视图创建的第一个索引必须是唯一聚集索引。创建唯一聚集索引后,可以创建其他非聚集索引。视图的索引命名约定与表的索引命名约定相同。唯一的区别是表名替换为视图名。有关详细信息,请参阅 CREATE INDEX (Transact-SQL)。CREATE INDEX 除了符合 CREATE INDEX 的常规要求之外,还必须符合下列要求: 执行 CREATE INDEX 语句的用户必须是视图所有者。
    执行 CREATE INDEX 语句时,下列 SET 选项必须设置为 ON: 
    ANSI_NULLS
    ANSI_PADDING
    ANSI_WARNINGS
    CONCAT_NULL_YIELDS_NULL
    QUOTED_IDENTIFIER
    NUMERIC_ROUNDABORT 选项必须设置为 OFF。这是默认设置。
    创建聚集索引或非聚集索引时,IGNORE_DUP_KEY 选项必须设置为 OFF(默认设置)。
    即使 CREATE INDEX 语句中未引用 text、ntext 或 image 列,视图中也不能包含这些列。
    如果视图定义中的 SELECT 语句指定了一个 GROUP BY 子句,则唯一聚集索引的键只能引用在 GROUP BY 子句中指定的列。
    显示为索引键列值的不精确表达式必须是视图基表中的存储列的一个引用。此列可以是常规存储列,也可以是持久化计算列。其他不精确表达式不能作为索引视图的键列的一部分。注意事项
    索引视图中列的 large_value_types_out_of_row 选项的设置继承的是基表中相应列的设置。此值是使用 sp_tableoption 设置的。由表达式组成的列的默认设置为 0。这意味着大值类型存储在行内。