有个小问题,下面这三个语句的性能第三个是最快的,我想问一下为什么呀?最好能详细说一下三个的区别,(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';
前面两组我想效率应该是一样的,都是对PARTITION_DATE进行了计算,而且也没有走索引,因为要把所有的数据都计算一次,
最后一组效率之所以那么高,我想主要是索引起做用了(如果没有索引应该也是第三组要快),因为并没有把PARTITION_DATE做计算,而是当做了条件,去匹配 后面计算出来的结果
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