临时表

总结一下oracle临时表的用法

只愿长相守 提交于 2020-03-01 03:08:41
Oracle临时表就像它的名字一样,主要是用于临时的用途。它主要用来存储中间数据。对于不同的用户,表的数据是隔离的并在用户提交或者断开会话自动TRUNCATE。 Oracle临时表分为会话级和事务级两种。 1)ON COMMIT DELETE ROWS 事务级的临时表,这种类型的临时表与事务有关,当进行事务提交或者事务回滚的时候,临时表的数据将自行截断,即当COMMIT或ROLLBACK时,数据就会被TRUNCATE掉。 2)ON COMMIT PRESERVE ROWS 会话级的临时表,它和你当前会话有关系,当前SESSION不退出的情况下,临时表中的数据就还存在,临时表的数据只有当你退出当前SESSION的时候才被TRUNCATE 。 会话级的临时表 【语法】 Create Global Temporary Table Table_Name (the aggregation SQL statement) On Commit Preserve Rows; 事务级的临时表 【语法】 Create Global Temporary Table Table_Name (the aggregation SQL statement) On Commit Delete Rows; 【临时表的特点】 临时表数据自动清空后,但是临时表的结构以及元数据还存储在用户的数据字典中

SELECT INTO T-SQL中的表变量

浪尽此生 提交于 2020-02-29 22:17:25
有一个复杂的SELECT查询,我想从中将所有行插入表变量,但是T-SQL不允许它。 同样,您不能将表变量与SELECT INTO或INSERT EXEC查询一起使用。 http://odetocode.com/Articles/365.aspx 简短的例子: declare @userData TABLE( name varchar(30) NOT NULL, oldlocation varchar(30) NOT NULL ) SELECT name, location INTO @userData FROM myTable INNER JOIN otherTable ON ... WHERE age > 30 表变量中的数据稍后将用于将其插入/更新回不同的表(大多数是具有次要更新的相同数据的副本)。 这样做的目的是简单地使脚本比直接在右表中执行 SELECT INTO 更易读,更容易定制。 性能不是问题,因为 rowcount 相当小,并且只在需要时手动运行。 ......或者告诉我,如果我做错了。 #1楼 使用SELECT INTO的一个原因是它允许您使用IDENTITY: SELECT IDENTITY(INT,1,1) AS Id, name INTO #MyTable FROM (SELECT name FROM AnotherTable) AS t 这不适用于表变量

MySQL性能优化(一):MySQL架构与核心问题

邮差的信 提交于 2020-02-29 17:33:43
一、前言 作为程序员的你,数据库作为一门必修课,而MySQL数据库毫无疑问已经是最常用的数据库了。系统的稳定、高效、高并发等指标,很大程度上取决于数据库性能是否够优,可见性能优化的重要性,这也就不难理解各位在任何一场面试中都会被问及到数据库调优相关的问题。 因此,这就是我为何考虑写该系列文章的主要原因,希望该系列文章( MySQL性能优化 )能够给你带来收获,让你更系统、更全面的掌握MySQL性能优化的技能、技巧。该系列文章将会持续分享、更新,如果觉得现在或者将来可能对你有用,不妨持续关注、收藏。 在MySQL性能优化之前,你有必要重新再认识下MySQL,便于后续更容易理解MySQL性能优化中涉及到的知识点。本文将从MySQL架构、核心问题来针对性展开讨论,这也将是 MySQL性能优化 系列文章的开篇之作。 二、MySQL逻辑架构 想深入探究MySQL之前,有必要了解一下MySQL的逻辑架构,逻辑架构图如下: MySQL的逻辑架构中,分为三层,如上图红色虚线框的三部分。 最上层架构并不是MySQL所独有的,大多数基于客户端/服务器形态的系统或者服务,都有类似的架构,其中包含MySQL的连接处理、授权认证、安全控制等等。 第二层架构是MySQL中最为核心的部分,其中包括查询解析、分析、优化、缓存以及所有的内置函数(如:日期、时间、函数等),所有跨存储引擎的功能都在这一层实现,例如

MySQL 性能调优(2)

点点圈 提交于 2020-02-29 15:40:26
MySQL数据库技术的方方面面也是很多,这里只涉及必备的性能调优,推崇从下向上的性能调优,主要包括运行环境,配置参数,SQL性能,和系统架构设计调优。 运行环境调优 这里是Linux的天下,MySQL 运行环境的调优往往和Linux的内核调优一并完成。当然了,对云服务RDS 也有一定的参考作用。 调整Linux默认的IO调度算法 IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调度器也被叫做电梯 (elevator),而相应的算法也就被叫做电梯算法.而Linux中IO调度的电梯算法有好几种,一个叫做as(Anticipatory),一个叫做 cfq(Complete Fairness Queueing),一个叫做deadline,还有一个叫做noop(No Operation). IO对数据库的影响较大,linux默认的IO调度算法为cfq,需要修改为deadline,如果是SSD或者PCIe-SSD设备,需要修改为noop,可以使用下面两种修改方式。 1、在线动态修改,重启失效。 echo “deadline” > /sys/block/sda/queue/scheduler 2、修改/etc/grub.conf,永久生效。 修改/etc/grub.conf配置文件,在kernel那行增加一个配置,例如:

临时表 DML 产生redo 问题说明

与世无争的帅哥 提交于 2020-02-26 16:48:58
关于 Oracle 临时表,参考我的 Blog : Oracle 临时表 http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4705283.aspx 对 Oracle 临时表的操作,会产生 redo 和 undo 。 先看一个示例: SYS@anqing1(rac1)> CREATE GLOBAL TEMPORARY TABLE dave_test (id number,name varchar2(20)) ON COMMIT DELETE ROWS; Table created. SYS@anqing1(rac1)> set autotrace on SYS@anqing1(rac1)> insert into dave_test values(1,'dave'); 1 row created. Execution Plan ---------------------------------------------------------- ------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------

临时表 DML 产生redo 问题说明

♀尐吖头ヾ 提交于 2020-02-26 16:48:00
关于 Oracle 临时表,参考我的 Blog : Oracle 临时表 http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4705283.aspx 对 Oracle 临时表的操作,会产生 redo 和 undo 。 先看一个示例: SYS@anqing1(rac1)> CREATE GLOBAL TEMPORARY TABLE dave_test (id number,name varchar2(20)) ON COMMIT DELETE ROWS; Table created. SYS@anqing1(rac1)> set autotrace on SYS@anqing1(rac1)> insert into dave_test values(1,'dave'); 1 row created. Execution Plan ---------------------------------------------------------- ------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------

临时表 DML 产生redo 问题说明

蹲街弑〆低调 提交于 2020-02-26 16:33:12
关于 Oracle 临时表,参考我的 Blog : Oracle 临时表 http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4705283.aspx 对 Oracle 临时表的操作,会产生 redo 和 undo 。 先看一个示例: SYS@anqing1(rac1)> CREATE GLOBAL TEMPORARY TABLE dave_test (id number,name varchar2(20)) ON COMMIT DELETE ROWS; Table created. SYS@anqing1(rac1)> set autotrace on SYS@anqing1(rac1)> insert into dave_test values(1,'dave'); 1 row created. Execution Plan ---------------------------------------------------------- ------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------

临时表 DML 产生redo 问题说明

落花浮王杯 提交于 2020-02-26 16:32:01
关于 Oracle 临时表,参考我的 Blog : Oracle 临时表 http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4705283.aspx 对 Oracle 临时表的操作,会产生 redo 和 undo 。 先看一个示例: SYS@anqing1(rac1)> CREATE GLOBAL TEMPORARY TABLE dave_test (id number,name varchar2(20)) ON COMMIT DELETE ROWS; Table created. SYS@anqing1(rac1)> set autotrace on SYS@anqing1(rac1)> insert into dave_test values(1,'dave'); 1 row created. Execution Plan ---------------------------------------------------------- ------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------

Temporary Tables临时表

≡放荡痞女 提交于 2020-02-26 16:30:58
1简介 ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据, 或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空, 但是临时表的结构以及元数据还存储在用户的数据字典中。 临时表只在oracle8i以及以上产品中支持。 2详细介绍 Oracle临时表分为 会话级临时表和事务级临时表。 会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。 事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。 临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此, 临时表不需要DML锁.当一个会话结束(用户正常退出 用户不正常退出 ORACLE实例崩溃)或者一个事务结束的时候,Oracle对这个会话的表执行 TRUNCATE 语句清空临时表数据.但不会清空其它会话临时表中的数据. 你可以索引临时表和在临时表基础上建立视图.同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效. 临时表可以拥有触发器.

在SELECT语句中创建临时表,而不使用单独的CREATE TABLE

跟風遠走 提交于 2020-02-26 05:20:14
是否可以在不使用create table语句并指定每个列类型的情况下从select语句创建临时(仅会话)表? 我知道派生表能够做到这一点,但那些是超临时的(仅限语句),我想重用。 如果我不必编写create table命令并保持列列表和类型列表匹配,那么可以节省时间。 #1楼 使用以下语法: CREATE TEMPORARY TABLE t1 (select * from t2); #2楼 引擎必须在选择之前: CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY as (select * from table1) #3楼 当表包含 BLOB / TEXT 列时,不支持 ENGINE=MEMORY #4楼 除了 psparrow的 答案,如果你需要为临时表 添加一个索引 ,请执行以下操作: CREATE TEMPORARY TABLE IF NOT EXISTS temp_table ( INDEX(col_2) ) ENGINE=MyISAM AS ( SELECT col_1, coll_2, coll_3 FROM mytable ) 它也适用于 PRIMARY KEY #5楼 CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name