我对数据库和 SQL 查询完全是新手。
Q1。数据库查询时通常会遇到哪些常见问题?可能非常大的查询、性能问题、超时和连接错误、导入导出和恢复错误
Q2。在调试 SQL 查询性能时应该注意哪些方法和工具?
如果您能分享所面临的一些问题以及您是如何解决这些问题的,那就太好了。
索引可能是您想要了解的最重要的事情之一。 查询性能的一大潜在瓶颈是当您搜索不属于索引的列时,它会导致表扫描。 表扫描意味着每一行都被扫描,所以表中的记录越多,性能自然越差。
我不确定您使用的是什么数据库,但从 SQL Server 的角度来看,学习如何使用 SQL Profiler 会对您很有帮助。 您还可以通过 SQL Management Studio 查看查询的执行计划,这将指出查询中可能存在性能问题的位置。
我使用此处所示的方法进行了调试,其中一种方法对我有用。
我检查了运行时间最长的查询,发现某些查询被卡住并运行了超过 3-4 小时。要检查查询运行了多长时间,请运行以下命令:
SELECT max(now() - xact_start) FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'active');
如果超过一个小时,那就是问题所在。 终止长时间运行的连接并从应用程序端限制连接的最大寿命。
调试SQL查询最重要的是SQL Server Profiler http://msdn.microsoft.com/en-us/library/ms187929.aspx
这将为您提供读取、写入、花费的时间等。
执行计划也非常有帮助,它会向您显示它是否进行了扫描而不是查找,反之亦然。也看看这些 http://msdn.microsoft.com/en-us/library/ms178071.aspx
如果您确实对性能调优数据库查询感兴趣,您需要阅读一本关于您选择的数据库的主题的厚书。性能调整是非常特定于数据库的。也就是说,无论数据库如何,调优查询时都必须注意的一个常见问题是调优查询应返回与原始查询完全相同的结果集,但速度更快。有时,调优的人会忘记这个基本的事情,最终会得到一个更快但不做同样事情的查询。
数据库查询中的问题-
错误的结果 - 查询实际上并未执行您想要的操作
性能 - 查询超时或太慢。许多因素都可能导致这种情况,但有几个常见原因是糟糕的数据库设计(例如,不使用 EAV 表)、使用性能不佳的查询技术(例如相关子查询)、一次循环一条记录、缺乏正确的索引、统计信息过时的、不可控制的查询,当然还有硬件和网络问题。
对于插入、更新、删除 - 由于数据库设计不佳(缺少外键、缺少默认值、缺少约束)或查询设计,可能会出现数据完整性问题。有时,人们选择创建自己的自动增量字段,而不是使用数据库附带的任何内容。这些可能会遇到并发问题。
安全性 - 数据库没有正确保护其数据(个人数据加密、编码以避免注入攻击、限制对数据执行操作的权限等)
缺乏对边缘情况的测试 - 这是动态 SQl 和触发器中的一个常见问题,特别是当开发人员只考虑最常见的情况并且当边缘情况发生时事情就会崩溃。
数据库中出现的问题通常与查询不直接相关,但我必须解决的问题是缺少索引(可能导致数据查询速度非常慢)、数据完整性问题,因为未创建约束,从而允许有人损坏数据.
此外,如果您要使用事务,请确保您了解它们将如何影响并发使用,并知道在事务完成之前您无法从事务中正在修改的表中选择数据。
连接和超时不是我通常遇到的问题。
就查询而言 - 使用解释计划,它允许您确定数据库引擎将如何运行您的查询。 (这将确定如何执行联接以及联接的顺序和基数 - 如果您可以减少联接中的多对多关系,您的查询将运行得更快)
这是一篇好文章,介绍了如何优化 SQL 语句以及需要考虑的事项: