如何调试数据库查询以获得性能

时间:2010-07-01 20:11:30

标签: performance database

我是数据库和SQL查询的新手。

  

Q1。有哪些常见问题   一般面对数据库查询?可能是非常大的查询,性能问题,超时和连接错误,导入导出和恢复错误

     

Q2。应该采用什么方法和工具   在调试SQL时要注意   查询性能?

如果你能分享一些面临的问题以及你是如何解决这个问题的话会很棒。

7 个答案:

答案 0 :(得分:5)

在您的查询之前尝试使用EXPLAIN,这将为您提供有关幕后内容的完整概述。

另见:SQL Performance Tips

答案 1 :(得分:5)

您可能想要了解的最重要的事情之一是索引。查询性能的一个巨大潜在瓶颈是,当您搜索不属于索引的列并导致表扫描时。表扫描意味着每行都在扫描,因此表中记录越多,性能越差。

我不确定您使用的数据库是什么,但从SQL Server的角度来看,您可以很好地学习如何使用SQL事件探查器。您还可以通过SQL Management Studio查看查询的执行计划,这将指出查询中的性能问题可能位于何处。

答案 2 :(得分:2)

我使用here显示的方法进行了调试,其中一种方法适用于我。

我检查了运行时间最长的查询,并发现某些查询已停滞并且运行超过3-4小时。要检查查询运行的时间,请运行以下命令:

SELECT max(now() - xact_start) FROM pg_stat_activity
                               WHERE state IN ('idle in transaction', 'active');

如果这超过一个小时,那就是问题所在。 Kill the long running connection并限制应用程序端的最大连接时间。

答案 3 :(得分:1)

调试SQL查询最重要的是SQL Server Profiler http://msdn.microsoft.com/en-us/library/ms187929.aspx

这将为您提供读取,写入,花费的时间等。

执行计划也非常有用,它会告诉您是否执行了扫描而不是搜索,反之亦然。同时查看这些http://msdn.microsoft.com/en-us/library/ms178071.aspx

答案 4 :(得分:1)

如果您真的对性能调优数据库查询感兴趣,那么您需要为您选择的数据库获取一本关于该主题的大书。性能调优是特定于数据库的。也就是说,无论数据库是什么,调整查询都必须注意的一个常见问题是调优查询应该返回与原始查询完全相同的结果集但速度更快。有时人们调整会忘记这个基本的东西,并最终得到一个更快但不会做同样事情的查询。

数据库查询中的问题 -

错误的结果 - 查询实际上并没有按照您的意愿执行

性能 - 查询超时或太慢。许多事情都可能导致这种情况,但有几个常见的原因是数据库设计不好(例如不使用EAV表),使用性能较差的查询技术(如相关子查询),一次循环记录,缺少正确的索引,统计过时,查询不可搜索,当然还有硬件和网络问题。

对于插入,更新,删除 - 由于数据库设计不佳(缺少外键,缺少默认值,缺少约束)或查询设计,可能会出现数据完整性问题。很久以来人们选择创建自己的自动增量字段而不是使用数据库附带的任何内容。这些可能会遇到并发问题。

安全性 - 数据库无法正确保护其数据(加密个人数据,编码以避免注入攻击,限制对数据执行操作的权限等)。

缺乏对边缘情况的测试 - 这是动态SQl和触发器中的常见问题,尤其是当开发人员只考虑最常见的情况并且当边缘情况发生时事情中断时。

答案 5 :(得分:1)

This is a good article关于如何优化您的SQL语句和您考虑的事项:

答案 6 :(得分:0)

数据库中出现的问题通常不直接与查询相关,但我必须解决的问题是缺少索引(可能导致对数据的查询非常慢),数据完整性问题,因为没有创建允许某人腐败的约束数据。

此外,如果您打算使用事务,请确保了解它们将如何影响并发使用,并确保在事务完成之前无法从事务中正在修改的表中选择数据。

连接和超时不是我通常遇到的问题。

就查询而言 - 使用解释计划,它允许您确定数据库引擎如何运行查询。 (这将确定如何执行联接以及联接的顺序和基数 - 如果您可以减少联接中的多对多关系,则查询将运行得更快)