Sql 解决查询性能问题

Sql 解决查询性能问题,sql,plsql,oracle11g,oracle-sqldeveloper,Sql,Plsql,Oracle11g,Oracle Sqldeveloper,我在了解/理解如何优化以下查询时遇到了困难,我对性能提示非常陌生,因此可能有人会给出一些建议: 顺便说一句,我需要保留左表(event_user)中的所有信息,这样就可以进行左连接,但代价太高了!因此,当我在sqldev中调用这个查询时,它只是停留在那里“加载”,需要很长时间,我不知道如何处理这个问题 查询 计划 我最初的想法是执行如下查询,因为每个单独执行的查询都非常快(成本为0) 上面的查询在成本(172)方面很好,但是我的查询结果集太广泛了,每行重复20次 我的左表查询: select *

我在了解/理解如何优化以下查询时遇到了困难,我对性能提示非常陌生,因此可能有人会给出一些建议:

顺便说一句,我需要保留左表(event_user)中的所有信息,这样就可以进行左连接,但代价太高了!因此,当我在
sqldev
中调用这个查询时,它只是停留在那里“加载”,需要很长时间,我不知道如何处理这个问题

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

上面的查询在成本(172)方面很好,但是我的查询结果集太广泛了,每行重复20次

我的左表查询:

select * from event_user where event_id = 2002317;

返回30行,带reg as…的
查询返回600!每行*20,有指针吗?谢谢

在您的查询中,您将
event\u user.event\u id=:eventid
放入联接条件,这意味着您没有筛选event\u 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;

在查询中,您将
event\u user.event\u id=:eventid
放入联接条件,这意味着您没有筛选event\u 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;

如果您将
event\u user.event\u id=:eventid
放在where子句中,它会改变什么吗?您的意思是
select*from event\u user where event\u user.event\u id=:eventid
?如果是这样,为什么会有不同?在你的原始版本中,你加入了事件id和事件用户id,并在会话id上进行过滤。修订版似乎已经失去了一些逻辑。联接不应该在event\u user\u id上,并且
atd
子查询不应该有会话id筛选器吗?如果您将
event\u user.event\u id=:eventid
放在where子句中,它会改变什么吗?您的意思是
select*from event\u user where event\u user.event\u id=:eventid
?如果是这样,为什么会有不同?在你的原始版本中,你加入了事件id和事件用户id,并在会话id上进行过滤。修订版似乎已经失去了一些逻辑。加入不应该在事件用户id上,并且
atd
子查询不应该有会话id筛选器吗?很好,我没有注意到这一点,非常感谢!现在可以正常工作了Jaja出于好奇,您知道为什么它返回相同行的20倍,以及如何使用以下查询解决此问题:
with reg as…
?每个表中有多少个事件id?笛卡尔产品卓越,我没有注意到这一点,非常感谢!现在可以正常工作了Jaja出于好奇,您知道为什么它返回相同行的20倍,以及如何使用以下查询解决此问题:
with reg as…
?每个表中有多少个事件id?笛卡尔积
select * from event_user where event_id = 2002317;
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;