我一直很难知道/不知道如何优化以下查询,我对性能提示还很陌生,所以也许有人可以提出一些建议:

顺便说一句,我需要保留所有来自左表(event_user)的信息,从而使左联接有效,但代价简直令人难以置信! 因此,当我在SQL-Dev调用此查询时,它只会停留在“加载”状态并且需要花很多时间,而且我不知道该如何解决。

询问

SELECT event_user.*,
       dw_attendee.*
FROM event_user
    LEFT JOIN dw_attendee ON event_user.event_user_id = dw_attendee.event_user_id
    AND event_user.event_id = dw_attendee.event_id
    AND dw_attendee.session_id = 1
    AND event_user.event_id = :eventid;

计划

-------------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name        | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |             |   130M|    44G|       |  2754K  (2)| 10:42:44 |       |       |
|*  1 |  HASH JOIN RIGHT OUTER|             |   130M|    44G|  4513M|  2754K  (2)| 10:42:44 |       |       |
|*  2 |   TABLE ACCESS FULL   | DW_ATTENDEE |    57M|  3861M|       |   106K  (8)| 00:24:45 |       |       |
|   3 |   PARTITION RANGE ALL |             |   130M|    35G|       |   831K  (5)| 03:14:08 |     1 |  6044 |
|   4 |    TABLE ACCESS FULL  | EVENT_USER  |   130M|    35G|       |   831K  (5)| 03:14:08 |     1 |  6044 |
-------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("EVENT_USER"."EVENT_ID"="DW_ATTENDEE"."EVENT_ID"(+) AND 
              "EVENT_USER"."EVENT_USER_ID"="DW_ATTENDEE"."EVENT_USER_ID"(+) AND "EVENT_USER"."EVENT_ID"=CASE  WHEN 
              ("DW_ATTENDEE"."EVENT_USER_ID"(+) IS NOT NULL) THEN 2002317 ELSE 2002317 END )
   2 - filter("DW_ATTENDEE"."SESSION_ID"(+)=1)

我最初的想法是执行如下查询,因为每个单独执行的查询都非常快捷(成本为0)

with reg as (select * from event_user where event_id = :eventid),
atd as (select * from dw_attendee where event_id = :eventid)
select distinct reg.*, atd.*
from reg left join atd on reg.event_id = atd.event_id;

上面的查询在成本方面非常出色(172),但我从该查询获得的结果集过于广泛,实际上是将每行重复20。

我的左表查询:

select * from event_user where event_id = 2002317;

返回30行, with reg as...查询返回600! 每行* 20,是否有指针? 谢谢

#1楼 票数:2 已采纳

在查询中,您将event_user.event_id = :eventid放在了连接条件中,这意味着您没有在过滤event_user表。 只要将其放在哪里,它就会更快。 否则,您将带回整个event_user表,但尝试仅为一个特定的event_id加入。

SELECT event_user.*,
       dw_attendee.*
FROM event_user
LEFT JOIN dw_attendee ON event_user.event_user_id = dw_attendee.event_user_id
                      AND event_user.event_id = dw_attendee.event_id
                      AND dw_attendee.session_id = 1
where event_user.event_id = :eventid;

  ask by esteban rincon translate from so

未解决问题?本站智能推荐:

1回复

关系运算符问题为空

我在插入关系运算符时遇到以下选择语句无法拾取数据的问题。 如果删除语句的最后一行(A.PK_HIDE <>'Y'),它将获取我希望看到的数据。 PK_HIDE列中只有3个不同的值,即“ Y”,“ N”或Null。 当删除最后一行时,我选择PK_HIDE ='N'的数据集。
1回复

ORA-00917在SQL查询中转义撇号

下面的代码适用于大多数情况。 当LIB_SEGCO有任何单引号如ABC'DEF时,它会爆炸 在这些情况下,它会给出错误ORA-00917:缺少逗号 任何传递变量时逃避撇号的想法? 谢谢
4回复

仅从SQL查询获取第一行

您好,我在使用以下查询获取前1行时遇到了麻烦。 它在oracle,plsql中。 我是oracle的新手,在上面的查询中,由于数据的缘故,我得到了重复-我需要根据Assoc.edit_dt获取第一条记录。 我可以通过Assoc.edit_dt对记录进行排序,但是当我在Join内使用诸如
1回复

如何使用从选择查询块获取的pl/sql循环在单击按钮上一次插入11-13个gr_numbers

我想插入那些从 APP_USER 获取的所有 gr_numbers,结果图像附加了大约 11-13 gr_numbers 获取。 我的目标是我有一个按钮,我想在单击按钮时编写一个过程,每当我单击该按钮时,它都会在单击按钮上使用循环插入所有 gr_numbers。 这是我从选择块获取的 Gr_numb
3回复

计算Oracle中每个文档的给定搜索查询/术语的命中数

我有一个表格,其中包含我要加入的文档文本blob。 使用oracle文本,我可以获得包含我的搜索词的文本片段(使用ctx_doc.snippet)。 但是,我现在必须指定为与我的联接匹配的每个文档找到此搜索词的次数,而不是我拥有的所有文档。 我总共有超过100K的文件,但加入我做,过滤返回
1回复

OraclePL/SQL错误ORA-06512和ORA-00911给我带来了问题

我有以下PL / SQL过程: 尝试使用IN值运行它时: 它给出了以下错误:ORA-00911:无效字符ORA-06512:在“SYSTEM.DBOOPDRACHT2”,第38行ORA-06512:在第8行 在第38行有一个打印,显示我在循环中生成的INSERT语句,它是: 转储
1回复

SQLDeveloper中流水线函数的性能很差

我有一个管道表功能,例如 我在SQL Developer中通过select * from TABLE(FOO(<PARAMETERS_LIST>)) WHERE ROWNUM <= 200测试查询。 SQL Developer需要9秒钟才能返回数据。 直接在SQL D
1回复

PL/SQL绑定变量问题

最近,我部署了一个Oracle WareHouse Builder(OWB)映射。 在我现在正在工作的场景中,在事实表上发生Update语句(使用WriteBack值)后,需要由触发器触发此映射(ETL流程)。 由于映射是作为程序包部署到目标架构的,因此触发器必须调用OWB为程序包创建的主