查看或表格上的索引?

时间:2014-06-02 00:42:49

标签: sql-server sql-server-2008 tsql indexing

任何人都可以帮我这个。

我应该把索引放在哪里,因为它是一个视图?索引子查询(表)是否有助于优化它,或者我应该仅在视图上放置索引?

非常感谢。

  1. vw_fact_test上的INDEX?
  2. A1LE_Project上的INDEX?
  3. 代码:

    ALTER VIEW [dbo].[vw_fact_test]
    AS
      SELECT     
          A.Column1
          A.Column2, 
          A.Column3, 
          CASE 
             WHEN Column4 IS NULL OR Column4 = '' OR Column4 = 'NULL' 
               THEN 'unknown' 
               ELSE Column4 
          END AS Column4, 
          CASE 
            WHEN Column5 IS NULL OR Column5 = '' OR Column5 = 'NULL' 
              THEN 'unknown' 
              ELSE Column5 
          END AS Column5, 
          A.Column6, 
          dbo.M3Ofc_Lookups.Column7
    FROM         
        (SELECT     
            Column1, 
            Column2, 
            Column3, 
            Column4, 
            Column5, 
            Column6, 
        FROM 
            dbo.A1LE_Project) AS A 
    INNER JOIN 
        dbo.M3Ofc_Lookups ON A.[Office Code] = dbo.M3Ofc_Lookups.[Office Code] 
    WHERE 
        (A.Column2 <> 0) OR
        (A.Column3 <> 0) OR
        (A.Column4 <> 0)
    

1 个答案:

答案 0 :(得分:0)

首先,您可以简化select语句,这样可以更轻松地阅读和思考索引。您不需要子查询。

SELECT A.Column1, A.Column2, A.Column3, 
        CASE 
            WHEN Column4 IS NULL OR Column4 = '' THEN 'unknown' 
            ELSE Column4 
        END AS Column4, 
        CASE 
            WHEN Column5 IS NULL OR Column5 = '' THEN 'unknown' 
            ELSE Column5 
        END AS Column5, 
        A.Column6, B.Column7
    FROM dbo.A1LE_Project AS A 
        INNER JOIN dbo.M3Ofc_Lookups AS B
            ON A.[Office Code] = B.[Office Code] 
    WHERE (A.Column2 <> 0) OR (A.Column3 <> 0) OR (A.Column4 <> 0);

您需要考虑表的大小以及要提高性能的位置。您还需要检查执行计划。

如果表B是查找表,则它可能相当小。因此查询处理器可以以很少的成本进行表扫描。如果它是相当大的,使[Office Code]成为集群主键会有所帮助。或者可能在[Office Code]和Column7上添加索引。

表A中有多少条记录,列的类型和大小是什么?

如果表A具有大量记录,并且select语句将产生一小部分,则将索引放在Column2,Column3和Column4上可能会有所帮助。查询处理器将能够尽早快速选择所需的记录。您需要对此进行测试,并查看对执行计划的影响。

如果第1列到第6列很小,并且该表包含许多其他列,那么添加覆盖索引可能有所帮助。

在添加任何索引之前,您需要考虑数据库的更新方式以及对性能的影响。数据库是仅用于报告,还是也在更新?

在视图本身上添加索引可能会对更新性能产生严重影响。这几乎就像创建一个自动保持步骤的附加表。请参阅SQL Server联机丛书&gt;创建索引视图。 “在视图上创建的第一个索引必须是唯一的聚簇索引。在创建唯一聚簇索引之后,您可以创建其他非聚簇索引。在视图上创建唯一聚簇索引可提高查询性能,因为视图存储在数据库中以同样的方式存储具有聚集索引的表。“