我有98W行数据。当我想用pub_time对我的数据进行排序时,我找到了一个兴趣。

这是sql:

select * 
from t_p_blog_article_info t  
order by t.pub_time desc
.

它的成本19s。

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.2s。

我想知道,为什么?

有帮助吗?

解决方案

您可能在您的桌子上有一个索引。

因此,第二个查询可以使用此索引仅在指定日期后返回具有非空日期的记录,而第一个查询必须查询整个表。

其他提示

有一系列可能性。您可以在PUB_Time中过滤出大量的行,但在PUB_Time中,我怀疑您未能注意到/提及其中大量的数量。

在我脑海中伸出的三件事是:

1 - 您有一个涉及pub_time的索引或综合索引,并且您的Where子句中的限制正在触发使用不同的访问路径

2 - 当您运行第一个查询时,您没有可用的统计信息。运行第二个查询时,选择了更好的访问路径,谢谢您在您运行第一个查询时发生的一些信息缓存。这可以通过运行第一个查询几次来验证,并查看是否有显着性能改进。

3 - 类似于第一个点,优化器只能选择更好的访问路径,仅基于Where子句的含义。也许给出了不必处理空/无效值的提示就足够了 - 您的系统可以避免一个或多个完整表扫描到杂草无效/ null pub_times。

确定这样的原因很快成为一个实证的创业 - 我很难在不知道你的平台和版本的情况下说更多。从标签中,我认为您使用的是Oracle,在这种情况下,您应该能够使用某种形式的“解释查询”或“解释计划”工具来获得更好的对待发生的事情。有关Oracle Optimizer的更多信息,请参阅 http://docs.oracle .com / cd / b10500_01 / server.920 / a96533 / Optimops.htm (这适用于Oracle 9i v9.2,但它的版本独立概念有一个不错的解释)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top