临时表和虚拟表
ORACLE-Select语句执行顺序及如何提高Oracle 基本查询效率

【转】ORACLE-Select语句执行顺序及如何提高Oracle 基本查询效率博客分类: ORCALE转自:/blog/static/1176427201110345049428/首先,要了解在Oracle中Sql语句运行的机制。
以下是sql语句的执行步骤:1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。
2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。
3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句。
4)表达式转换,将复杂的 SQL 表达式转换为较简单的等效连接表达式。
5)选择优化器,不同的优化器一般产生不同的“执行计划”6)选择连接方式, ORACLE 有三种连接方式,对多表连接 ORACLE 可选择适当的连接方式。
7)选择连接顺序,对多表连接 ORACLE 选择哪一对表先连接,选择这两表中哪个表做为源数据表。
8)选择数据的搜索路径,根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。
9)运行“执行计划”。
这里不得不提的是Oracle共享原理:将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, Oracle就能很快获得已经被解析的语句以及最好的执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用。
在了解了SQL语句的运行机制与Oracle共享原理后,我们可以知道SQL语句的书写方式对SQL语句的执行效率有很大的影响。
那么下面我们了解一下SQL中Select语句中各个关键字执行的顺序。
SQL语言不同于其他编程语言的最明显特征是处理代码的顺序。
在大多数据库语言中,代码按编码顺序被处理。
但在SQL语句中,第一个被处理的子句是FROM,而不是第一出现的SELECT。
sql server 虚拟表的使用方法

sql server 虚拟表的使用方法SQL Server虚拟表是一种特殊的表,它并不存储任何数据,而是根据查询的需要,动态生成数据。
虚拟表可以帮助我们简化复杂的查询操作,提高查询效率。
本文将介绍SQL Server虚拟表的使用方法。
一、什么是SQL Server虚拟表?SQL Server虚拟表是一种临时表,它不实际存储数据,而是根据查询的需要,动态生成数据。
虚拟表可以通过WITH关键字定义,并且可以在查询中像普通表一样使用。
虚拟表一般用于简化复杂的查询操作,提高查询效率。
二、SQL Server虚拟表的语法SQL Server虚拟表的语法如下所示:```sqlWITH 虚拟表名称 AS (查询语句)SELECT * FROM 虚拟表名称```其中,虚拟表名称是自定义的名称,可以根据需要进行命名。
查询语句是生成虚拟表数据的查询操作。
三、SQL Server虚拟表的使用示例下面通过一个示例来演示SQL Server虚拟表的使用方法。
假设有两张表:学生表(Student)和课程表(Course)。
学生表包含学生的学号(StudentID)和姓名(Name),课程表包含课程的编号(CourseID)和名称(CourseName)。
现在要查询选修某门课程的学生信息。
我们可以使用虚拟表来生成选修某门课程的学生信息:```sqlWITH 选修课程的学生 AS (SELECT Student.StudentID, FROM StudentINNER JOIN Course ON Student.StudentID = Course.StudentIDWHERE Course.CourseName = '数学')SELECT * FROM 选修课程的学生```上述查询语句中,首先使用WITH关键字定义了一个虚拟表“选修课程的学生”,该虚拟表通过连接学生表和课程表,并根据课程名称筛选出选修数学课程的学生信息。
MySQL中的视图和临时表的概念与应用

MySQL中的视图和临时表的概念与应用介绍:在数据库管理系统中,视图(View)和临时表(Temporary Table)是两个常见且重要的概念。
它们在MySQL中被广泛应用,为开发人员和数据库管理员提供了更灵活和高效的数据处理和查询方式。
本文将讨论MySQL中视图和临时表的基本概念、创建和使用方法,以及它们的实际应用。
一、视图(View)的概念与创建1. 视图是什么?视图是一个虚拟表,它基于查询的结果集而创建,并且具有与表相似的结构。
它可以被当作普通表来使用,但实际上不存储任何数据,只存储了定义它的查询语句。
2. 创建视图的语法在MySQL中,创建视图使用CREATE VIEW语句,其基本语法如下:CREATE VIEW view_name AS SELECT column1, column2, ...FROM table_nameWHERE condition;3. 视图的应用场景视图的应用场景很多,例如:(1)简化复杂查询:通过创建视图,可以将复杂的查询语句封装在视图中,以便于使用和管理。
(2)保护敏感数据:可以通过创建视图,控制用户对敏感数据的访问权限,只允许用户访问部分数据。
(3)简化数据访问:通过视图,可以根据用户的需求和角色,提供不同的数据视图,从而简化数据的访问和处理。
二、临时表(Temporary Table)的概念与使用1. 临时表是什么?临时表是在数据库连接会话期间存在的,用于保存临时数据的表。
临时表的数据对其他用户是不可见的,它们可以在同一个会话中的不同查询之间共享数据,也可以在存储过程和函数中使用。
2. 创建临时表的语法在MySQL中,创建临时表使用CREATE TEMPORARY TABLE语句,其基本语法如下:CREATE TEMPORARY TABLE table_name (column1 datatype,column2 datatype,...);3. 临时表的应用场景临时表在许多场景下都能发挥重要作用,例如:(1)中间结果存储:当一个复杂查询包含多个子查询时,可以使用临时表来保存每个子查询的结果,以便于后续查询使用。
使用MySQL进行跨表查询的方法

使用MySQL进行跨表查询的方法在进行数据库开发和数据处理的过程中,经常会遇到需要查询多个数据表之间关联信息的情况,这就是跨表查询。
MySQL作为一种常用的关系型数据库管理系统,提供了多种灵活的方法来实现跨表查询。
本文将介绍一些常用的方法和技巧,帮助读者更好地应对这类问题。
一、使用JOIN语句关联多个数据表JOIN是最常见也是最常用的方法之一,通过它可以将多个数据表以某种关联条件进行连接,然后将符合条件的结果返回。
在MySQL中,JOIN语句有几种不同的形式,包括INNER JOIN、LEFT JOIN、RIGHT JOIN等,可以根据实际需要来选择合适的形式。
例如,我们有两个数据表,一个是学生表,包含学生的学号和姓名等信息;另一个是成绩表,包含学生的学号和对应科目的成绩。
我们想要查询出每个学生的姓名和对应的数学成绩,可以使用如下语句:```SELECT s.姓名, c.数学成绩FROM 学生表 sJOIN 成绩表 cON s.学号 = c.学号```这里通过ON关键字指定了学生表和成绩表之间的关联条件,即学生表的学号字段等于成绩表的学号字段。
这样,查询结果将会返回每个学生的姓名和对应的数学成绩。
二、使用子查询进行跨表查询除了使用JOIN语句外,还可以使用子查询的方法进行跨表查询。
子查询是指将一个查询嵌套在另一个查询中,可以将内部查询的结果作为外部查询的条件或者返回结果。
在跨表查询中,可以使用子查询来获取一个数据表的部分数据,然后将其作为另一个查询的条件进行进一步的筛选或匹配。
例如,我们有一个订单表和一个商品表,想要查询出所有已经下单但尚未发货的商品信息。
可以使用如下语句:```SELECT *FROM 商品表WHERE 商品编号 IN (SELECT 商品编号 FROM 订单表 WHERE 状态 = '下单') ```这里将内部查询的结果作为外部查询的条件,即在商品表中筛选出那些商品编号在订单表中状态为下单的记录。
深入浅出谈Oracle临时表

关于临时表上的DML活动,有以下结论: 活动,有以下结论: 关于临时表上的 活动
• 1、 INSERT 会生成很少甚至不生成undo/redo活动。因此,临 时表对insert/select型的应用很有用。 比如在处理web翻页时, 可以通过临时表来模拟cache返回结果。 • 2、 DELETE 在临时表上生成的redo与正常表上生成的redo同 样多。 • 3 、临时表的UPDATE会生成正常表UPDATE一半的redo。
在一个SESSION中(比如SQLPLUS登陆)插入上面3条记录,然后再以另外一个SESSION(用 SQLPLUS再登陆一次)登陆,当你select * from classes;的时候,classes表是空的,而你再第 一次登陆的SQLPLUS中select的时候可以查询到,这个时候你没有进行commit或者rollback之前 你可以对刚才插入的3条记录进行update、delete等操作,当你进行commit或者rollback的时候, 这个时候由于你的表是事务级的临时表,那么在插入数据的session也看不到数据了,这个时候 数据就已经被截断了。
什么时候使用临时表? 什么时候使用临时表?
• 1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表 关联。可以采用将大表进行分拆并且得到比较小的结果集合存放 在临时表中。 • 2)、程序执行过程中可能需要存放一些临时的数据,这些数据在 整个程序的会话过程中都需要用的等等。
<Insert Picture Here>
事务级SQL操作 操作 事务级
• • • • • • • • • • SQL> insert into classes(Class_id,Class_Name,Class_Memo) values(1,'计算机','9608'); 1 row inserted SQL> insert into classes(Class_id,Class_Name,Class_Memo) values(2,'经济信息','9602'); 1 row inserted SQL> insert into classes(Class_id,Class_Name,Class_Memo) values(3,'经济信息','9603'); 1 row inserted SQL> update classes set class_memo ='' where class_id=3 ; 1 row updated SQL> select * from classes ; CLASS_ID CLASS_NAME CLASS_MEMO -------- ---------- -------------------------------------------------------------------------------1 计算机 9608 2 经济信息 9602 3 经济信息 SQL> delete from classes where class_id=3 ; 1 row deleted SQL> select * from classes ; CLASS_ID CLASS_NAME CLASS_MEMO -------- ---------- -------------------------------------------------------------------------------1 计算机 9608 2 经济信息 9602 SQL> commit; Commit complete SQL> select *from classes ; CLASS_ID CLASS_NAME CLASS_MEMO -------- ---------- -------------------------------------------------------------------------------SQL> 再重复插入一次,然后rollback。 SQL> Rollback ; Rollback complete SQL> select * from classes ; CLASS_ID CLASS_NAME CLASS_MEMO -------- ---------- -------------------------------------------------------------------------------SQL>
MySQL中临时表的基本创建与使用教程

MySQL中临时表的基本创建与使⽤教程当⼯作在⾮常⼤的表上时,你可能偶尔需要运⾏很多查询获得⼀个⼤量数据的⼩的⼦集,不是对整个表运⾏这些查询,⽽是让MySQL每次找出所需的少数记录,将记录选择到⼀个临时表可能更快些,然后在这些表运⾏查询。
创建临时表很容易,给正常的CREATE TABLE语句加上TEMPORARY关键字:CREATE TEMPORARY TABLE tmp_table (name VARCHAR(10) NOT NULL,value INTEGER NOT NULL)临时表将在你连接MySQL期间存在。
当你断开时,MySQL将⾃动删除表并释放所⽤的空间。
当然你可以在仍然连接的时候删除表并释放空间。
DROP TABLE tmp_table如果在你创建名为tmp_table临时表时名为tmp_table的表在数据库中已经存在,临时表将有必要屏蔽(隐藏)⾮临时表tmp_table。
如果你声明临时表是⼀个HEAP表,MySQL也允许你指定在内存中创建它:CREATE TEMPORARY TABLE tmp_table (name VARCHAR(10) NOT NULL,value INTEGER NOT NULL) TYPE = HEAP因为HEAP表存储在内存中,你对它运⾏的查询可能⽐磁盘上的临时表快些。
然⽽,HEAP表与⼀般的表有些不同,且有⾃⾝的限制。
详见MySQL参考⼿册。
正如前⾯的建议,你应该测试临时表看看它们是否真的⽐对⼤量数据库运⾏查询快。
如果数据很好地索引,临时表可能⼀点不快。
临时表再断开于mysql的连接后系统会⾃动删除临时表中的数据,但是这只限于⽤下⾯语句建⽴的表:定义字段:CREATE TEMPORARY TABLE tmp_table (name VARCHAR(10) NOT NULL,value INTEGER NOT NULL)直接将查询结果导⼊临时表CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name另外mysql也允许你在内存中直接创建临时表,因为是在内存中所有速度会很快,语法如下:CREATE TEMPORARY TABLE tmp_table (name VARCHAR(10) NOT NULL,value INTEGER NOT NULL) TYPE = HEAP从上⾯的分析可以看出临时表的数据是会被清空的,你断开了连接就会被⾃动清空,但是你程序中不可能每发⾏⼀次sql就连接⼀次数据库吧(如果是这样的话,那就会出现你担⼼的问题,如果不是就没有问题),因为只有断开数据库连接才会被清空数据,在⼀个数据库连接⾥⾯发⾏多次sql的话系统是不会⾃动清空临时表数据的。
Oracle的临时表、分区表、分区索引

Oracle的临时表一、表的种类1:永久表:非私有数据,需要DML锁。
2:临时表:临时表的定义对所有会话都是可见的,处理事务或会话期存在的私有数据,不需要DML锁,对于临时表的DML语句不生成重做日志,临时表占用临时表空间,临时表的数据是自动删除的,在临时表上建的索引也是临时的。
二、临时表的种类1:事物型临时表:在事务期间数据存在,事务结束后数据被自动删除。
2:会话型临时表:在会话期间数据存在,会话结束后数据被自动删除。
三、临时表的限制1:不能分区,不能是索引组织表或簇。
2:不能指定关于临时表的外键约束。
3:不支持并行DML或并行查询。
4:不支持分布式事务处理。
5:不能指定段存储语句、嵌套表存储语句或并行语句四、建立临时表的语法1:建立关系表2:建立对象表3:并行语句Oracle的分区表一、什么是分区表Oracle可以将大表或索引分成若干个更小更方便管理的部分,每一部分称为一个分区,这样的表称为分区表。
SQL语句使用分区表比全表或全表索引能提供更好的访问和处理数据。
下图是按周所建分区表示例。
二、使用分区表的限制1:不能分割是簇一部分的表。
2:不能分割含有LONG或LONG RAW列的表。
3:索引组织表IOT不能进行范围分区。
**采用基于规则的优化器时,有会从分区表中受益!三、分区方法1:范围分区(更适合历史数据库)—Oracle8从惟一可用的分区类型按照列的列表的范围分割表;如果是索引组织表,则列的列表就必须是索引组织表主键的子集。
分区关键列的限制:列列表中的列可以是任何一种内置的数据类型,ROWID、LONG、LOB或者TIMESTAMP WITH TIME ZONE除外。
关键字MAXVALUE比任何值都高(含NULL)。
2:散列分区--Oracle8i可用的分区类型指定这个表是按哈希算法分区的,分区的数目应为2的幂。
1)单独散列分区(individual_hash_partitions)及其限制使用子名按照名字指定单个分区,分区名可以匆略。
Oracle Temporary Tables(Oracle 临时表)

Oracle Temporary Tables(Oracle 临时表)1. 建立临时表语法A.ON COMMIT DELETE ROWS 定义了建立事务级临时表的方法CREATE GLOBAL TEMPORARY TABLE TABLE_NAME-----(COUMNS …)-----AS SELECT … FROM TABLE…ON COMMIT DELETE ROWS;当前session发出commit/rollback命令,则该事务周期发生的所有数据自动被Oracle删除(Oracle truncate table)。
但不影响任何其他session的数据。
B.ON COMMIT PRESERVE ROWS 定义了创建会话级临时表的方法CREATE GLOBAL TEMPORARY TABLE TABLE_NAME-----(COUMNS …)-----AS SELECT … FROM TABLE…ON COMMIT PRESERVE ROWS;当前session结束(用户正常退出/ 用户不正常退出/ Oracle实例崩溃),Oracle对这个会话的中发生的数据进行删除(O racle truncate table)。
但不影响任何其他session的数据。
2. 特点说明A.临时表数据自动清空后,但是临时表的结构以及元数据还存储在用户的数据字典中。
表的定义对所有的会话可见B.临时表不需要DML锁C.可以索引临时表和在临时表基础上建立视图D.在临时表上的索引也是临时的,也是只对当前会话或者事务有效E.临时表可以拥有触发器F.可以用export和import工具导入导出临时表的定义,但是不能导出数据3. 使用技巧A.当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。
可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中B.程序执行过程中可能需要存放一些临时的数据,可以将这类数据放在临时表里非常方便C.存储过程中用到临时表:1> 在建立临时表前,应先加上对表名的判断Select count(*) into v_count from user_tables where table_name = ‘XXX’;If v_count=0 thenCreate global temporary table …在存储过程结束处,应该记得删除表execute immediate 'drop table t_temp';2> 若在存储过程中建的临时表为on commit delete rows。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
视图和临时表
1.临时表
临时表与永久表相似,但临时表存储在tempdb 中,当不再使用时会自动删除。
临时表有两种类型:本地和全局。
它们在名称、可见性以及可用性上有区别。
本地临时表的名称以单个数字符号(#) 打头;它们仅对当前的用户连接是可见的;当用户从SQL Server 实例断开连接时被删除。
全局临时表的名称以两个数字符号(##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从SQL Server 断开连接时被删除。
临时表存在于服务器内存中,SQL服务关闭就会自动消失,且作为中间转阶层,临时表因为是存在缓存中,所以运行时或者在存储过程中时,执行效率高。
例如,如果创建了employees 表,则任何在数据库中有使用该表的安全权限的用户都可以使用该表,除非已将其删除。
如果数据库会话创建了本地临时表#employees,则仅会话可以使用该表,会话断开连接后就将该表删除。
如果创建了##employees 全局临时表,则数据库中的任何用户均可使用该表。
如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。
如果您创建该表后另一个用户在使用该表,则SQL Server 将在您断开连接并且所有其他会话不再使用该表时将其删除。
2.视图
可以被看成是虚拟表或存储查询。
除非是索引视图,否则视图的数据不会作为非重复对象存储在数据库中。
数据库中存储的是SELECT 语句。
SELECT 语句的结果集构成视图所返回的虚拟表。
用户可以采用引用表时所使用的方法,在Transact-SQL 语句中引用视图名称来使用此虚拟表
视图是一个虚拟表,其内容由查询定义。
同真实的表一样,视图包含一系列带有名称的列和行数据。
视图在数据库中并不是以数据值存储集形式存在,除非是索引视图。
行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
对其中所引用的基础表来说,视图的作用类似于筛选。
定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。
分布式查询也可用于定义使用多个异类源数据的视图。
例如,如果有多台不同的服务器分别存储您的单位在不同地区的数据,而您需要将这些服务器上结构相似的数据组合起来,这种方式就很有用。
通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。
视图没有存在形式,如果自己不删除视图是不会自动消失的,视图同时也是作为物理表的窗口,执行效率相对一般。