INDEX建立方式对SQL的影响

简介:
   我常常会听到一些同事对自己的SQL很有信心,往往说一句:“你看,已经走索引了”。但是我们真的使用了适合我们的索引吗?
        我抓取到一句SQL,消耗了太多的IO。
       
      
select SMIN_INFOID,NVL(MI.MONU_PROVINCE, '未知'), COUNT(*) I_RESULTNUM
FROM TBL_WAPXXX WARE,TBL_SMSXXX SMIN,TBL_MOBILEXXX MI,TBL_USERXXX USIN 
WHERE WARE_DATE > :B2  AND WARE_DATE <= :B2 + :B1 /24 
             AND WARE.WARE_UID_FK=USIN.USIN_UID_FK  AND SUBSTR(USIN.USIN_PHNUM,1,7)=MI.MONU_PHONENUM(+) 
             AND WARE_WRUIID_FK=SMIN.SMIN_INFOID  GROUP  BY SMIN_INFOID ,MI.MONU_PROVINCE

     因为TBL_WAPXXX数据量比较大,而造成该SQL执行缓慢并且IO消耗高。看看它的SQL执行计划和成本估算(如下图)



        注意画框INDEX(为TBL_WAPXXX的相关索引),虽然走了索引,但是成本和cardnility都很高。检查这个索引发现其实BLEVEL只有2。而再仔细查看SQL并询问实现的功能,其实索引的字段为DATE类型,该SQL只是检查最近几个小时的信息变化.
        在WHERE条件中(WARE_DATE > :B2)因为是范围查询,索引使用了(rang scan),加之该表数据量众多(千万级别),直接影响了SQL执行性能。
         但是通过检查发现,这个索引就是直接创建的B-TREE索引。而我注意到其实该SQL检查的就是最近一个或几个小时的数据,终于可以找到一些问题所在了。INDEX建立时默认情况下,索引的字段采用升序(asc)建立,而这种方法显然是不适合当前这个SQL的,我们可以通过建立基于降序的索引来适应实际的需求。
        
SQL>  create  index IDX_WARE_DATE1  on TBL_WAPXXXX(WARE_DATE  desc)
    2        tablespace USERTBS;
    
        再来检查执行的SQL计划和预算成本:



        执行成本大幅降低。INDEX的建立时索引字段排序的方式其实对特定SQL影响还是很大的。尤其是一些历史流水表,在某些情况下只是查询近期的数据时,就显得尤为重要了。
        注:文中的SQL因为某些问题,我做了适当的处理,在显示的执行计划图中也是处理过的,所以会出现表名不十分匹配的问题,请大家见谅。
        PS:

         最近总是很忙,忙的只有在睡觉前才有时间写点东西。但是实在太累,总是无法好好的写。真的要好好坚持坚持呀 -:),否则年初的目标就很难完成了。

本文转自Be the miracle!博客51CTO博客,原文链接http://blog.51cto.com/miracle/169244如需转载请自行联系原作者


Larry.Yue

相关文章
|
6月前
|
SQL 存储 弹性计算
GaussDB SQL调优:建立合适的索引
GaussDB SQL调优:建立合适的索引
54 0
|
4月前
|
SQL 数据库 索引
SQL CREATE INDEX 语句
【7月更文挑战第20天】SQL CREATE INDEX 语句。
33 1
|
5月前
|
SQL 数据库 索引
SQL CREATE INDEX 语句
SQL CREATE INDEX 语句
44 4
|
5月前
|
SQL 弹性计算 分布式计算
实时数仓 Hologres操作报错合集之在执行SQL查询时遇到了问题,报错原因是“Invalid index column id: 2”,该怎么处理
在使用阿里云实时数仓Hologres时,可能会遇到不同类型的错误。例如:1.内存超限错误、2.字符串缓冲区扩大错误、3.分区导入错误、4.外部表访问错误、5.服务未开通或权限问题、6.数据类型范围错误,下面是一些常见错误案例及可能的原因与解决策略的概览。
|
5月前
|
SQL 关系型数据库 MySQL
sql如何建立数据库
在SQL中,建立数据库通常涉及使用“CREATE DATABASE”语句。以下是一个基本的步骤指南,以及一个示例SQL命令,用于创建一个新的数据库。 ### 步骤指南 1. **确定数据库
|
6月前
|
SQL 存储 弹性计算
GaussDB SQL调优:建立合适的索引
GaussDB SQL调优:建立合适的索引
|
6月前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
664 0
|
6月前
|
SQL Oracle 关系型数据库
SQL CREATE INDEX 语句- 提高数据库检索效率的关键步骤
SQL CREATE INDEX 语句用于在表中创建索引。 索引用于比其他方式更快地从数据库中检索数据。用户无法看到索引,它们只是用于加速搜索/查询。 注意: 使用索引更新表比不使用索引更新表需要更多的时间(因为索引也需要更新)。因此,只在经常进行搜索的列上创建索引。
75 5
|
SQL 存储 安全
详解:驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server 建立安全连接。
详解:驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server 建立安全连接。
4395 0
java.sql.SQLException: Parameter index out of range (6 >
java.sql.SQLException: Parameter index out of range (6 >
154 0