【问题标题】:Query database table in Oracle on columns that are not indexed在没有索引的列上查询 Oracle 中的数据库表
【发布时间】:2015-09-09 23:00:30
【问题描述】:

Oracle 中有一个包含大量行的数据库表。当查询一行时,使用两个非索引列。查询可能需要大约 30 秒才能返回。

用户发送数据对列表,因此查询将使用第一对数据,将其插入查询并执行。要遍历所有数据,完成的时间相当长。

示例:如果有 20 个数据对,则完成时间将为 20 个数据对*30 秒 = 600 秒。

谁能推荐一种可以减少完成查询时间的方法?如果可能,请发布一个示例 SQL。

谢谢

【问题讨论】:

  • 在这些列上添加索引以避免重复的全表扫描。没有别的事可做。
  • 谢谢。但是我们不拥有这些表,也不允许修改它。
  • 在不查看查询(和表/索引定义)的情况下调整查询有点类似于通过电话进行手术,所以如果 @Wolf 做的切口不顺利,您可能还想尝试一次“插入”(无论这意味着什么)“数据对列表”,而不是一个一个地“插入”它们。
  • @mustaccio 我知道并且我同意。想象一个简单的查询,它说 where firstname=?和姓氏=?这可能需要 30 秒才能返回
  • 我什至可以想象这样的查询永远不会返回,但恐怕这可能无法帮助您解决问题。

标签: sql oracle


【解决方案1】:

您可以通过仅发出一个查询来获得与 20 对中的任何一个匹配的所有行来显着减少时间。

这样,您只需扫描表一次而不是 20 次。

我猜想结合 20 个条件的查询将需要 30 秒,与每个单独的查询相同。

例如,您可以创建一个临时表:

CREATE GLOBAL TEMPORARY TABLE temp_pairs
(
field1 int,
field2 int
)
ON COMMIT DELETE ROWS;

然后插入你收到的对:

insert into temp_pairs values (1,2);
insert into temp_pairs values (5,6);

然后使用 temp_pairs 使用内部联接查询原始表:

select t1.* from the_table t1
inner join temp_pairs t2
on t1.field1 = t2.field1
and t1.field2 = t2.field2;

【讨论】:

  • 您可以发布一个小例子吗?例如,假设数据 pars 以 [A,1] [B,2] [C,3] 的形式出现,那么如何编写查询以使行仅包含提到的对?
  • 我添加了一个简单的例子。
  • 酷,谢谢。这个查询似乎需要一个临时表(temp_pairs),对吗?
  • 这非常有效。从平均 23 秒检索单行到检索 300 行大约需要 80 秒。再次感谢您。
  • 很高兴听到它有帮助:)
【解决方案2】:

使用expression list

select *
from table1
where (a, b) in ((1, 2), (3, 4) /*add more pairs here if necessary*/)

这比临时表方法快,因为不需要插入数据。但它可能需要在前端添加更多代码,以根据表达式的数量构建不同的查询。

【讨论】:

  • 感谢您提供此解决方案。目前正在测试所有方法并测量时间。
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 2014-05-30
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多