SQL基础系列(4)-性能优化建议

10.1 连接查询表的顺序问题

SQLSERVER的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表,当SQLSERVER处理多个表时,会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序;然后扫描第二个表(FROM子句中最后第二个表);最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并

如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表

10.2 Where条件的顺序问题

SQLSERVER采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾  

10.3 SELECT子句中避免使用’*’。

在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用’*’是一个方便的方法,不幸的是,这是一个非常低效的方法。实际上,SQLSERVER在解析的过程中,会将’*’依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间

10.4 减少查询次数

10.5 用Where子句替换HAVING子句

10.6减少对表的查询

10.7用EXISTS替代IN

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接,在这种情况下,使用EXISTS(或NOT EXISTS)通常将提高查询的效率

低效

   SELECT *

   FROM dbo.Orders

   WHERE Id_P>0 AND Id_P  IN (SELECT id

   FROM dbo.Persons

   )

  

高效

   SELECT *

   FROM Orders

   WHERE Id_P >0 AND  EXISTS (SELECT id

   FROM Persons   WHERE Persons.id = Orders.Id_P

  )

10.8用NOT EXISTS替代NOT IN

在子查询中,NOT IN子句将执行一个内部的排序和合并,无论在哪种情况下,NOT IN都是最低效的,因为它对子查询中的表执行了一个全表遍历 ,为了避免使用NOT IN,可以把它改写成外连接(Outer Joins)或NOT EXISTS

低效

   SELECT *

   FROM dbo.Orders

   WHERE Id_P>0 AND Id_P not IN (SELECT id

   FROM dbo.Persons

   )

  

高效

   SELECT *

   FROM Orders

   WHERE Id_P >0 AND not EXISTS (SELECT id

   FROM Persons   WHERE Persons.id = Orders.Id_P

  )

10.9用表连接替换EXISTS

10.10用EXISTS替换DISTINCT

低效

  SELECT DISTINCT Id_P

   FROM Orders , Persons

   WHERE Orders.Id_P = Persons.id

  

   高效

  SELECT Id_P

   FROM Orders

   WHERE EXISTS (SELECT id

   FROM Persons

   WHERE Persons.id = Orders.Id_P);

10.11用索引提高效率  

不要在索引上使用模糊查询

不要在索引列上进行计算

索引列不要加is null或is not null

10.12使用union allunion

本文内容为学习

http://www.cnblogs.com/zhougb/archive/2009/05/05/1449708.html而来

若涉嫌侵犯您的权益,请及时联系本人

时间: 2024-10-05 04:40:47

SQL基础系列(4)-性能优化建议的相关文章

性能优化建议

性能优化建议 1.为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了. 这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的.因为,我们某些查询语句会让MySQL不使用缓存.请看下面的示例: // 查询缓存不开启 $r = mysql_query("SELECT username F

雅虎35条性能优化建议

雅虎35条性能优化建议分7类,共35条: [内容]尽量减少HTTP请求数 [服务器]使用CDN(Content Delivery Network) [服务器]添上Expires或者Cache-Control HTTP头 [服务器]Gzip组件 [css]把样式表放在顶部 [js]把脚本放在底部 [css]避免使用CSS表达式 [js, css]把JavaScript和CSS放到外面 [内容]减少DNS查找 [js, css]压缩JavaScript和CSS [内容]避免重定向 [js]去除重复脚

Jquery学习--性能优化建议

一.选择器性能优化建议 1. 总是从#id选择器来继承 这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了. 1 $('#content').hide(); 或者从ID选择器继承来选择多个元素: 1 $('#content p').hide(); 2. 在class前面使用tag jQuery中第二快的选择器就是tag选择器(如$(‘head’)),因为它和直接来自于原生的Javascript方法getElementByTagName().所以最好总是用t

Yahoo! 35条网站性能优化建议

Yahoo! 35条网站性能优化建议 分类: 网站性能优化2014-03-08 17:18 212人阅读 评论(0) 收藏 举报 网站性能优化 Yahoo!的 Exceptional Performance团队为改善 Web性能带来最佳实践.他们为此进行了一系列的实验.开发了各种工具.写了大量的文章和博客并在各种会议上参与探讨.最佳实践的核心就是旨在提高网站性能.原版猛戳:Best Practices for Speeding Up Your Web Site, Excetional Perfo

PLSQL性能优化建议

了解PLSQL程序性能 影响性能常见原因 1.尽量使用存储过程,避免使用PL/SQL匿名块 存储过程创建后,oracle会对其进行语法句法分析,以编译的形式存储在数据库中,当客户端调用时,只需要发送一条调用指令,避免了匿名块在网上传送大量源代码,降低了网络通信的负担,同时因为仅在创建时编译一次,因此提升了程序运行的性能. 2.编写共享SQL语句 oracle在执行SQL语句时,在第一次解析后,会将SQL语句放在位于系统全局区SGA中的共享池中,这块内存区域可以被所有的数据库用户共享,因此在执行一

SQL自动审核-给出优化建议

sql_review 为方便dba和开发审核sql,特增加了规则,只需在网页里输入sql语句,会自动给出优化建议.参考的percona在线sql审核思路实现. php环境搭建:yum install httpd php 演示地址:http://106.75.10.36/ 使用说明: 1.我只对select和create加了规则,update/delete/alter属于危险语句,仍旧需要人工审核. 2.语句之间要有空格,例where id = 100,没有空格会影响判断的准确性. GitHub源

Android官方开发文档Training系列课程中文版:性能优化建议

原文地址:http://android.xsoftlab.net/training/articles/perf-tips.html 本篇文章主要介绍那些可以提升整体性能的微小优化点.它与那些能突然改观性能效果的优化手段并不属于同一类.选择正确的算法与数据结构必然是我们的第一总则,但是这不是我们这篇文章要介绍的.你应该将这篇文章所提及的知识点作为编码的日常习惯,这可以提升常规代码的执行效率. 下面是书写代码的基本准则: 绝不要做你不需要的工作. 如果可以不申请内存就不要申请,要合理复用已有的对象.

【测试】通过SYS用户,对SCOTT用户的会话进行跟踪,并分析此会话中性能消耗较高的SQL,分析并给出优化建议。

①连接到scott下,查询scott对应的sid,serial# SQL> select sid,serial#,username from v$session where username='SCOTT'; SID SERIAL# USERNAME ---------- ---------- ------------------------------ 133 15 SCOTT ②开启对scott用户的跟踪: SQL>exec dbms_system.set_sql_trace_in_ses

iOS的性能优化建议

1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露.它自动为你管理retain和release的过程,所以你就不必去手动干预了.忘掉代码段结尾的release简直像记得吃饭一样简单.而ARC会自动在底层为你做这些工作.除了帮你避免内存泄露,ARC还可以帮你提高性能,它能保证释放掉不再需要的对象的内存.   2. 在正确的地方使用 reuseIdentifier