【问题标题】:Creating indexes for optimizing the execution of Stored Prcocedures创建索引以优化存储过程的执行
【发布时间】:2010-07-13 11:34:39
【问题描述】:

我的一个查询的 WHERE 子句如下所示:

and tbl0.Type = 'Alert' 
AND (tbl0.AccessRights like '%'+TblCUG0.userGroup+'%' 
     or tbl0.AccessRights like 'All' )
AND (tbl0.ExpiryDate > CONVERT(varchar(8), GETDATE(), 1)  
     or tbl0.ExpiryDate is null)
order by tbl0.Priority,tbl0.PublishedDate desc, tbl0.Title asc

我想知道我可以在哪些列上创建索引以及最适合哪种类型的索引。此外,我听说索引在开始时不适用于 Like 和 Wild 卡。那么优化查询的方法应该是什么。

【问题讨论】:

    标签: sql sql-server-2005 indexing


    【解决方案1】:
    1    and tbl0.Type = 'Alert' 
    2    AND (tbl0.AccessRights like '%'+TblCUG0.userGroup+'%' 
    3         or tbl0.AccessRights like 'All' )
    4    AND (tbl0.ExpiryDate > CONVERT(varchar(8), GETDATE(), 1)  
    5         or tbl0.ExpiryDate is null)
    

    很可能,您将无法像这样使用带有WHERE 子句的索引。

    第 1 行,您可以在 tbl0.Type 上创建索引,但如果您有很多行而实际值很少,SQL Server 无论如何都会跳过索引和表扫描。此外,与索引问题无关,像这样的列、代码/标志值作为固定宽度值 char(1)、tiny int 等更好,其中“A”=alert 或 1=alert。我会将列命名为 XyzType,其中 Xyz 是类型描述的内容(DoctorType、CarType 等)。我将创建一个新表 XyzTye,并在 tb10 中将 FK 返回到此列。这个新表将有两列 XyzType PK 和 XyzDescription,您可以在其中展开名称。

    第 2 行,您是否将多个值合并到 tbl0.AccessRights 中?并尝试使用LIKE 在其中查找值?如果是这样,请将其拆分为不同的表,然后您可以删除类似的内容并可能在其中添加索引。

    第 3 行OR 终止索引使用。想象一下在电话簿中查找所有“Smith”或以“G”开头的名字,你不能只使用索引。您可以尝试将查询拆分为围绕 OR 的 UNIONUNION ALL,以便可以使用索引(一部分查找“Smith”,另一部分查找“G”)。您没有提供足够的查询来确定您的情况是否可行。许多人需要使用包含此UNION 的派生表,以便将其连接到查询的其余部分。

    第 4 行tbl0.ExpiryDate 可以从索引中受益,但 or 会终止它的使用,请参阅第 3 行注释。

    第 5 行,您可以尝试上面讨论的 OR union 技巧,或者干脆不使用 NULL,输入一个默认值,如 '01/01/3000' 这样你就不会需要OR

    【讨论】:

      【解决方案2】:

      SQL Server 的数据库优化顾问可以建议哪些索引将优化您的查询,包括覆盖将优化您未包含在查询中的选定列的索引。仅仅因为您添加了索引并不意味着查询优化器会使用它。某些索引的使用成本可能高于其他索引,因此优化器将使用基础表的统计信息来选择最佳索引。 您可以将所有排序和条件列添加到索引中,但如果不同的优先级值太少而无法存储,这将毫无用处。

      您对 LIKE 和通配符的看法是正确的。索引是一个 btree,这意味着它可以加快对特定值或范围查询的快速搜索。开头的通配符意味着查询必须触及所有记录以检查它们是否与模式匹配。末尾的通配符意味着查询只需触及以子字符串开头直到通配符的项目,部分将其转换为可以从索引中受益的范围查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-17
        相关资源
        最近更新 更多