同一条sql不同的过滤条件,查询耗时差别很大:
(1) 过滤条件: Fa.Creation_Date >= To_Date('01-06-2011', 'DD-MM-YYYY'),耗时34.211秒
SELECT count(*) FROM
Fa_Books Fb,
Fa_Additions_b Fa
WHERE Fb.Asset_Id = Fa.Asset_Id
AND trunc(Fa.Creation_Date) >= To_Date('01-06-2011', 'DD-MM-YYYY') (2) 过滤条件: Fa.Creation_Date >= To_Date('01-06-2010', 'DD-MM-YYYY'),耗时0.047秒
SELECT count(*) FROM
Fa_Books Fb,
Fa_Additions_b Fa
WHERE Fb.Asset_Id = Fa.Asset_Id
AND trunc(Fa.Creation_Date) >= To_Date('01-06-2010', 'DD-MM-YYYY') 确实不知道原因啊,第2条sql查询的数据更多,为什么会更快呢? 可能会有哪些原因?
(1) 过滤条件: Fa.Creation_Date >= To_Date('01-06-2011', 'DD-MM-YYYY'),耗时34.211秒
SELECT count(*) FROM
Fa_Books Fb,
Fa_Additions_b Fa
WHERE Fb.Asset_Id = Fa.Asset_Id
AND trunc(Fa.Creation_Date) >= To_Date('01-06-2011', 'DD-MM-YYYY') (2) 过滤条件: Fa.Creation_Date >= To_Date('01-06-2010', 'DD-MM-YYYY'),耗时0.047秒
SELECT count(*) FROM
Fa_Books Fb,
Fa_Additions_b Fa
WHERE Fb.Asset_Id = Fa.Asset_Id
AND trunc(Fa.Creation_Date) >= To_Date('01-06-2010', 'DD-MM-YYYY') 确实不知道原因啊,第2条sql查询的数据更多,为什么会更快呢? 可能会有哪些原因?
因为在Creation_Date字段上使用函数将会导致索引无效:Fa.Creation_Date >= To_Date('01-06-2010', 'DD-MM-YYYY')
plsql developer工具中F5,也可以用explain语句
应该是:
(1) 过滤条件: Fa.Creation_Date >= To_Date('01-06-2011', 'DD-MM-YYYY'),耗时34.211秒
SELECT count(*) FROM
Fa_Books Fb,
Fa_Additions_b Fa
WHERE Fb.Asset_Id = Fa.Asset_Id
AND Fa.Creation_Date >= To_Date('01-06-2011', 'DD-MM-YYYY') (2) 过滤条件: Fa.Creation_Date >= To_Date('01-06-2010', 'DD-MM-YYYY'),耗时0.047秒
SELECT count(*) FROM
Fa_Books Fb,
Fa_Additions_b Fa
WHERE Fb.Asset_Id = Fa.Asset_Id
AND Fa.Creation_Date >= To_Date('01-06-2010', 'DD-MM-YYYY')
--按照下面的方法再测测,怀疑是缓存引起的第二次的查询速度变快。
--清空缓存
alter system flush BUFFER_CACHE;
alter system flush SHARE_POOL;--执行第一个sql语句,关注时间--清空缓存
alter system flush BUFFER_CACHE;
alter system flush SHARE_POOL;--执行第二个sql语句关注时间
两个查询唯一的区别是:一个条件是2011-6-1,另一个是2010-6-1。
我看了一下记录,在2011-6有几千条记录,但在2010-6没有记录。
因为使用的是fa.creation_date>=to_date('01-06-2010','DD-MM-YYYY'),查询的时候需要比较时分秒,所以使用2011-6-1的时间会比较久。