提高 SQL 服务器查询性能的可能步骤

Possible steps to improve SQL Server query performance

我有一个正在传递大约 15-20 个(可选)参数的搜索过程,搜索过程调用它们各自的函数来检查数据库中是否存在传入参数的值。因此,它基本上是一个基于多个参数的 Search 结构。

现在,由于数据库将有数百万条记录,我预计简单的普通搜索过程会立即失败。提高查询性能的方法有哪些?

到目前为止我尝试过的:

  1. 数据库 FirstName 列上的聚集索引(我预计它会被频繁使用)

  2. Non Clustered index 作为用户搜索基础的其余列以及 include 关键字。

注:

我正在寻找更多方法来优化我的查询。

大多数查询只是 select 根据条件检查的语句。

其中一个查询使用了 GroupBy 子句。

我还创建了一个 temporary table,我将在其中插入所有匹配的条目。

首先 Run 来自 Sql Server Management Studioquery 然后查看查询计划以了解瓶颈在哪里。在任何你看到 "table scan" 或 "index scan" 的地方,它都必须遍历所有数据才能找到它要查找的内容。如果您创建可用于这些操作的适当索引,它应该会提高性能。

下面列出了一些提高 sql 查询性能的技巧..

避免在单个查询中进行多次连接

尽量避免编写使用多个连接的 SQL 查询,包括外部连接、交叉应用、外部应用和其他复杂的子查询。它减少了优化器决定连接顺序和连接类型的选择。有时,Optimizer 被迫使用嵌套循环连接,而不管对具有过于复杂的交叉应用或子查询的查询的性能影响如何。

从查询中消除游标 尝试从查询中删除游标并使用基于集合的查询;基于集合的查询比基于游标的查询更有效。如果需要使用游标而不是避免使用动态游标,因为它往往会限制查询优化器可用的计划选择。例如,动态游标将优化器限制为使用嵌套循环连接。

避免使用不相关的标量子查询 您可以重新编写查询以将不相关的标量子查询作为单独的查询而不是主查询的一部分删除,并将输出存储在变量中,该变量可以在主查询或批处理的后续部分中引用。这将为优化器提供更好的选项,这可能有助于 return 准确的基数估计以及更好的计划。

避免多语句Table 值函数 (TVF) 多语句 TVF 比内联 TFV 成本更高。 SQL 服务器将内联 TFV 扩展到主查询中,就像它扩展视图一样,但在与主查询不同的上下文中评估多语句 TVF,并将多语句的结果具体化为临时工作 tables。单独的上下文和工作 table 使多语句 TVF 成本高昂。

创建高选择性索引 选择性定义 table 中合格行的百分比(合格行数 rows/total 行数)。如果符合条件的行数占总行数的比例很低,则该索引具有很高的选择性并且最有用。如果该比率大约为 5% 或更低,则非聚集索引最有用,这意味着该索引可以消除 95% 的行。如果索引 return 超过 table 中行的 5%,它可能不会被使用;要么选择或创建不同的索引,要么扫描 table。

在索引中定位列 索引中列的顺序或位置对于提高 SQL 查询性能也起着至关重要的作用。如果查询条件与索引键中最左边的列相匹配,则索引可以帮助提高 SQL 查询性能。作为最佳实践,大多数选择性列应放在非聚集索引键的最左侧。

删除未使用的索引 删除未使用的索引有助于在不影响数据检索的情况下加快数据修改速度。此外,您需要为 运行 不经常使用某些索引的批处理定义策略。在这种情况下,在批处理之前创建索引,然后在批处理完成后删除它们有助于减少数据库的开销。

统计创建和更新 您需要注意查询中引用的计算列和多列的统计信息创建和定期更新;查询优化器使用有关 table 统计信息的一个或多个列中值分布的信息来估计查询结果中的基数或行数。这些基数估计使查询优化器能够创建高质量的查询计划。

重新审视您的模式定义 最后但同样重要的是,重新审视您的架构定义;请注意是否存在适当的 FORIGEN KEY、NOT NULL 和 CEHCK 约束。在正确的位置使用正确的约束总是有助于提高查询性能,例如 FORIGEN KEY 约束通过将一些外部或半连接转换为内部连接来帮助简化连接,CHECK 约束也有助于通过删除不必要或冗余的谓词来提供一些帮助。

Reference