暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在具有20亿行的非常大的表上查询执行

ASKTOM 2020-07-20
520

问题描述

我正在oracle 12C上执行以下查询。

从TAB_1中选择col1,col2,col3,其中col1 =:subId和col5 =?和col6 =?
联盟全部
从TAB_2中选择col1,col2,col3,其中col1 =:subId和col5 =?和col6 =?
2,3订购

表TAB_1包含大约15亿行,并在适当的列上进行分区。
表TAB_2包含20亿行,并且它也在适当的列上进行分区。

Oracle在几秒钟内执行此SQL,并获取大约500-1000万行。

现在的问题是,
1) 当oracle说sql在10秒内执行时,这是否意味着oracle已经找到了预期的500-1000万行,按预期的顺序排序并准备了一些数据结构,以使用最终用户的结果集进行提取?如果不是这种情况,那么它是如何工作的?
2) oracle将这些提取的结果保存在哪里 (在内存中或磁盘上)?


专家解答

这里有几件值得考虑的事情

-如果我们可以避免排序,那么我们不需要 * 存储 * 任何结果-我们可以阅读它并将结果发送回给您。即使使用ORDER BY,如果索引等可以以正确的顺序提供信息,有时优化器也可以避免排序。在执行计划中查找 “排序顺序”,以查看是否正在排序

-如果我们确实需要排序 (这是 * 可能 *,但在您的情况下不能保证),那么结果需要保留在某个地方,以便我们可以将它们发送回调用接口。这将是PGA (内存),如果你超过你的会话允许,它将被转储到临时存储 (你的临时表空间)。我们会自动处理这一切。

-然后,我们开始按照 * 客户端 * 的要求退还您的行。例如,在SQL Developer中,我们为您提供行的第一页大小 (通常为50),然后停止并等待您向下点击页面。这不是查询的总经过时间,而是只给您前50行所花费的时间。这就是为什么我们经常被问到 “为什么它在SQL Dev快,在我的应用程序慢?”如果它回到某些应用程序代码,则该应用程序很可能会获取所有这些代码,而不仅仅是前50个。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论