博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1. 去除在谓词列上编写的任何标量函数
阅读量:4694 次
发布时间:2019-06-09

本文共 2035 字,大约阅读时间需要 6 分钟。

开发人员编写SQL代码时,为了确保得到更好的性能,需要采取一些措施,下面会列出其中最有效的一些做法。在关系型数据库管理系统(relational database management system,RDBMS)中,通常90%的运行时问题源于10%的应用问题。与以往相比,如今的DB2优化工具在选择正确的访问路径来满足SQL需求方面已经更胜一筹,不过仍不能保证百分之百正确。目前的所有调优工作都与CPU使用、I/O和并发直接关联。本章的大部分内容都会针对SQL编码,不过所有内容都与性能和调优有关。

本书中给出的技巧和提示是为开发人员提供的一般最佳实践,适用于大多数RDBMS。在这些数据库系统中,可能有一些基于成本的优化工具,它们会查看所有可用的选项,构建一个SQL查询集,并尽其所能给出最高效的访问路径。对于不同的优化工具,可用的选项可能或多或少,不过一般而言,本书中的技巧可以应用于任何数据库管理系统。

程序编写不当或者SQL语句编写不正确,这些通常就是导致性能低下的罪魁祸首。看起来学习和掌握SQL语言很容易,不过在性能方面,DB2优化工具处理SQL语言时存在很多低效问题。开发人员、测试人员、DBA和业务分析师等都能从本书中获益,因为本书特别针对如何编写合适的SQL来提高效率提供了很多技巧。

本书的重点是增强开发人员对调优方法的认识,更多地了解IBMDB2关系型数据库环境中如何改善性能和调优。本书条理清楚、通俗易懂,提供了大量开发技巧、建议和SQL编码示例,所有这些的最终目的都是为了得到更好的性能。

这里的SQL编码示例会用到一些DB2示例表,这些示例表在各个DB2网站中都能找到,另外在所有IBM DB2手册中都有提到。

导致应用、程序或查询性能低下最常见的原因是什么?

数据库设计不当

应用设计不当

SQL查询结构不合理

编目统计不当/不充分

系统类资源(如缓冲区池、RID池和记录日志)分配不当

以下是解决未能合理优化的一些方法:

用不同的方法重写查询

采用不同方式重写查询中的谓词

改变数据库对象的设计

改变数据库分区的设计

为已经存在的表增加一个分区策略

管理、修改或增强编目统计,以涵盖非标准统计

修改系统资源

要记住,DB2优化工具只能做到:

接受SQL查询

验证语法

确认DB2编目有效性

检查查询中对象的编目统计

对所有不同的访问路径计算成本

选择成本最低的访问路径

计算分区值,确定满足SQL数据请求所需的目标分区

作为开发人员,你应该掌握这个领域的大部分内容,这很重要,这样才能在分析性能问题时对调优有所认识。优化工具只能处理编目中的信息,另外只能处理如何建构和设计查询及程序。

一旦找出性能问题,解决这个问题的最佳方法是什么?如前所述,需要对很多方面进行分析,而且其中很多都由开发人员掌控。关于要查找什么以及要做些什么,作为开发人员我们了解得越多,我们在公司里的价值就越高,地位就越重要。

接下来会为开发人员提供100多个技巧,在对特定的查询或程序调优时,这些技巧可以帮助你正确地考虑和分析。最前面的20到25个技巧可能是最常用的,其余的技巧没有特定的顺序,不过关于DB2 V9和V10的技巧会放在最后介绍。

1. 去除在谓词列上编写的任何标量函数

肯定有办法重写谓词,使得谓词列上不再使用函数。要记住:在SQL语句的Select部分对列编写标量函数是完全可以的,不过如果在Where部分中对列使用函数,就会自动将谓词变成不可索引的谓词,并成为一个Stage 2谓词。例如:

 

  1. SELECT EMPNO, LASTNAME  
  2. FROM EMP  
  3. WHERE YEAR(HIREDATE ) = 2005 

应当写为:

 

  1. SELECT EMPNO, LASTNAME  
  2. FROM EMP  
  3. WHERE HIREDATE BETWEEN '2005-01-01' and '2005-12-31' 

如上所示重写这个语句之后,DB2可以选择使用列HIREDATE上的索引(如果存在这样一个索引)。但是如果在谓词中使用了YEAR函数,DB2就无法使用该列的索引了。

DB2 V9中,在列上创建索引时可以使用函数。V9称之为表达式索引(Index on Expression)。用函数和/或表达式创建这种表达式索引时,DB2会查看索引,如果它与SQL语句中的具体SQL函数和/或表达式匹配,就会使用这个索引。需要注意,即便如此,仍然要尽可能像上面那样重新编写查询。维护更多的索引可能成本很高,因为这样一来DBA需要管理的索引也会更多,而且它们会增加插入、删除和一些更新的成本。例如:

 

  1. CREATE INDEX XEMP4 ON  
  2. EMP (YEAR(HIREDATE ) )  
  3. USING STOGROUP ...  
  4. PRIQTY ... SECQTY ... 

转载于:https://www.cnblogs.com/xiaotu/p/3185511.html

你可能感兴趣的文章
Python------网络编程2
查看>>
第四章-开心餐厅
查看>>
void空类型指针
查看>>
P3388 【模板】割点(割顶)
查看>>
简单的排序算法:插入排序法
查看>>
湖南工业大学个人选拔赛第二场 解题报告
查看>>
linux中iptables配置文件及命令详解
查看>>
批量更新
查看>>
Vue学习记录(二)
查看>>
前端面试-难点问题2-java和javascript的区别
查看>>
Linux及Arm-Linux程序开发笔记(零基础入门篇)
查看>>
Redis集群创建报错
查看>>
DispacherServlet 的作用
查看>>
POJ - 1426(Find The Multiple)
查看>>
如何引用vue
查看>>
一张图带你看懂原始dao与SQL动态代理开发的区别-Mybatis
查看>>
最锋利的Visual Studio Web开发工具扩展:Web Essentials详解
查看>>
Python面试315题
查看>>
python中使用多继承
查看>>
HDU 3578 Greedy Tino(双塔DP)
查看>>