通过向数据库添加索引来提高应用程序性能

Improve an application performance by adding indexes to a database

我有一个包含大量遗留代码的旧 Web 应用程序,我需要提高某些报告的性能。我想避免重写报告,因为它是难以维护、测试和开发的标准遗留应用程序。因此,我试图通过在 MSSQL (2008) 中为报告查询添加索引来加快这些报告的速度。报告执行大约 3-4k 个查询。

以下是我的改进方案:
1. 通过 运行

清理 MSSQL 缓冲区
DBCC DROPCLEANBUFFERS  
DBCC FREEPROCCACHE  
DBCC DROPCLEANBUFFERS

2。 运行 MSSQL 探查器然后执行报告。
3. 收集所有报告的查询,然后将它们导出到 MSSQL.
4.计算持续时间总和。
5. 按 textdata 对查询进行分组并按 sum(duration) desc.
对它们进行排序 6. 从分析器的导出执行查询并添加 MSSQL Management Studio 推荐的索引。
7. 重复步骤 1 到 6 并比较结果。

我得到了有趣的结果。当我提高报告 #1 的性能时,报告 #2 的性能会降低。有时在添加索引后我的性能也会下降十倍。

我的问题:
1. 通过提高 SQL 查询性能来提高应用程序性能是个好主意吗?
2. 是否可以通过添加索引来提高执行 3-4k SQL 查询的报表的性能?

  1. 如果数据库是瓶颈,通过提高 SQL 查询性能来提高应用程序性能是个好主意。根据上面提供的信息,我可以说,在您的情况下,数据库性能很重要,值得改进。

  2. 可以通过添加索引显着提高执行大量查询的报表的性能。特别是如果 tables 本身包含大量记录(10 000 条或更多)。 但是,索引有其自身的缺点:

    • 他们减速insertions/updates/deletions
    • 它们影响查询执行计划。因此,在某些情况下,数据库管理器会选择在更适合执行完整 table 扫描时使用索引。这反过来会导致性能下降。

For a poor performing database, inappropriate/missing indexes can be ONE of the many reasons.

If you think not having enough indexes is what causing the poor performance then there are tool to check if the missing indexes is the actual problem, but sometimes problem can be the query itself.

If your query is written poorly no matter how many indexes you add it will perform poor.

Sometimes query is written fine and there are enough indexes to support the query but there isn’t enough resources (Memory RAM, processor horse power) to get the job done quickly.

I would suggest you to investigate your database a bit more before you start adding indexes and introduce more problems which never existed before.

一些有用的链接

  1. Are you using SQL's Missing Index DMVs?

    这将允许您查看是否有任何缺失的索引,并且查询可以通过添加索引来提高性能。

  2. Wait statistics, or please tell me where it hurts

    这篇由 Paul Randal 撰写的博客将帮助您准确了解导致 sql 服务器性能低下的原因。无论是您的硬件还是索引或查询。

  3. Most Expensive Queries

    这将允许您查看数据库中最昂贵的查询,我会逐个查询并尝试改进代码(如果可能),并检查是否有任何索引可以帮助查询降低其成本。

导入备注

sql 服务器中的性能调整不是简单的任务,也没有灵丹妙药,您需要进行更多调查以找到数据库中的实际瓶颈并针对它们,并随着每次更改比较该更改如何影响您的数据库性能。祝你好运:)