你最常见的sql优化是什么?

时间:2009-08-26 06:48:49

标签: sql optimization

您使用的最常见的SQL优化是什么?

17 个答案:

答案 0 :(得分:33)

通过仅返回所需的字段并仅返回所需的行来减少返回的数据量。这是最常见的,因为您为每个返回数据的查询执行此操作。

添加索引。这种做法并不常见,因为有些表不需要任何其他索引而不是为主键创建的索引。

答案 1 :(得分:29)

我最喜欢的tips (explained in detail here)列表如下

  1. 尝试使用WHERE子句限制查询结果集。
  2. 尝试通过仅返回表中的特定列而不是所有表的列来限制查询结果集。
  3. 使用视图和存储过程而不是重载查询。
  4. 尽可能尝试避免使用SQL Server游标。
  5. 如果需要返回总表的行数,可以使用替代方法而不是SELECT COUNT(*)语句。
  6. 尽可能尝试使用约束而不是触发器。
  7. 使用表变量而不是临时表。
  8. 尽可能避免使用HAVING子句。
  9. 尽可能避免使用DISTINCT子句。
  10. 在您的存储过程中包含SET NOCOUNT ON语句,以停止指示受T-SQL语句影响的行数的消息。
  11. 如果只需要返回前n行,则使用带有TOP关键字或SET ROWCOUNT语句的select语句。
  12. 如果您需要快速返回'number_rows'行,请使用FAST number_rows表提示。
  13. 尽可能尝试使用UNION ALL语句而不是UNION。
  14. 不要在查询中使用优化程序提示。

答案 2 :(得分:8)

远远超过:制作覆盖索引

覆盖索引包括查询所需的所有列,从而避免需要对索引查找的结果进行查找。这将避免系统感觉扫描速度更快(考虑到查找成本,这种速度非常快)。

但也值得一提:

拥有允许合并连接的索引。在连接由连接条件排序的两个表时,可以发生MERGE连接。但当然,在说'表'时,我们的意思是'索引',对吧......

此外 - 删除标量函数并使用表值函数......因为标量函数无法简化。

此外 - 在您知道唯一的列上放置唯一索引,允许查询优化器使用此知识进行更好的优化选择。也适用于NOT NULL约束。

此外 - 在比较已知情况下的字符串时使用二进制排序规则,以便系统不必考虑不同的大小写选项。

当然,我可以一整天......

罗布

答案 3 :(得分:6)

缓存db输出。完全避免对数据库施加压力似乎是一种谨慎的优化。

+1 memcached。

答案 4 :(得分:3)

  
    
      
        
          
            
              
                
                  
                    
                      
                        
                          
                            
                              

索引外键!

                            
                          
                        
                      
                    
                  
                
              
            
          
        
      
    
  

也许这不是sql查询语法优化,而是更多的存储优化。但我发现它一直在重复发生。这是一个小小的烦恼。

答案 5 :(得分:2)

我使用SQL进行的最佳优化是真正了解需要完成数据的工作以及从查询中删除大量SQL。

最快的查询是不必运行的查询。

真正想到你对数据做了什么。你一行一行吗? (然后使用基于集合的代码)。

  • 你真的需要加入所有这些牌桌吗?

  • 两个小(简单)查询可以比单个大型查询更好,更快地完成工作吗?

  • 如果将这两个查询合并为一个查询,它可以更快地运行吗?

最后,查询您的查询(EXPLAIN PLAN或SQL PROFILER)并查看“IO gets”。通常,您希望将GET的数量减少到每个输出行10次获得的比率。

答案 6 :(得分:2)

1)我还没有找到

的情况
SELECT Field1, Field2, (SELECT Count(*) FROM tblLinked WHERE tblLinked.Field3 = tblSource.Field3) AS TheTotal
FROM tblSource
通过LEFT JOIN到派生表没有改进

SELECT Field1, Field2, IsNull(Linked.TheTotal,0) AS TheTotal
FROM tblSource
LEFT JOIN (SELECT Field3, Count(*) AS TheTotal
    FROM tblLinked
    GROUP BY Field3) AS Linked ON tblSource.Field3 = Linked.Field3

2)不要在服务器上对结果进行排序,除非消费应用程序本身无法执行此操作。这对网络应用程序的应用较少,但对于桌面应用程序,客户端PC通常具有足够的可用功能,并且可以愉快地进行排序。

3)使用EXISTS而不是检查匹配条目的计数。

4)不要仅仅在一个SELECT子句中进行查询。明智地使用表变量(有时是临时表)可以大量减少处理的行。

答案 7 :(得分:1)

降低事务隔离级别以绕过用户查询的表锁。并不是所有的时间,但是对于gui展示一般信息它很有效。

答案 8 :(得分:1)

我已阅读所有答案,但未找到LIMIT和OFFSET使用提示。它在“prev”和“next”链接的分页中非常常见。但渲染这样的显示器可能比整个站点的其余部分消耗更多的资源。在抵消大量项目时,查询可能会变得非常慢。所以请避免这些查询。

  • 不计算总项目数。
  • 仅显示“n”个第一项(例如仅限前100名)。

此类方法使用Google,Twitter和其他网站。在Google搜索中,没有准确数量的结果。只有近似数字。 Twitter不允许用户查看过去的所有推文。它只显示最后一个数字(我记不清多少)。

有一些link from MySQL performance blog

答案 9 :(得分:1)

我最近使用的最大优化非常简单。

保持尽可能多的业务逻辑尽可能接近sql server。 Aka将业务代码保存在与sql server相同的机器上。让您的业务逻辑尽可能少地返回到最终客户端。

保持你的SQL查询尽可能“尽可能短”,如Frost所说,在多个语句中使用单个更新语句。

仅在需要时使用交易

为部分连接创建临时表以加速连接(别忘了索引它们)

答案 10 :(得分:1)

根据我的经验,两个最重要的事情是连接更少,查询更少。除了那些有很多特定于数据库的东西之外,COUNT(*)在PgSQL上相对较慢,在MySQL上子选择是狗慢等等。

答案 11 :(得分:1)

确保以正确的顺序加入表格。

答案 12 :(得分:1)

如果你说的很普通,那么索引就是第一个出现在我头脑中的东西。

它们是一种强大的技术,经常被误解并经常被滥用。

然后我会进行去规范化,这可以为许多数据库增加相当多的性能。

查询优化是第三位,它也有很大帮助。我最近使用MySQL,查询记录有助于优化。

Memcached绝对不常见,但某种缓存是脚本端(ASP.Net或PHP)许多网站的一部分。

答案 13 :(得分:0)

一些提示: 使用

delete from table where id>=1 and id<=3;

而不是

delete from table where id=1;
delete from table where id=2;
delete from table where id=3;

也使用'IN'代替'OR'语法

答案 14 :(得分:0)

  1. 为其最常见的优化建立索引
  2. 对表格进行规范化。
  3. 删除约束(仅当您知道自己在做什么时)

答案 15 :(得分:0)

避免在视图中使用诸如convertdate,stringreplace等板载函数。 如果无法确保数据格式有效,请使用运行的存储过程 规范“清理”相关表格中的数据。

这很讨厌,但它节省了观看时间,即让用户满意...... ^^

答案 16 :(得分:0)

如果不需要,不要放置约束,因为约束会添加索引,索引数量越多,数据插入所需的时间就越多。