Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 连接两个Oracle表,日期范围不重叠_Sql_Oracle_Oracle10g_Sql Optimization - Fatal编程技术网

Sql 连接两个Oracle表,日期范围不重叠

Sql 连接两个Oracle表,日期范围不重叠,sql,oracle,oracle10g,sql-optimization,Sql,Oracle,Oracle10g,Sql Optimization,我有两张桌子: 行程:id\u行程,id\u对象,行程日期,增量(8980026行) 范围:id\u范围、id\u对象、日期\u自、日期\u至(18490行) 我需要优化下面的select语句 根据条件,“范围”中的行程始终只有一个匹配行 trips表不断增长,但没有更新或删除 表范围可能随时以任何方式(删除、更新、插入)更改,因此基于函数的索引不是:( id_对象(在两个表中)和date_-since(在trips中)上都有索引 有人知道如何加快速度吗?有可能吗?您可能希望查看数据分

我有两张桌子:

  • 行程:id\u行程,id\u对象,行程日期,增量(8980026行)
  • 范围:id\u范围、id\u对象、日期\u自、日期\u至(18490行)
我需要优化下面的select语句

根据条件,“范围”中的行程始终只有一个匹配行

  • trips表不断增长,但没有更新或删除
  • 表范围可能随时以任何方式(删除、更新、插入)更改,因此基于函数的索引不是:(
  • id_对象(在两个表中)和date_-since(在trips中)上都有索引

有人知道如何加快速度吗?有可能吗?

您可能希望查看数据分段(即按特定日期对数据进行分区,导致查询只命中适当的分区)和索引,这些可能会加快查询过程


也可以考虑数据仓库……你说TRIPS永远不会被更新或删除,所以它是一个理想化的候选,它适合于一个更适合于报告生成和自组织查询的数据结构。

< p>它总是可以加速事情的发展;它可能不值得花费时间/精力/金钱/磁盘空间/额外开销。等等

首先,请使用显式连接语法。几十年来,它一直是SQL标准,有助于避免许多潜在错误。您的查询将变成:

select r.id_range, sum(t.delta) sum_deltas
  from trips t
  join ranges r
    on t.id_object = r.id_object
   and t.trip_date between r.date_since and r.date_until
 group by r.id_range
这个查询会暗示你需要两个索引——如果可能的话,你需要两个索引。在<代码>范围>代码>上,你应该有一个索引在代码> IDObjor,DATEYAY,DATEY~直到。索引> TRIPS >将是<代码> IDObjor,TRIPXDATE 。如果代码> TRIPS较小,我可以考虑添加<代码> Delta < /Cord>。索引,这样您就永远不会进入表,而只进行索引扫描。目前,您必须通过索引rowid进行表访问

写了所有这些之后,您的问题可能会略有不同。您将使用此查询完全扫描两个表。您的问题可能是索引。如果优化器正在使用索引,那么您可能正在对
trips
ranges
中的每个
id\u对象进行索引唯一/范围扫描,然后,b由于使用了不在索引中的列,您将通过索引rowid进行表访问。这可能会非常昂贵

尝试添加以强制对两个表进行完全扫描:

select /*+ full(t) full(r) */ r.id_range, sum(t.delta) sum_deltas
  from trips t
  join ranges r
    on t.id_object = r.id_object
   and t.trip_date between r.date_since and r.date_until
 group by r.id_range

嗨,本,你的帖子真的很有趣。我试图理解你的解释:你是说,在某些情况下,最好不要使用索引并强制进行完全扫描,因为有时会使用索引,但无论如何,之后需要rowid访问才能满足其他条件?我理解得很好吗?@Sebas你明白吗很好!我不知道在这种情况下是否会更快,因为我不知道满足连接条件的表的百分比是多少。但是,通常在大约10%的情况下,完全扫描比使用索引更快。太好了!谢谢。最后,是rowid本身的访问成本高还是索引的总和高rowid扫描的+表访问优于单个fullscan?@Sebas,我不知道:-)。稍微换个角度思考。如果对于8m行表中的每一行,您都可以在索引中找到所需的行。然后,使用rowid查找表中的行。所有这些,而不是仅仅抓住它。我并不是说这会更快,我在指数上的观点可能更相关,但这绝对值得一试。哦,我理解。当然,这取决于表和基础设施。谢谢你的解释。rgds。你能给我一些关于范围表的功能解释吗?它是什么?它填充了什么样的数据?
select /*+ full(t) full(r) */ r.id_range, sum(t.delta) sum_deltas
  from trips t
  join ranges r
    on t.id_object = r.id_object
   and t.trip_date between r.date_since and r.date_until
 group by r.id_range