sql – 如何在oracle中的多个select中避免使用相同的子查询?
发布时间:2020-05-23 23:18:20 所属栏目:MsSql 来源:互联网
导读:这是使用相同子查询的三个不同选择.如何使用子查询结果而不是再次执行子查询. SELECT *FROM AddressWHERE address_key IN ( SELECT address_key FROM person_address WHERE peson_key IN (person_list)
|
这是使用相同子查询的三个不同选择.如何使用子查询结果而不是再次执行子查询. 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几乎不值得,只要主查询可能需要几分钟. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Sql Server 创建数据库脚本Create DATABASE
- linux系统下实现mysql热备份详细步骤(mysql主从复制)
- sql-server – a = 0和b = 0的性能和… z = 0 vs b c d = 0
- MDF文件在SQL Server中的恢复技术
- Oracle Faq(如何在ORACLE中更改表的列名和顺序 )
- asp中使用mysql数据库的注意实现
- sql存储过程实例--动态根据表数据复制一个表的数据到另一个
- .net – 用“SQL”查询Active Directory?
- sql-server-2008 – 将选择结果写入csv文件
- 使用SQL Server 2005的最佳分页解决方案?
推荐文章
站长推荐
热点阅读
