【问题标题】:What are the factors that affects select query's performance which include multiple joins?影响选择查询性能的因素有哪些,包括多个连接?
【发布时间】:2016-09-16 17:16:49
【问题描述】:

我有一个庞大的数据库,我的任务是提高其性能以避免超时问题并最小化选择查询的持续时间。 我需要集中哪些领域来有效地提高存储过程的性能? 像 facebook 这样的网站如何存储大量数据并且仍然不缺乏性能? 可以做些什么来提高 SP 的绩效?

【问题讨论】:

  • 1.首先也是最重要的事情是在您的代码中遵循 SET BASED APPROACH 2. 添加相关的 Index
  • 性能调优是一个巨大的话题。例如在 sqlpass.org 或 sqlbits.com 中有很多免费的会话记录
  • 除了 Tuning Advisor 还有什么更好的方法可以知道在哪里应用索引?
  • 您庞大的数据库中有多少条记录?
  • 这是一个生产环境,其中记录正在流入并且您也在运行查询以从中报告?如果是这种情况并且数据量很大,那么下一步可能是一个单独的多维数据仓库。

标签: mysql sql sql-server performance sql-server-2008


【解决方案1】:

(以 MySQL 为中心的答案)

JOINs 是通过一次处理一个表来执行的。优化器选择它认为最好的开始。以下是一些标准:

  • 可能会首先选择过滤次数最多的表 (WHERE ...)。
  • 如果两张桌子看起来差不多,那么可能会先选择较小的桌子。

在选择要使用的“下一个”表时会发生类似的情况。

MySQL 几乎从不在SELECT 中的每个表中使用多个索引(假设没有子查询或UNIONs)。复合INDEX 通常很有用。有时需要“覆盖”索引。

见我的index cookbook

存储的例程对性能没有多大帮助——除非您通过 WAN 访问服务器。在这种情况下,SP 会减少往返次数,从而改善延迟。

每天 30K 插入?那是微不足道的。哪里有性能问题?在大SELECTs?这是一个数据仓库应用程序吗?你有汇总表吗? 它们是性能的巨大提升。

数百万行?还是数十亿?

标准化?过度标准化? (不要标准化“连续”值,例如 FLOAT、DATE 等)

这是一个很大的挥手。如果你想要一些真正的建议,让我们看看一个慢查询。

【讨论】:

    【解决方案2】:

    根据我的经验,这一切都归结为索引。最好用一个例子来说明这一点。假设您有两个表 T1 和 T2,并且您想加入它们。每个表只有 1000 行。在没有索引的情况下,查询执行计划会取两张表的叉积,然后依次迭代过滤掉不符合 where 条件的结果。为简单起见,我们假设只有一行符合过滤条件。

    T1 X T2 = 1000 * 1000 = 1,000,000 如果没有索引,过滤将需要 100 万步。

    但是,使用索引,只需要 20 个步骤。对数2(n)

    【讨论】:

      【解决方案3】:

      问题是

      影响多个连接的因素

      有很多负面影响的事情,但通常的嫌疑人如下。

      1. 连接列上缺少索引
      2. OUTER JOIN 的低效加入订单
      3. 子查询的使用
      4. 修改搜索参数或连接列(例如A.intColumn+1 = B.intColumn

      ORDER BY 之类的子句通常也会影响性能。

      【讨论】:

        【解决方案4】:

        如果您想提高 SQL Server 中的存储过程性能,建议以下 3 件事:

        1. 在 SP 中添加 'SET NOCOUNT ON' --- 它可以显着提升性能,因为网络流量大大减少。

        2. 尽量使用where条件中主要索引的列。

        3. 验证执行计划,如果您看到出现多个并行,请尝试使用 OPTION(MAXDOP N),其中 N 您可以根据要求设置。

        【讨论】:

        • 选项 3 是什么意思?你鼓励增加还是减少并行度? “按要求”确实含糊不清。
        【解决方案5】:

        90% 的慢查询可以通过添加/重建索引来修复。确保您对所有涉及的表都有索引,并且您的join clause criteria match those index keys

        但请注意,添加索引可能会带来性能成本,尤其是在插入记录时。但这通常是值得的。

        【讨论】:

        • 目前我不添加索引的原因是尽可能地调整程序以提高性能。最后一个是创建索引,因为我不希望数据库大小变高,显然插入查询性能会受到影响。
        • @JohnVM 在没有索引的情况下做查询优化真的没有多大意义。
        • MySQL 不需要重建索引。我不知道 Sql Server。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-19
        相关资源
        最近更新 更多