Oracle查询指定索引提高查询效率

Oracle查询指定索引提高查询效率

一个1600万数据表--短信上行表TBL_SMS_MO
结构:
CREATE TABLE TBL_SMS_MO
(
 SMS_ID NUMBER,
 MO_ID VARCHAR2(50),
 MOBILE VARCHAR2(11),
 SPNUMBER VARCHAR2(20),
 MESSAGE VARCHAR2(150),
 TRADE_CODE VARCHAR2(20),
 LINK_ID VARCHAR2(50),
 GATEWAY_ID NUMBER,
 GATEWAY_PORT NUMBER,
 MO_TIME DATE DEFAULT SYSDATE
);
CREATE INDEX IDX_MO_DATE ON TBL_SMS_MO (MO_TIME)
  PCTFREE 10
  INITRANS 2
  MAXTRANS 255
  STORAGE
  (
    INITIAL 1M
    NEXT 1M
    MINEXTENTS 1
    MAXEXTENTS UNLIMITED
    PCTINCREASE 0
  );
CREATE INDEX IDX_MO_MOBILE ON TBL_SMS_MO (MOBILE)
  PCTFREE 10
  INITRANS 2
  MAXTRANS 255
  STORAGE
  (
    INITIAL 64K
    NEXT 1M
    MINEXTENTS 1
    MAXEXTENTS UNLIMITED
    PCTINCREASE 0
  );

问题:从表中查询某时间段内某手机发送的短消息,如下SQL语句:

SELECT MOBILE,MESSAGE,TRADE_CODE,MO_TIME
FROM TBL_SMS_MO
WHERE MOBILE='130XXXXXXXX'
AND MO_TIME BETWEEN TO_DATE('2006-04-01','YYYY-MM-DD HH24:MI:SS') AND TO_DATE('2006-04-07','YYYY-MM-DD HH24:MI:SS')

ORDER BY MO_TIME DESC

返回结果大约需要10分钟,应用于网页查询,简直难以忍受。

 

分析:

在PL/SQL Developer,点击“Explain Plan”按钮(或F5键),对SQL进行分析,发现缺省使用的索引是IDX_MO_DATE。问题可能出在这里,因为相对于总数量1600万数据来说,都mobile的数据是很少的,如果使用IDX_MO_MOBILE比较容易锁定数据。

 

如下优化:

SELECT /*+ index(TBL_SMS_MO IDX_MO_MOBILE) */ MOBILE,MESSAGE,TRADE_CODE,MO_TIME
FROM TBL_SMS_MO
WHERE MOBILE='130XXXXXXXX'
AND MO_TIME BETWEEN TO_DATE('2006-04-01','YYYY-MM-DD HH24:MI:SS') AND TO_DATE('2006-04-07','YYYY-MM-DD HH24:MI:SS')

ORDER BY MO_TIME DESC

测试:

按F8运行这个SQL,哇~... ... 2.360s,这就是差别。

时间: 2024-07-31 05:03:43

Oracle查询指定索引提高查询效率的相关文章

如何使用索引提高查询速度_Mysql

使用索引提高查询速度1.前言在web开发中,页面模板,业务逻辑(包括缓存.连接池)和数据库这三个部分,数据库在其中负责执行SQL查询并返回查询结果,是影响网站速度最重要的性能瓶颈.本文主要针对MySql数据库,双十一的电商大战,引发了淘宝技术热议,而淘宝现在去IOE(I代表IBM的缩写,即去IBM的存储设备和小型机;O是代表Oracle的缩写,也即去Oracle数据库,采用MySQL和Hadoop替代的解决方案,;E是代表EMC2,即去EMC2的设备性,用PC Server替代EMC2),大量采

利用Oracle执行计划机制提高查询性能

oracle|性能|执行 消耗在准备利用Oracle执行计划机制提高查询性能新的SQL语句的时间是Oracle SQL语句执行时间的最重要的组成部分.但是通过理解Oracle内部产生执行计划的机制,你能够控制Oracle花费在评估连接顺序的时间数量,并且能在大体上提高查询性能. 准备执行SQL语句 当SQL语句进入Oracle的库缓存后,在该语句准备执行之前,将执行下列步骤: 1) 语法检查:检查SQL语句拼写是否正确和词序. 2) 语义分析:核实所有的与数据字典不一致的表和列的名字. 3) 轮

mysql使用crc32字段建索引提高查询效率

之前也写过这样的一篇文章,再来一篇. 给字符串类型的字段建立索引效率不高,但是必须要经常查这个字段怎么建索引?比如这个字段名称是sys_trans_id字符串类型,那么可以建一个字段sys_trans_id_src32来存储crc32的值,并给这个字段建立索引. crc32是整形,在MySQL中,给整形字段建立索引效率比较高,crc32虽然不能确保唯一性,但是无碍,相同的机率也是极小,关键是可以大大减少查询的范围,给sys_trans_id_src32这个字段建立索引,查询的时候带上crc32字

SQL Server-聚焦过滤索引提高查询性能(十)

前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to review the basics. 过滤索引,在查询条件上创建非聚集索引(1) 过滤索引是SQL 2008的新特性,被应用在表中的部分行,所以利用过滤索引能够提高查询,相对于全表扫描它能减少索引维护和索引存储的成本.当我们在索引上应用WHERE条件时就是过滤索引.也就是满足如下格式: CREATE NONC

采用 部分索引、表达式索引 提高搜索效率

标签 PostgreSQL , partial index , 部分索引 , 表达式索引 , 复合索引 , gist_btree混合索引 , 空间索引 背景 在现实场景中,经常有搜索的需求,例如搜索附近的店铺,搜索通常会有一些搜索的附带条件,例如搜索附近的美食类店铺,加油站等. 这里实际上涉及两类搜索需求,一类是距离,一类是属性. 如果将属性枚举掉,那么搜索时可以变成只按距离搜索.建立空间索引即可. 而如果属性无法枚举,那么需要同时搜索空间和属性,可以建立 "空间+属性" 的"

Oracle 创建监控账户 提高工作效率_oracle

为了把事情变成简单化,我在多个Oracle数据上建立统一的检查数据库账户,并且账户只能访问特定的几个视图(需要查询的sql已生成视图),具体做法如下: root>sqlplus / as sysdba 用DBA的权限进入数据库,需要创建一个账户 http://www.jb51.net/article/20367.htm SQL>create user dbmonitor identified by "ty_sd_s"; 给账户授权 SQL>grant connect,

怎么在多表查询中建立索引,实现效率的提高,谢谢。

问题描述 怎么在多表查询中建立索引,实现效率的提高,谢谢. select s.id,s.name,p.price,m.name as clientname,m.register_address,z.img_source from cl_product_i18n s,cl_product n,t_mdm_client m, cl_category_product_rel t,pr_price p,cl_product_address d,cl_product_image z where s.id=

使用查询改写提高查询性能

性能 无需改变SQL查询就可以大幅提高查询性能. 你是否为等待你的查询返回结果而感到疲惫?你是否已经为增强索引和调优SQL而感到疲惫,但仍然不能提高查询性能?那么,你是否已经考虑创建物化视图?有了物化视图,那些过去需要数小时运行的报告可以在几分钟内完成.物化视图可以包括联接(join)和集合(aggregate),它提供了一种储存预计算结果的方法. 在执行一个查询时,优化器会判定访问物化视图或数据驻留的基础表是否更快一些.如果优化器判定查询物化视图是更好的解决方案,那么优化器会在一个被称为"查询

winform-求解决方案:oracle in 内部有几千条记录,如何提高查询效率

问题描述 求解决方案:oracle in 内部有几千条记录,如何提高查询效率 有一个winform程序 一个只有一列的datagridview,是几千条(也有可能是几万条)身份证号记录(此数据是从excel导入的) 数据库中有10多万条客户信息(如姓名.身份证.联系方式等) 然后我想实现的功能是,根据datagridview内的身份证数据,从数据中查出该身份证对应的相关信息,并在另一个datagridview中展现出来. 我现在使用的方法是 select * where sfzh in (),的