Oracle使用临时表与直接关联的性能比较

oracle,使用,临时,直接,关联,性能,比较 · 浏览次数 : 45

小编点评

**Oracle数据库水平比较低,由于使用临时表与直接关联的性能比较摘要自己的数据库水平太low了。** **主要问题是:** * 使用临时表存储中间结果数据时,需要进行多次关联查询,这会导致性能下降。 * 直接关联查询使用了临时表,也可能影响性能。 **性能提升措施:** * 可以使用中间表存储中间结果数据。 * 可以使用索引优化直接关联查询。 * 可以考虑使用其他技术,例如将临时表与直接关联分离。

正文

Oracle使用临时表与直接关联的性能比较


摘要

自己的数据库水平还是太low了. 
之前有很多店理解过. 但是一直理解的不深入.
比如我们这边有很多使用临时表存储中间结果数据
然后对结果数据进行关联查询的

直接关联查询

SELECT
	col.TABLE_NAME,
	col.column_name 
FROM
	user_constraints con,
	user_cons_columns col 
WHERE
	con.constraint_name = col.constraint_name 
	AND con.constraint_type = 'P' 
	AND col.Table_name NOT IN (
	SELECT
		table_name 
	FROM
		(
		SELECT
			count( col.TABLE_NAME ),
			col.TABLE_NAME 
		FROM
			user_constraints con,
			user_cons_columns col 
		WHERE
			con.constraint_name = col.constraint_name 
			AND con.constraint_type = 'P' 
			AND col.TABLE_NAME IN ( SELECT TABLE_NAME FROM user_tables WHERE num_rows > 1 ) 
		GROUP BY
			col.TABLE_NAME 
		HAVING
			(
			count( col.TABLE_NAME )) > 1 
		)) 
	AND col.TABLE_NAME IN ( SELECT TABLE_NAME FROM user_tables WHERE num_rows > 1 )

SQL说明

从 user_constraints 取出来唯一主键的名称
从 user_cons_columns 取出来唯一主键对应的表名和列名
从 user_tables 取出来存在数据的表信息.
然后排除掉有符合主键的情况. 

得到单一主键的表名和列名信息. 

耗时和执行计划分析

使用navicat 执行此段SQL
我这边大概 200G的数据库 1万多个表的情况下
耗时6550 秒 一小时五十分钟. 

使用sqlplus 展示执行计划

set autotrace on 
set autotrace traceonly 
set autotrace traceonly explain
set autotrace traceonly statistics
set pagesize 2000
set linesize 2000

explain plan for somesql
查看具体执行计划
select * from table(dbms_xplan.display());

简历两个中间表进行查询的结果

BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE zhaobsh001';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;
/
create table zhaobsh001 as select col.TABLE_NAME,col.column_name from user_constraints con,user_cons_columns col where con.constraint_name=col.constraint_name and con.constraint_type='P' and col.TABLE_NAME in (select TABLE_NAME from user_tables where num_rows > 1 );
BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE zhaobsh002';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;
/
create table zhaobsh002 as select table_name  from (select count(col.TABLE_NAME),col.TABLE_NAME from user_constraints con,user_cons_columns col where con.constraint_name=col.constraint_name and con.constraint_type='P' and col.TABLE_NAME in (select TABLE_NAME from user_tables where num_rows > 1 ) group by col.TABLE_NAME  having(count(col.TABLE_NAME)) > 1 ) ;
BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE zhaobsh003';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;
/
create table zhaobsh003  as select  table_name,column_name from zhaobsh001 where  TABLE_NAME not in (select table_name from zhaobsh002) ;

select 'select count(upper('||column_name||')) as  '|| table_name ||' , upper('||column_name||') from '||table_name||' group by upper('||column_name||') having count(upper('||column_name||')) >1 ; ' from zhaobsh003

子表查询的情况

删除表耗时:0.02秒左右
创建三个表的分别耗时:
zhaobsh001: 2.954秒
zhaobsh002: 3.163秒
zhaobsh003: 0.018秒

查询SQL集合耗时:0.13秒
累计耗时: 8秒钟左右
性能提升非常明显. (从6000多秒到不到10秒钟)

感想

不要总是想一句SQL出结果
应该多考虑产品一些实现.
他们是耗费了很多经理的产出物
有时候不仅要看网上的东西,还应该多学习产品里面优秀的设计要点. 

与Oracle使用临时表与直接关联的性能比较相似的内容:

Oracle使用临时表与直接关联的性能比较

Oracle使用临时表与直接关联的性能比较 摘要 自己的数据库水平还是太low了. 之前有很多店理解过. 但是一直理解的不深入. 比如我们这边有很多使用临时表存储中间结果数据 然后对结果数据进行关联查询的 直接关联查询 SELECT col.TABLE_NAME, col.column_name F

Oracle优化神技之临时表

Oracle临时表在处理临时数据、会话数据隔离和复杂查询优化方面非常有用。 其底层逻辑是通过Oracle特殊的临时表来减少I/O操作和日志开销,提高了数据库性能和查询效率。开发者可以根据具体需求和场景,合理使用临时表来简化数据处理逻辑和提高系统性能。 早期开发人员在使用Oracle数据库时,经常因为

【解惑】介绍三大数据库的with语句的写法及使用场景

WITH 子句通常被称为 "Common Table Expressions"(CTE),俗称内存临时表,当使用 WITH 语句时,应注意具体的数据库版本和支持情况。以下是对 MySQL、Microsoft SQL Server(MSSQL)和 Oracle 数据库的 WITH 语句用法示例,以及在

[转帖]Oracle大页未正常使用导致大量SWAP案例分析

http://blog.itpub.net/30310891/viewspace-2927363/稀奇古怪的.. 故障背景 某次,用户反馈一套已经正常运行一段时间的 Oracle 11.2.0.4 RAC 数据库( 128G 物理内存),在调整 process 阈值之后, R AC 集群中其中一个节

Oracle CloudWorld 2022 - 使用Oracle MAA实现应用程序的连续可用性

每每谈到Oracle MAA,大家条件反射般就会想到Oracle的RAC和ADG等核心选件,当然,这些技术有口皆碑,也的确是MAA的构建基础,但本文我们不再过多谈这些耳熟能详的技术,而是来跟大家探讨下在此基础之上,我们如何将基础MAA优化到业务连续性MAA这个程度,最终实现应用程序的连续可用性。 在

小知识:使用oracle用户查看RAC集群资源状态

正常情况按照标准配置的环境变量,只能grid用户查看RAC集群资源状态。 crsctl stat res -t 但是绝大部分操作其实都是oracle用户来操作,比如启停数据库,操作完成以后就需要检查下集群资源状态。 看到好多DBA在现场操作时就是来回各种切换或开多个窗口。 其实有两个简单的解决方法可

低版本客户端连接高版本数据库报错ORA-28040、ORA-01017

测试环境: 客户端:Oracle 11.2.0.1 服务端:Oracle 19.16 测试过程: 1.低版本客户端连接高版本数据库报错ORA-28040 2.低版本客户端连接高版本数据库报错ORA-01017 3.总结经验 1.低版本客户端连接高版本数据库报错ORA-28040 使用oracle 1

[转帖]并发delete导致oracle死锁问题的解决

项目中有一个批处理任务,用来删除数据库中过期的数据(包括说话人的语音、模型、记录等),当程序被分布式部署后,就会有多个批处理线程同时进行删除,不过不同的线程,会根据元信息表得到不同的说话人信息,从而删除不同的数据,并不存在竞争的问题,但是,当项目使用oracle数据库在线上运行时,却频繁出现了ORA

[转帖]OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别]

classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle JDBC驱动来解决的?最常使用的ojdbc14.jar有多个版本,classes12.jar有多个版本

OceaBase 分区表创建技巧

最近遇在干个核心的金融项目,规模很大,客户主要是用oracle数据库,现在需要适配ob,原来在oracle就是分区表的迁来ob以后需要进行改造。 oracle默认使用是堆表(ht),而ob使用的是索引组织表(iot),表原理不一样所以分区表会稍微有点区别。 1、表无主键,创建范围分区表 CREATE