加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 如何在oracle中的多个select中避免使用相同的子查询?

发布时间:2020-12-12 07:48:11 所属栏目:MsSql教程 来源:网络整理
导读:这是使用相同子查询的三个不同选择.如何使用子查询结果而不是再次执行子查询. SELECT *FROM AddressWHERE address_key IN ( SELECT address_key FROM person_address WHERE peson_key IN (person_list) ); -- person_list := '1,2,3,4'SELECT *FROM Phone WHE
这是使用相同子查询的三个不同选择.如何使用子查询结果而不是再次执行子查询.
SELECT  *
FROM    Address
WHERE   address_key IN
        (
        SELECT  address_key
        FROM    person_address
        WHERE   peson_key IN (person_list)
        );   -- person_list := '1,2,3,4'

SELECT  *
FROM    Phone 
WHERE   phone_key IN
        (
        SELECT  address_key
        FROM    person_address
        WHERE   peson_key IN (person_list)
        );

SELECT  *
FROM    Email
WHERE   address_key IN
        (
        SELECT  address_key
        FROM    person_address
        WHERE   peson_key IN (person_list)
        );

解决方法

您可以为此查询创建物化视图:
CREATE MATERIALIZED VIEW v_address
REFRESH FORCE ON COMMIT
AS
SELECT  address_key
FROM    person_address
WHERE   person_key IN (person_list)

,或创建一个临时表并填充它:

CREATE GLOBAL TEMPORARY TABLE tt_address (VARCHAR2(50));

INSERT
INTO   tt_address
SELECT  address_key
FROM    person_address
WHERE   person_key IN (person_list)

但是,实际上,如果您为person_key编制索引,则可以重用子查询.

由于您有3个单独的查询,因此您需要以这样或那样的方式显示您的值.

这意味着您需要将这些值存储在某处,无论是内存,临时表空间还是永久表空间.

但是你需要的值已经存储在person_address中了,你只需要获取它们.

使用子查询3次将涉及12次索引扫描以从person_key上的索引获取ROWID,并使用12次表ROWID查找从表中获取address_key.然后很可能会在它们上构建一个HASH TABLE.

这是微秒的问题.

当然,临时表或物化视图会更高效,但是将子查询时间从100微秒更改为50几乎不值得,只要主查询可能需要几分钟.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读