首页 / 知识
关于sql:最喜欢的性能调整技巧
2023-04-12 16:17:00

Favourite performance tuning tricks当您有需要性能调整的查询或存储过程时,首先要尝试哪些操作?
这是我经常给别人询问优化问题的便捷清单。 例如,SQL Server附带了许多性能监视/调整位,但是如果您没有这样的功能(甚至可能没有),那么我将考虑以下内容... 我看到的问题中有99%是由于在联接中放置太多表引起的。解决方法是进行一半的连接(使用某些表),并将结果缓存在临时表中。然后在该临时表上进行其余查询的联接。 查询优化清单
稍微偏离主题,但是如果您可以控制这些问题...
确保您的 如果您的环境是数据集市或仓库,则几乎所有可能的查询都应包含索引。
在事务环境中,索引的数量应更少,其定义应更具战略意义,以便索引维护不会拖累资源。 (与 另外,请注意索引中字段的顺序-字段的选择性越强(基数越高),它应该在索引中越早出现。例如,假设您要查询二手车:
价格通常具有较高的基数。可能只有几十种颜色可用,但可能有成千上万种不同的要价。
在这些索引选择中,
这是因为满足价格要求的汽车要少于颜色选择,因此查询引擎要分析的数据要少得多。 众所周知,我有两个非常相似的索引,只是在字段顺序上有所不同,以加快一个查询(名字,姓氏)和另一个查询(姓氏,名字)的速度。 我最近了解到的一个技巧是,SQL Server可以在更新语句中更新局部变量以及字段。
或更易读的版本:
在实现递归计算时,我用它来替换复杂的游标/联接,并且还获得了很多性能。
以下是一些细节和示例代码,它们在性能上做出了惊人的改进: 假设这里使用MySQL,请使用EXPLAIN找出查询的内容,确保尽可能高效地使用索引,并尝试消除文件排序。高性能MySQL:优化,备份,复制和其他功能以及MySQL Performance Blog都是一本关于此主题的好书。 @Terrapin值得一提的是,isnull和合并之间还有一些其他区别(除了ANSI合规性,这对我来说是一个很大的区别)。 合并与IsNull 有时,在SQL Server中,如果在where子句中使用OR,它将真正提高性能。而不是使用OR,只需执行两个选择并将它们合并在一起即可。您可以以1000倍的速度获得相同的结果。 我通常从联接开始-一次将每个联接从查询中剔除,然后重新运行查询以了解是否有我遇到的特定联接。 在我所有的临时表上,我喜欢添加唯一的约束(在适当的情况下)以创建索引,并添加主键(几乎始终)。
查看where子句-验证索引的使用/验证没有任何傻事
我习惯总是使用绑定变量。如果RDBMS不缓存SQL语句,则绑定变量可能无济于事。但是,如果您不使用绑定变量,则RDBMS将没有机会重用查询执行计划和已解析的SQL语句。节省的费用可能是巨大的:http://www.akadia.com/services/ora_bind_variables.html。我主要使用Oracle,但是Microsoft SQL Server的工作方式几乎相同。 以我的经验,如果您不知道是否正在使用绑定变量,则可能不是。如果您的应用程序语言不支持它们,请找到一种支持的语言。有时,您可以通过对查询B使用绑定变量来修复查询A。 之后,我与我们的DBA进行了交谈,以找出导致RDBMS最痛苦的原因。请注意,您不应询问"为什么此查询速度慢?"这就像要求您的医生将您的阑尾取出。当然,您的查询可能是问题所在,但很可能其他问题出了问题。作为开发人员,我们倾向于考虑代码行。如果线路较慢,请修复该线路。但是RDBMS是一个非常复杂的系统,查询速度慢可能是更大问题的征兆。 太多的SQL调优技巧是狂热的偶像。在大多数情况下,问题与您使用的语法无关或具有最小的关系,因此通常最好使用可以使用的最简洁的语法。然后,您可以开始研究调整数据库的方法(而不是查询)。仅在失败时调整语法。 像任何性能调整一样,请始终收集有意义的统计信息。除非您正在调整用户体验,否则不要使用挂钟时间。取而代之的是看诸如CPU时间,读取的行和从磁盘读取的块之类的事情。人们常常为错误的事情进行优化。 如果可能,将NOT IN查询转换为LEFT OUTER JOIN。 例如,如果要在表1中查找表2中外键未使用的所有行,可以执行以下操作:
但是,您可以获得以下更好的性能:
第一步:
将统计信息设置为"打开" 在我这里,使用WITH(NoLock)运行查询几乎是标准操作。任何人都可以在数十GB的表上捕获正在运行的查询,而不会将其取出并删除。 确保索引长度尽可能小。这使DB一次可以从文件系统中读取更多键,从而加快了连接速度。我认为这适用于所有数据库,但是我知道这是针对MySQL的特定建议。 @戴维
在SQL Server中,执行计划使您有同感–告诉您正在命中哪些索引,等等。 用您筛选依据的clm为表格建立索引 本身不一定是SQL性能技巧,但肯定相关: 一个好主意是在可能的情况下使用memcached,因为它将直接从内存中获取预编译的数据而不是从数据库中获取预编译的数据会更快。还有一种内置了memcached的MySQL(第三方)。 我寻找:
在SQL Server中,使用nolock指令。它允许select命令完成而不必等待-通常是其他事务完成。
通常,存储过程中的第一行,除非我实际上需要使用 删除不需要的游标。 删除存储在许多行将调用该函数的Sproc中的函数。 我的同事使用函数调用(例如,从userid获取lastlogindate)返回非常宽的记录集。 经过优化任务后,我用函数代码替换了存储过程中的函数调用:我使许多存储过程的运行时间从> 20秒减少到<1。 我喜欢用
过度
当我不需要多参数支持时,凝聚会为您提供。 http://blog.falafel.com/2006/04/05/SQLServerArcanaISNULLVsCOALESCE.aspx 不要使用" sp_"作为存储过程名称的前缀,因为系统过程都以" sp_"开头,并且SQL Server在调用过程时将必须更加努力地寻找过程。 我总是先去SQL Profiler(如果它是具有很多嵌套级别的存储过程)或查询执行计划器(如果它是一些没有嵌套的SQL语句)。 您有90%的时间可以使用这两种工具之一立即发现问题。 脏读-
在绝对不需要事务完整性的情况下防止死锁(通常是这样)
|
最新内容
相关内容
关于性能:Hadoop的经验?
关于性能:Hadoop的经验?,关于性能:Hadoop的经验?,体系结构,文件系统,我也,分布式,Experience with Hadoop?你们有没有尝试过Hadoop? 在无关于性能:为(字符串)哈希函数选择乘
关于性能:为(字符串)哈希函数选择乘数,关于性能:为(字符串)哈希函数选择乘数,函数,计算,用于,乘法器,Choosing a multiplier for a (st关于搜索:Solr中的通配符查询错误
关于搜索:Solr中的通配符查询错误,关于搜索:Solr中的通配符查询错误,查询,搜索,文档,解析器,WildcardQuery error in Solr我使用solr搜LINQ-to-SQL vs存储过程?
LINQ-to-SQL vs存储过程?,LINQ-to-SQL vs存储过程?,推出,初学者,指南,我在,LINQ-to-SQL vs stored procedures?我在StackOverflow(LINQ关于性能:解释语言-利用解释器后面
关于性能:解释语言-利用解释器后面的编译语言,关于性能:解释语言-利用解释器后面的编译语言,语言,解释,的人,我对,Interpreted languag在SQL Server上插入更新存储过程
在SQL Server上插入更新存储过程,在SQL Server上插入更新存储过程,存储过程,写了,它会,则会,Insert Update stored proc on SQL Serv在PHP中高效调整JPEG图像大小
在PHP中高效调整JPEG图像大小,在PHP中高效调整JPEG图像大小,图像,方法,函数,调整,Efficient JPEG Image Resizing in PHP在PHP中调整有没有人在单元测试SQL存储过程方
有没有人在单元测试SQL存储过程方面取得任何成功?,有没有人在单元测试SQL存储过程方面取得任何成功?,代码编写,单元测试,发现,过程中,H关于性能:在.NET中,是否会优化空方法
关于性能:在.NET中,是否会优化空方法调用?,关于性能:在.NET中,是否会优化空方法调用?,调用,优化,方法,主体,In .NET, will empty method ca关于c#:有条件的Linq查询
关于c#:有条件的Linq查询,关于c#:有条件的Linq查询,日志,严重性,过滤,字符串,Conditional Linq Queries我们正在研究一个日志查看器。 使关于C#:DataTable上的LINQ查询
关于C#:DataTable上的LINQ查询,关于C#:DataTable上的LINQ查询,执行,查询,对象,数据表,LINQ query on a DataTable
我正在尝试对数据表对关于性能:单元测试执行速度(每秒多
关于性能:单元测试执行速度(每秒多少测试?),关于性能:单元测试执行速度(每秒多少测试?),单元测试,目标,执行,我想,Unit test execution s