SQL优化的原则是.docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
SQL优化的原则是:将一次操作需要读取的BLOCK数减到最低。 调整不良SQL通常可以从以下几点切入: 检查不良的SQL,考虑其写法是否还有可优化内容; 检查子查询考虑SQL子查询是否可以用简单连接的方式进行重新书写; 检查优化索引的使用; 考虑数据库的优化器; 查询的一般规则 ? 明确指出检索的字段,尽量减少对多余的列与多余的行读取。 禁止使用 select * from table ……的方式访问表。 ? 在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。 ? 查询时尽可能使用索引覆盖。即对SELECT的字段建立复合索引,这样查询时只进行索引扫描,不读取数据块。 ? 在判断有无符合条件的记录时不要用SELECT COUNT (*) 语句。 如: BF: select count(*) from table where condition 在MSSQL和Sybase中,使用 if exists (select 1 from table_name where condition)性能较好,在Oracle中,使用select 1 from table_name where condition较好。 ? 内层限定原则 在拼写SQL语句时,将查询条件分解、分类,并尽量在SQL语句的最里层进行限定,以减少数据的处理量。 应绝对避免在order by子句中使用表达式。    正确使用INDEX的SQL 如果和查询条件相关的column上有建index,以下几点能帮助SQL正确的使用index 。 ? 避免显式或隐含的类型转换。 where子句中存在数据类型隐形转换的,如用Numeric 型和 Int型的列的比较时,不能使用index。 ? WHERE子句中任何对列的操作都将无法使用index,它包括数据库函数、计算表达式等等,所以要尽量减少在=左边的列的运算。如: BF:select staff_no, staff_name from staff_member where salary*2 = 10000; RP:select staff_no, staff_name from staff_member where salary = 5000; ? WHERE子句中使用不等于()运算的,将无法使用index。可以用union all改写。如: BF:select staff_no, staff_name from staff_member where dept_no2001; RP:select staff_no, staff_name from staff_member where dept_no 2001 Union all select staff_no, staff_name from staff_member where dept_no 2001; Oralce中可以考虑使用函数索引。 ? WHERE子句中使用substr字符串函数的,将无法使用index,可以用like改写。如: BF:select staff_no, staff_name from staff_member where substr(last_name,1,4)=’FRED’; RP:select staff_no, staff_name from staff_member where last_name like ’FRED%’; ? WHERE子句中‘%’通配符在第一个字符的,将无法使用index。如: select staff_no, staff_name from staff_member where first_name like ‘%DON’; 这种情况的优化方式比较复杂,在后面有关index优化的内容中我们介绍一种在oracle中使用反向索引的优化方式。 ? LIKE语句后面不能跟变量,否则也不会使用索引。 where Prod_name like :v_name || % -- 不会使用索引 如果一定要使用变量,可以使用如下技巧: where Prod_name between :v_name and :v_name || chr(255) -- 会使用索引 ? WHERE子句中使用IS NULL和IS NOT NULL不会使用索引。好的设计习惯是表中尽量不使用允许为空的字段,可以根据业务逻辑,将字段设为NOT NULL的同时,提供一个DEFAULT值。另外,当表中建有索引的字段包含NULL时,索引的效率会降低。 ? WHE

文档评论(0)

精华文档888 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档