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几乎不值得,只要主查询可能需要几分钟. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- sql – 包的现有状态已被丢弃
- sql-server-2008 – 在SQL Server 2008中存储闰秒
- linq-to-sql – Linq to SQL和Linq to Objects查询相同吗?
- sql – 在DateTime LastUpdated列上使用Html.hidden进行版本
- SqlServer:此数据库处于单用户模式,导致数据库无法删除的
- 在sqlserver和acess的delete和update语句中使用join的不同写
- CSharp基础起步第十二期---SqlServer 基础01(数据类型)
- sql-server – SQL Server中“记录”和“行”之间有什么区别
- win2003 安装2个mysql实例做主从同步服务配置
- 第一个项目