【问题标题】:how to use 50 thousand Ids at where or join clause in oracle pl/sql for a select query?如何在 oracle pl/sql 中的 where 或 join 子句中使用 50,000 个 ID 进行选择查询?
【发布时间】:2021-04-30 01:10:29
【问题描述】:

我有一个包含 5 万个收据 ID(硬编码值)的列表。我想在 where 条件下应用这 5 万个 ID 或加入操作。我使用了下面的“with”子句来创建一个临时表来收集这 5 万个 ID。然后我在连接查询中使用这个临时表进行过滤。

with temp_receiptIds(receiptId)
as
(
select 'M0000001' from dual
union
select 'M0000002' from dual
union
select 'M0000003' from dual
union
select 'M0000004' from dual
..
..
...
union
select 'M0049999' from dual
union
select 'M0050000' from dual
)

select sal.receiptId, prd.product_name, prd.product_price, sal.sales_date, sal.seller_name 
from product prd 
join sales sal on prd.product_id=sal.product_id 
join temp_receiptIds tmp on tmp.receiptId=sal.receiptId

每当我运行上述选择连接查询以根据业务人员的要求提取数据时,在生产服务器中获取结果大约需要 8 分钟。 我的上述方法正确吗?通过考虑生产服务器中的最佳性能,有没有比这更简单的方法。 请注意,每一秒,客户都会使用生产数据库。由于生产数据库非常繁忙,我是否可以直接在生产数据库中运行此查询,是否会导致客户使用每秒调用此生产数据库的网站时性能变慢。正确答案将不胜感激!谢谢

【问题讨论】:

  • 50,000 个硬编码值?!?!它们起源于哪里?您如何将它们硬编码为 50,000 个单独的 SELECT 语句?当然,您可以使用实用程序将它们加载到表中并从那里引用它们。
  • 感谢@thatjeffsmith 的回复。 50,000 个硬编码值来自一个 csv 文件。
  • 我回复了吗?将这些 csv 放入一个表中,这就像 where 子句一样简单

标签: oracle performance join plsql temp-tables


【解决方案1】:

您为什么不将这些 receiptIDs 存储到表中?

create table receiptids as
with temp_receiptIds(receiptId)
as
(
select 'M0000001' from dual
union all                        --> "union ALL" instead of "union"
...
) 
select * from temp_receiptids;

索引它:

create index i1recid on receiptids (receiptIdD);

查看该查询现在的行为方式。


如果您 - 由于某种原因 - 不能这样做,请查看 CTE 中的 UNION ALL 是否有任何好处。对于 50.000 行,它可能会有所作为。

【讨论】:

  • 谢谢@Littlefoot 的回复 :),是的,你是对的!,'Union all' 比'union' 提高了性能。关于创建临时表,我拥有获取生产数据的只读权限。在这种情况下,是否可以使用索引以获得最佳性能?提前谢谢你的朋友:)
  • 正如你所建议的,我使用了'create table..',但它抛出以下错误,ORA-04031:无法分配 127448 字节的共享内存(“共享池”,“创建表收据为 w ...","SQLA^2cf9d958","qsmksol : qsmg_alloc_sol") 请告知如何克服这个问题,在此先感谢。
  • 如果您具有只读访问权限,那么您对创建表无能为力。看看 DBA 是否可以为您创建它——也许在另一个模式中,并让您访问它。从 ORA-04031 开始,这通常意味着您(即 DBA)应该向 SGA 添加更多 RAM。
  • 听起来您和您的 DBA 需要认真交谈。首先,正如@Littlefoot 建议的那样,他们需要认真查看系统配置,50K 行实际上相对较小。其次,让他们创建一个具有写入权限的应用程序角色,并将您授予该角色。然后,您需要查看 SQL LOADER 以加载 csv。加载这些数据,也就是编写它,是你工作的一部分; DBA 的工作是确保您拥有完成工作所需的一切。请记住,您和 DBA 都属于同一个团队,至少就组织的其他成员而言。
  • 谢谢@Littlefoot 和 Belayer :)。我接受你的建议。我将与我们的 DBA 核实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
相关资源
最近更新 更多