十大SQL Server性能瓶颈

时间:2009-08-12 17:49:03

标签: sql sql-server performance

数据库结构不是最常见的性能瓶颈是什么?

17 个答案:

答案 0 :(得分:14)

让我们看一下(没有特别的顺序)

  1. 光标

  2. 不可搜索的where子句

  3. 无法索引外键字段

  4. 无法索引where子句中常用的字段

  5. 相关子查询

  6. 意外交叉连接导致需要区分结果集

  7. 执行来自ORM的代码

  8. 导致读取次数过多的代码,或者在不需要的情况下多次调用的代码(我看到应用程序在不需要时或每次发送时多次发送相同的代码页面已打开)

  9. 网络管道重载

  10. 用户定义的函数导致逐行处理

  11. 参数嗅探

  12. 过时的统计数据

  13. 联盟代替联合所有

答案 1 :(得分:4)

表扫描因为:

  • 索引不存在
  • 统计信息已过期
  • where子句中的函数阻止使用

答案 2 :(得分:3)

  1. 服务器 - 与内存和存储类似 类型。
  2. 网络 - 延迟和带宽 的问题。
  3. 索引 - 不确定您是否考虑过 这个数据库结构
  4. 查询 - 带有连接的错误查询 可能导致全表的问题 扫描。

答案 3 :(得分:3)

物理....耗尽内存,不得不转到磁盘。

答案 4 :(得分:1)

使用游标。对于任何数据库。

答案 5 :(得分:1)

将标量函数应用于结果集中的每一行

SELECT fn_EveluateSomeValue([ColumnName]) FROM LargeTable

答案 6 :(得分:1)

一些低调的果实:

  • 标量UDF
  • 在XPath查询中省略text()
  • 缺少索引中的列(导致键查找)
  • 使用游标
    • 在需要游标时尽可能不使用fast_forward
  • JOIN执行时使用APPLY,反之亦然(测试!)

答案 7 :(得分:1)

一次使用一行表数据而不是一次使用一个表(即游标)。

不必要的(或设计不当的)锁。

记录记录不需要记录的内容(从表中删除而不是删除Truncate表等)

在批量加载数据时受到限制。严重减慢插入速度。关闭它们,加载数据,然后重新打开它们。

答案 8 :(得分:1)

Ditto ref游标,也写得很糟糕的客户端应用程序得到了一个巨大的记录集然后自己处理它,因为开发人员不明白sql只是一个巨大的堆来保存数据。

尝试在一个巨大的查询中执行所有操作,而不是将其分解为合理的步骤。 有时这不会让SQL有机会正确地减少必须查看的索引(希望!)页面的数量。 与此相关,不了解如何在更新大型索引表之前使用临时表来处理操作。

没有连接或常见查询字段的索引。

当您一直寻找并返回相同的值时(例如,当您使用EmployeeID查找时,员工的格式化名称)导致两个操作而不是一个操作时,不包括索引中的字段。

答案 9 :(得分:0)

我倾向于遇到以下瓶颈(按频率顺序):

  1. 缺少或不正确的索引(导致表扫描)
  2. 写得不好的查询
  3. I / O争用

答案 10 :(得分:0)

对我们来说,调整 BIOS设置和电源计划设置可以使CPU密集型查询(搜索时间大约为5秒)的速度提高〜2倍。

1)BIOS设置从“每瓦性能优化(DAPC)”更改为“性能”或“每瓦优化性能(OS)”。这两个选项似乎表现相似但是“OS”控制的选项没有连续运行风扇。

2)Windows电源计划已从“Balanced”更改为“High performance”。

这是在升级CPU并且几乎没有任何改进后发现的。

SQLServerCentral检查CPU速度的命令:

PS> gwmi -class win32_Processor | SELECT CurrentClockSpeed, MaxClockSpeed

Update 6/13/2017:警告:该号码可能会报告当前=最大值,但任务管理器可能会显示不同的(低得多)数字。在一些硬件更改后,BIOS模式“每瓦性能优化(OS)”突然停止为我们工作。无论负载如何,CPU都锁定在最大频率的50%只有“性能”模式(大风扇模式)仍然达到最大CPU。我们必须缺少固件/软件补丁。

答案 11 :(得分:0)

硬件故障。我有一台服务器曾经硬盘驱动器有一些扇区,它有阅读困难,我们更换它有显着的性能提升。

答案 12 :(得分:0)

我从未设法找到有关分解大型查询的有用信息,在Oracle中似乎建议您更多地将所有内容保存在一个查询中而不是使用临时表。如果临时表包含大量数据,您还可以获得重做日志问题。 我想知道更多/得到一些链接?

答案 13 :(得分:0)

答案 14 :(得分:0)

如果服务器中的I / O系统不能胜任该作业,则可能会在tempdb上出现闩锁争用,这反过来会导致严重的性能问题。

答案 15 :(得分:0)

当您处理大批量命令时,触发器可能是一个巨大的瓶颈(并且令人头痛)。

答案 16 :(得分:-1)

要避免的条款(如果可能):

  • DISTINCT / UNIQUE
  • UNION
  • GROUP BY
  • ORDER BY