两个sql用于排序时间戳日期

我有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子句的含义选择更好的访问路径。 也许给暗示空值/无效值不需要处理就足够了 - 您的系统可能会避免一个或多个全表扫描来清除无效/空pub_times。

指出这样的事情的原因很快就会成为一种经验性的冒险 - 如果不知道自己的平台和版本,我很难说更多。 从标签中我可以看出你使用的是oracle,在这种情况下,你应该能够使用某种形式的“解释查询”或“解释计划”工具来更好地理解发生了什么。 有关Oracle优化器的更多信息,请参阅http://docs.oracle.com/cd/B10500_01/server.920/a96533/optimops.htm(这是针对Oracle 9i v9.2的,但它对版本有不错的解释独立的概念)

链接地址: http://www.djcxy.com/p/58213.html

上一篇: Two sql for Sorted timestamp date

下一篇: .NET and COM Interoperability : release COM from .NET client