首页 新闻 会员 周边 捐助

Oracle语句性能

0
悬赏园豆:5 [已解决问题] 解决于 2013-11-07 11:17

有个小问题,下面这三个语句的性能第三个是最快的,我想问一下为什么呀?最好能详细说一下三个的区别,(PARTITION_DATE这一列上有索引,没有索引两种情况请分别说一下),谢谢啦!

SELECT *
FROM ATP_RESERVATION
WHERE (SYSDATE - (PARTITION_DATE + 1 / 3)) > 2
AND RESERVE_STATUS = 'RS';

SELECT *
FROM ATP_RESERVATION
WHERE 2 < (SYSDATE - (PARTITION_DATE + 1 / 3))
AND RESERVE_STATUS = 'RS';

SELECT *
FROM ATP_RESERVATION
WHERE PARTITION_DATE < (SYSDATE - 2 - 1 / 3)
AND RESERVE_STATUS = 'RS';

顾问程程的主页 顾问程程 | 初学一级 | 园豆:197
提问于:2013-11-06 18:23
< >
分享
最佳答案
0

前面两组我想效率应该是一样的,都是对PARTITION_DATE进行了计算,而且也没有走索引,因为要把所有的数据都计算一次,

最后一组效率之所以那么高,我想主要是索引起做用了(如果没有索引应该也是第三组要快),因为并没有把PARTITION_DATE做计算,而是当做了条件,去匹配 后面计算出来的结果

收获园豆:5
Zery | 大侠五级 |园豆:6151 | 2013-11-06 23:09

DECLARE
G_START NUMBER;
G_END NUMBER;
V_LINE NUMBER;

BEGIN
G_START := DBMS_UTILITY.GET_TIME;
-- 要执行的语句0;
SELECT COUNT(*)
INTO V_LINE
FROM PRODUCT_PRICE_LOG PPL
WHERE SYSDATE < (PPL.GMT_CREATION + 1);
G_END := DBMS_UTILITY.GET_TIME - G_START;
DBMS_OUTPUT.PUT_LINE('数据参与运算(右):' || G_END);

G_START := DBMS_UTILITY.GET_TIME;
-- 要执行的语句1;
SELECT COUNT(*)
INTO V_LINE
FROM PRODUCT_PRICE_LOG PPL
WHERE (PPL.GMT_CREATION + 1) > SYSDATE;
G_END := DBMS_UTILITY.GET_TIME - G_START;
DBMS_OUTPUT.PUT_LINE('数据参与运算(左):' || G_END);

G_START := DBMS_UTILITY.GET_TIME;
-- 要执行的语句2;
SELECT COUNT(*)
INTO V_LINE
FROM PRODUCT_PRICE_LOG PPL
WHERE (SYSDATE - 1) < PPL.GMT_CREATION;
G_END := DBMS_UTILITY.GET_TIME - G_START;
DBMS_OUTPUT.PUT_LINE('数据不参与运算(右):' || G_END);

G_START := DBMS_UTILITY.GET_TIME;
-- 要执行的语句3;
SELECT COUNT(*)
INTO V_LINE
FROM PRODUCT_PRICE_LOG PPL
WHERE PPL.GMT_CREATION > (SYSDATE - 1);
G_END := DBMS_UTILITY.GET_TIME - G_START;
DBMS_OUTPUT.PUT_LINE('数据不参与运算(左):' || G_END);

END;

 

在200万条数据,没有索引的条件下,运行结果如下,谢谢啦!

数据参与运算(右):1517
数据参与运算(左):1486
数据不参与运算(右):608
数据不参与运算(左):609

顾问程程 | 园豆:197 (初学一级) | 2013-11-07 11:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册