影响选择查询性能的因素包括多个联接?

时间:2016-05-19 17:03:41

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

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

5 个答案:

答案 0 :(得分:0)

百分之百的慢查询可以通过添加/重建索引来修复。确保所有相关表格都有索引,并确保join clause criteria match those index keys

请注意,添加索引可能会有自己的性能开销,尤其是在插入记录时。但它通常是值得的。

答案 1 :(得分:0)

如果要在SQL Server中改进存储过程性能,建议使用以下3项内容:

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

  2. 尝试在主要索引的where条件中使用列。

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

答案 2 :(得分:0)

问题是

  

影响多个联接的因素

有许多事情会产生负面影响,但通常的嫌疑人都在下面。

  1. 已加入的列缺少索引
  2. OUTER JOIN
  3. 的低效加入订单
  4. 使用子查询
  5. 修改搜索参数或连接列(例如A.intColumn+1 = B.intColumn
  6. ORDER BY之类的条款也会影响整体效果。

答案 3 :(得分:0)

(以MySQL为中心的答案)

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

  • 可能会首先选择过滤次数最多的表格(WHERE ...
  • 如果两个表看起来相同,那么可能会先选择较小的表。

当选择下一个'时会出现类似的情况。要使用的表。

MySQL几乎从不在SELECT中为每个表使用多个索引(假设没有子查询或UNIONs)。复合INDEX通常很有用。有时候"覆盖"索引是有保证的。

查看我的index cookbook

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

每天30K插页?这是微不足道的。性能问题在哪里?大SELECTs?这是一个数据仓库应用程序吗?你有摘要表吗? 他们是性能提升的重要因素。

数百万行?还是数十亿?

归一化?过归? (不要标准化'连续的值,如FLOAT,DATE等。)

那是很多挥手的事。如果你想要一些真实的建议,那就让我们看一个慢的查询。

答案 4 :(得分:-2)

根据我的经验,这一切都归结为索引。通过使用示例可以最好地说明这一点。假设你有两个表T1和T2,你想加入它们。每个表只有1000行。如果没有索引,查询执行计划将采用两个表的叉积,然后迭代逐步筛选出与where条件不匹配的结果。为简单起见,我们假设只有一行符合过滤条件。

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

但是,使用索引编制时,只需要20个步骤。 LOG2(n)的