我有98w行数据。当我想用pub_time对数据进行排序时,我发现了一件有趣的事情。
这是SQL:
select *
from t_p_blog_article_info t
order by t.pub_time desc
花费19秒。
select *
from t_p_blog_article_info t
where t.pub_time > to_date( '1900-01-01 01:00:00', 'yyyy-mm-dd hh24:mi:ss ')
order by t.pub_time desc
花费0.2秒。
我想知道,为什么?
答案 0 :(得分:4)
你桌上的pub_time可能有一个索引。
因此,第二个查询可以使用此索引仅返回指定日期之后具有非空日期的记录,而第一个查询必须查询整个表。
答案 1 :(得分:0)
有各种各样的可能性。您可以在pub_time中过滤掉大量具有无效/空日期的行,但我怀疑您没有注意到/提及大量这些行。
我脑海里浮现的三件事是:
1 - 您有一个涉及pub_time的索引或复合索引,并且您的where子句中的限制触发了使用不同的访问路径
2 - 运行第一个查询时,您没有可用于优化程序的统计信息。运行第二个查询时,由于运行第一个查询时发生的一些信息缓存,因此选择了更好的访问路径。这可以通过多次运行第一个查询并查看是否有显着的性能改进来验证。
3 - 与第一点类似,优化器可能只是根据where子句的含义选择更好的访问路径。也许给出提示无需处理空值/无效值就足够了 - 您的系统可能会避免一个或多个全表扫描来清除无效/ null pub_times。
找出这样的事情的原因很快就会成为一种经验性的冒险 - 如果不了解你的平台和技术,我很难说出更多的信息。版。从标签我认为你正在使用oracle,在这种情况下你应该能够使用某种形式的“解释查询”或“解释计划”工具来更好地了解正在发生的事情。有关oracle优化器的更多信息,请参阅http://docs.oracle.com/cd/B10500_01/server.920/a96533/optimops.htm(这适用于Oracle 9i v9.2,但它对版本无关的概念有不错的解释)