如何在oracle pl/sql中的where或join子句中为select查询使用50000个ID?

如何在oracle pl/sql中的where或join子句中为select查询使用50000个ID?,oracle,performance,join,plsql,temp-tables,Oracle,Performance,Join,Plsql,Temp Tables,我有一个50000个收据ID(硬编码值)的列表。我想在where条件或join操作中应用这50000个ID。我使用下面的“with”子句创建了一个临时表来收集这5万个ID。然后我在联接查询中使用这个临时表进行筛选 with temp_receiptIds(receiptId) as ( select 'M0000001' from dual union select 'M0000002' from dual union select 'M0000003' from dual union sele

我有一个50000个收据ID(硬编码值)的列表。我想在where条件或join操作中应用这50000个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
每当我运行上面的select join查询以根据业务人员的请求提取数据时,在生产服务器中获取结果大约需要8分钟。 我的上述方法正确吗?考虑到生产服务器的最佳性能,还有比这更简单的方法吗。
请注意,每秒钟,生产数据库都由客户使用。由于生产数据库非常繁忙,我是否可以直接在生产数据库中运行此查询,这会导致客户使用每秒调用此生产数据库的网站的性能降低。正确的答案将不胜感激!谢谢

你为什么不把那些
receiptID
存储到一个表中呢

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
是否有任何好处。对于50000行,这可能会有所不同。

50000个硬编码值?!?!它们起源于哪里?您是如何将它们硬编码为50000个单独的SELECT语句的?当然,您可以使用实用程序将它们加载到表中并从表中引用它们。谢谢您的回复@thatjeffsmith。50000个硬编码值来自csv文件。我回复了吗?把这些csv放在一张表中,这就像一个where-clausethat-jeffsmith一样简单,这是一个有用的答案。谢谢@Littlefoot的回复:),是的,你是正确的!,'“联合所有”比“联合”更能提高性能。关于创建临时表,我拥有获取生产数据的只读权限。在这种情况下,是否可以使用索引来获得最佳性能?提前谢谢你,朋友:)正如你所建议的,我使用了“create table..”,但它抛出了以下错误,ORA-04031:无法分配127448字节的共享内存(“共享池”,“创建表receiptid为w..”,“SQLA^2cf9d958”,“qsmksol:qsmg_alloc_sol”),请提前告知如何克服此问题,谢谢。如果您具有只读访问权限,对于创建表,您无能为力。看看DBA是否可以为您创建它—可能是在另一个模式中,并允许您访问它。从ORA-04031开始,这通常意味着您(即DBA)应该向SGA添加更多RAM。听起来您和您的DBA需要一次严肃的对话。首先,@Littlefoot建议他们需要认真查看系统配置,实际上50K行相对较小。其次,让他们创建一个具有写访问权限的应用程序角色,并授予您该角色。然后,您需要查看SQL加载器以加载csv。加载这些数据,意味着编写它,是您工作的一部分;DBA的工作是确保您拥有完成任务所需的一切。请记住,您和DBA都是同一个团队的成员,至少就组织的其他成员而言是如此。谢谢@Littlefoot and Belayer:)。我接受你的建议。我会和我们的DBA联系。