tbwshc

tbw

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  95 Posts :: 8 Stories :: 3 Comments :: 0 Trackbacks

常用链接

留言簿(4)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#

以下的文章主要是介绍Oracle使用相关触发器来实现自增ID,在userinfo表中id所需要的实现自增效果的实际操作步骤如下,如果你对其实际的操作步骤感兴趣的话,以下的文章就可以更深的一部增加你在tb其方面的兴趣。

1.创建序列

代码

 

  1. -- Create sequence  
  2. create sequence seq_userinfo  
  3. minvalue 1  
  4. start with 1  
  5. increment by 1;  
  6.  

 

2.创建触发器

代码

 

  1. create or replace trigger tigger_userinfo  
  2. before insert on userinfo  
  3. for each row  
  4. declare  
  5. begin  
  6. select SEQ_userinfo.nextval into:New.id from dual;  
  7. end tigger_userinfo;   
posted @ 2012-07-15 17:15 tbwshc 阅读(746) | 评论 (0)编辑 收藏

以下的文章抓哟是对Oracle SQL执行缓慢的原因的分析,如果Oracle数据库中的某张表的相关数据已是2亿多时,同时此表也创建了相关的4个独立的相关索引。由于业务方面的需要,每天需分两次向此表中插入300万条记录。

由于数据量大,每次插入耗时3个小时以上,严重影响效率。

因此,修改了系统的算法,将此表中只存储当天新增记录。将此表tbruncate后,第二天执行对此表的update操作时,非常耗时。表中有2亿多条数据的时候,此Oracle sql语句耗时59秒;表中有300万条数据的时候,此Oracle sql语句耗时几个小时。

咨询DBA后,得出结论,需重建索引。重建后,6秒完成此操作。但第三天问题依然出现。DBA正在查找原因。难道每次truncate表,都需要重建索引?

对于这个问题,DBA也没有给出合理的解释,推测主要原因是Oracle复杂的查询优化算法。

最终,DBA给出的解决方案:


truncate table ....  drop index.....  insert data .....  create index ...  analyze table table_name compute statistics; 
重新生成统计数据

调整后,整个操作耗时非常少。

以上的相关内容就是对Oracle SQL执行缓慢的分析的介绍,望你能有所收获。

 

posted @ 2012-07-15 17:13 tbwshc 阅读(847) | 评论 (0)编辑 收藏

1、抽象类里面可以有非抽象方法,但接口里只能有抽象方法,声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

2、接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口。

对比:
一个类可以有多个接口 只能有继承一个父类。
抽象类可以有构造方法,接口中不能有构造方法。
抽象类中可以有普通成员变量,接口中没有普通成员变量。
接口里边全部方法都必须是abstract的 抽象类的可以有实现了的方法。
抽象类中的抽象方法的访问类型可以是public,protected   但接口中的抽象方法只能是public类型的,tb并且默认即为public abstract类型。
抽象类中可以包含静态方法,接口中不能包含静态方法。
抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
posted @ 2012-07-12 13:18 tbwshc 阅读(1679) | 评论 (0)编辑 收藏

 

 在Java Web编程中,不得不了解一些基础技术(概念),如:Internetwww、浏览器、TCP/IP协议、Web服务器等。在此,我只涉及以下几处tb

1、TCP/IP协议

        协议,在计算机网络中的计算机需要相互通信、传输数据,所遵循的统一的沟通规则。有人也曾形象的把协议称之为“世界语”,是一种公认交流的规则而已。

通常TCP/IP协议不是靠单指一个协议,而是由相关的许多协议组成的协议族,即通常称之为“TCP/IP协议族(协议栈)”。正是有了这一系列的协议,具体规定了internet上计算机之间如何进行数据通信,其最核心的协议就是IP协议和TCP协议.IP(Internet Protocol),规定了internet数据传输的基本单元和格式的协议。而TCP协议提供了可靠的数据传输服务的规则。

       TCP/IP的四层结构:

 

2、常用的Web服务器

        1>Apache

             是使用广泛的Web服务器,支持很多的操作系统,并且是开放源代码的Web服务器,支持通过API扩展其功能。可以通过官方网站http://www.apache.org获得更多信息。

         2>IIS

              是微软推出的基于window平台的web服务器,不支持Javaservlet技术,只支持自己的ASPASP.NET技术。

         3 >Tomcat

              既可以独立运行,又可以作为Apache服务器的插件,与Apache服务器共同工作。Tomcat在作为Apache插件的情况下,TomcatApache提供对ServlerJSP等动态内容运行的支持,Apache提供对访问静态资源的支持。

             在开发Java Web应用的阶段,我们可以把Tomcat作为对立的Web服务器来使用,而在产品上线的阶段再使用其他的应用服务器或者是安装了Tomcat插件的Apache服务器。

3、Web动态编程

       Web运行环境经历了静态WEB和动态WEB两个时期,静态WEB与动态WEB最本质的区别极速hi在于资源(数据库)的访问上。通常静态WEB页面就是单纯的使用了HTML语音编写,缺乏交互性,然而动态WEB技术出现,使得用户的交互性更加体现出来,如搜索引擎,不同用户针对同一页面将会回馈得到不同的内容。

        动态WEB的常见实现手段有:

            1> CGI(Common Gateway Intterface) 公共网关接口

            2> PHP(Pypertext Preprocessor) 超文本预处理

            3> ASP(Active Server Pages) 动态服务页

            4>ASP.NET

            5> JSP(Java Server Pages,Java服务页)/Servlet(服务器端小程序)

posted @ 2012-07-12 13:16 tbwshc 阅读(894) | 评论 (1)编辑 收藏

  第一次去面试的时候人家人如何在SSH框架下,如何进行Hibernate的优化,当时自己只是看到这些根本就没有系统的总结这些东西,今天终于找到一个时间来解决一下自己面试的这个问题了。

Hibernate自述

           我天生效率比较低,在普遍情况下,需要将执行转换为SQL语句的Hibernate低于直接JDBC存取。但是在经过tb比较好的性能优化之后,我的性能还是让人相当满意的,特别是应用二级缓存之后,甚至可以获得比较不使用缓存的JDBC更好的性能。

优化总结

           要想优化Hibernate,我们必须知道应该从什么地方进行优化,从什么地方入手。Hibernate的优化方向:数据库设计、HQL优化、缓存、主配置、延迟加载、方法选用、集合选用、事物控制、批量操作

 

具体分析

第一点:数据库设计

       前边博客介绍过 数据库设计,今天我们还从这开始,表的设计就是建楼的基础,如何让基础简洁而结实这是最重要的。

优化策略:

1.   建索引

2.   减少表之间的关联

3.   简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据

4.   适当的冗余数据,不过分最求高范式

第二点:HQL优化


                                            (HQL知识图)

     假如想好好了解一下的建议看一下这篇博客HQL详细使用,我个人认为写的还可以,知识总结的很细致。

总结:

1.   实体查询:可以使用sql语句查询

2.   实体的更新和删除:hibernate3中直接提供更加灵活更加效率的解决方法

3.   属性查询:动态构造实例对象,对结果集进行封装

4.   分组与排序:

A.   Order by子句

B.   Group by子句与统计查询

C.   优化统计查询:内连接,外连接

5.   参数绑定:和jdbc一样,对hibernate的参数绑定提供了丰富的支持。

第三点:缓存

运行机制:

介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频数,从而提高运行性能。

缓存被广泛应用的用于优化数据库。当一些数据被从数据库中读取出来的时候,我们可以把它们放到缓存里。这样我们可以再次使用的时候直接从缓存中取出来,这样我们的效率就提高了很多。

控制范围:

一级缓存是session对象的生命周期通常对应的一个数据库事务或者一个应用事务,它是事务范围内的缓存

二级缓存是一个可插拔的缓存插件,它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应,所以二级缓存是进城范围或者集群范围内的缓存。用于初始化很少更改的数据、不重要的数据,不会并发访问的数据。

 

Hibernate缓存的一些问题和建议:hibernate的缓存

第四点:捉取策略

1.  捉取优化:Hibernate在关联关系之间进行导航,充分利用Hibernate提供的技术

2.  如何捉取

立即捉取:当捉取宿主对象时,同时捉取其相关对象和关联集以及属性

延迟加载:当捉宿主对象时,并不捉取其关联对象,而是当对其对象进行调用时才加载。

3.  捉取粒度:设置捉取个数

第五点:批量数据处理(修改和删除)

在Hibernate2中,如果需要对任何数据进行修改和删除操作都需要先执行查询操作,在得到数据后才进行修改和删除。

1.  不适用Hibernate API而是直接使用JDBC  API来做原生态SQL语句进行查询,这种方法比较好,相对来说较快。

2.  运用存储过程

3.  一定量范围内可以使用hibernate API,但是特大数据量不行。

第六点:结果集的使用:

     结果集的使用:list()和iterator()区别

查询方式:

list只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但是list查出的对象会写入二级缓存,但它一般只生成较少的sql语句,很多情况就是一条。

iterator则利用二级缓存,对于一条查询语句,它会先从数据库中找到所有符合条件的记录的ID,在通过ID去缓存找,对于缓存中没有的记录,在构造语句从数据库查出,第一次的执行会产生N+1条SQL语句。

产生结果:

用list可能会溢出

通过Iterator,配合缓存管理API,在海量数据查询中可以很好的解决内存问题。

综合考虑

一般List会填充二级缓存,却不能利用二级缓存,而Iterator可以读二级缓存,然而无法命中的话,效率很低效。一般处理方法,就是第一次查询使用list,随后使用iterator查询。

总结

 

Hibernate优化总结还有主配置、方法选用、事物控制没有涉及到,因为它们相对来说这些方面比较简单,但是还是很重要的。

在实施一个项目的时候我们没有必要想这些问题,做项目的时候第一步运行起来,第二步优化一下。在很多小型项目中第二步一般都不会去做,所以说我们做工程的时候还是要牢记运行出来,假如自己作为研究或者这个问题比较严重的话我们才考虑优化。

Hibernate调优方面没有最有只有更优,让我们不断积极找到优化的方法,来优化我们的程序,来优化我们自己。

关于Hibernate优化方面,希望大家留下宝贵的意见,多对交流!

posted @ 2012-07-12 13:15 tbwshc| 编辑 收藏

Sql Server临时表的生存周期可能很多人都不是非常了解,下文就为您介绍Sql Server临时表的生存周期,供您参考,希望对您能有所帮助。

局部临时表#temp_table:
只在当前会话结有效。会话终止则生存终止。
根据session不同开辟不一样的内存存放数据。
相同session的用户可以使用同一张临时表,只能create table 一次。
不同session建的临时表,即使表名相同,指向的内存也是不一样的,互相内容不可见。

全局临时表##temp_table:
顾名思义,不同的session可以使用同一块内存。但是其中的内容到底什么时候才被回收呢?

自己做了一个测试,结果用小白文说起来就是:
只要有任何session用到过这个表,且这些session没有被全部终止,就不被回收。
所谓session终止,我的理解,就sqlserver本身来说就是query窗体被关掉。如果是因为有应用程序连接而产生的session的话(以上所说的session都是sqlserver的session),web系就是session重启(IIS application pool重启,这里所说的session是http的session),应用系的话就是充启应用程序了(←猜想,没试过)。

下面是网上找的,tb概括一下机能就是,创建一个不被自动回收的全局临时表。没有经过测试,虽然貌似看上去没啥意义,和常规表有什么区别?说不定以后有用,所以还是记下来:
USE master;
GO
IF OBJECT_ID('dbo.sp_Globals') IS NOT NULL
  DROP PROC dbo.sp_Globals
GO
CREATE proc dbo.sp_Globals
AS
CREATE TABLE ##Globals
(
id varchar(36) NOT NULL PRIMARY KEY
value varchar(500)
)
GO
↑sp内容

EXEC dbo.sp_procoption 'dbo.sp_Globals','startup','true';

只有显示删除##Globals才会被清除

以上Sql Server临时表的生存周期的介绍。

posted @ 2012-07-08 10:53 tbwshc 阅读(923) | 评论 (0)编辑 收藏

Oracle临时表在实际开发中的应用是本文我们主要要介绍的内容,我们知道,SQL Server 在编写查询式的存储过程的时候,一直都令我为之赞叹。Create procedure ps_procedure_name as select * from table; Select查询语句可以作为SQL Server存储过程的一部分,直接返回结果集。但在Oracle实现这种形式的存储过程是不合语法的。

为了达到这种目的,我们需要使用Oracle临时表(这是其中一种解决方案)。

Oracle数据库除了可以保存永久表外,还可以建立临时表temporary tables。Oracle临时表分为会话级临时表(ON COMMIT PRESERVE ROWS)和事务级临时表(ON COMMIT DELETE ROWS)。tb会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。

事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。

//在数据库建立一个临时表:

 

  1. CREATE GLOBAL TEMPORARY TABLE ESPS.ESPS_EMP_RANK_TEMP  
  2. (  
  3. COM                VARCHAR2(20 BYTE),  
  4. EMPNO             VARCHAR2(20 BYTE),  
  5. EMPNAME          VARCHAR2(100 BYTE),  
  6. DEPTNAME         VARCHAR2(300 BYTE),  
  7. AMOUNT            NUMBER,  
  8. APPROVED_AMOUNT  NUMBER,  
  9. FOLDING_AMOUNT   NUMBER,  
  10. BENEFIT          NUMBER,  
  11. EXECUTED_RATE    NUMBER,  
  12. FOLDING_RANK     NUMBER,  
  13. BENEFIT_RANK     NUMBER,  
  14. RANK             NUMBER,  
  15. TOTAL_RANK       NUMBER  
  16. )  
  17. //ON COMMIT PRESERVE ROWS         --这里代表的是事务级临时表  
  18. ON COMMIT PRESERVE ROWS          --这里代表的是会话级临时表 

 

在实际的操作中,我就验证过上面所说的。一开始我使用了事务级临时表,将数据插入到临时表时,使用commit操作,结果临时表的内容清空了。例如是:INSERT INTO ESPS_EMP_RANK_TEMP select * from table;commint;执行这两段SQL后,相当于没有插入数据。

如果我们使用会话级临时表,即使使用了commit,临时表中的内容还是存在的。直到会话断开时,临时表中的内容才真正的清空。所以,在实际的开发过程中,我们因该结合场景,使用不同类型的临时表。

在建议提案系统开发的过程中,我使用了会话级的临时表。将查询的数据插入到临时表中,并且读取临时表的内容,会话断开时,临时表中的内容自动清空。 

在C#里面调用的三大步骤:

//C#里面定义的一个String类型的变量,存储一段动态SQL,存储过程为:

  1. ESPS_EMP_RANK_STATISTIS({0},'{1}')  
  2. public static string I_EMP_RANK_STATISTIS = "BEGIN ESPS_EMP_RANK_STATISTIS({0},'{1}'); END;"

 

//执行存储过程,把结果集插入到临时表ESPS_EMP_RANK_TEMP

 

  1. WAF.COM.Core.OracleHelper. ExecuteNonQuery(conn, CommandType.Text, string.Format(SqlCollector.I_EMP_RANK_STATISTIS, 2,’2011’)); 

 

//读取临时表中保存的结果集

 

  1. Oracle DataReader dr = WAF.COM.Core.OracleHelper. ExecuteReader(“select * from ESPS_EMP_RANK_TEMP”) 

 

关于Oracle临时表在实际开发中的应用的相关知识就介绍到这里了,希望本次介绍能够对您有所收获!

posted @ 2012-07-08 10:49 tbwshc 阅读(921) | 评论 (0)编辑 收藏

Oracle数据库创建临时表的过程以及和SQL Server临时表的不同点的对比的相关知识是本文我们主要要介绍的内容,接下来就让我们一起来了解一下这部分内容吧,希望能够对您有所帮助。

1.简介

Oracle数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空,但是临时表的结构以及元数据还存储在用户的数据字典中。

2.详细介绍

Oracle临时表分为会话级临时表和事务级临时表。

会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。

事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。

临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此,临时表不需要DML锁。

当一个会话结束(用户正常退出 用户不正常退出 ORACLE实例崩溃)或者一个事务结束的时候,Oracle对这个会话的表执行 TRUNCATE 语句清空临时表数据.但不会清空其它会话临时表中的数据.

你可以索引临时表和在临时表基础上建立视图.同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效. 临时表可以拥有触发器.

3.建立临时表

临时表的定义对所有会话SESSION都是可见的,但是表中的数据只对当前的会话或者事务有效.

建立方法:

  1. 1) ON COMMIT DELETE ROWS 定义了建立事务级临时表的方法.  
  2. CREATE GLOBAL TEMPORARY TABLE admin_work_area  
  3. (startdate DATE,  
  4. enddate DATE,  
  5. class CHAR(20))  
  6. ON COMMIT DELETE ROWS;  
  7. EXAMPLE:  
  8. SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area  
  9. 2 (startdate DATE,  
  10. 3 enddate DATE,  
  11. 4 class CHAR(20))  
  12. 5 ON COMMIT DELETE ROWS;  
  13. SQL> create table permernate( a number);  
  14. SQL> insert into admin_work_area values(sysdate,sysdate,'temperary table');  
  15. SQL> insert into permernate values(1);  
  16. SQL> commit;  
  17. SQL> select * from admin_work_area;  
  18. SQL> select * from permernate;  
  19. A  
  20. 1  
  21. 2)ON COMMIT PRESERVE ROWS 定义了创建会话级临时表的方法.  
  22. CREATE GLOBAL TEMPORARY TABLE admin_work_area  
  23. (startdate DATE,  
  24. enddate DATE,  
  25. class CHAR(20))  
  26. ON COMMIT PRESERVE ROWS;  
  27. EXAMPLE: 

 

会话1:

  1. SQL> drop table admin_work_area;  
  2. SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area  
  3. 2 (startdate DATE,  
  4. 3 enddate DATE,  
  5. 4 class CHAR(20))  
  6. 5 ON COMMIT PRESERVE ROWS;  
  7. SQL> insert into permernate values(2);  
  8. SQL> insert into admin_work_area values(sysdate,sysdate,'session temperary');  
  9. SQL> commit;  
  10. SQL> select * from permernate;  
  11. A  
  12. ----------  
  13. 1  
  14. 2  
  15. SQL> select * from admin_work_area;  
  16. STARTDATE ENDDATE CLASS  
  17. ---------- ---------- --------------------  
  18. 17-1?? -03 17-1?? -03 session temperary 

 

会话2:

  1. SQL> select * from permernate;  
  2. A  
  3. ----------  
  4. 1  
  5. 2  
  6. SQL> select * from admin_work_area;  
  7. 未选择行. 

 

会话2看不见会话1中临时表的数据。

4.Oracle临时表和SQL Server临时表异同

SQL Server也可以创建临时表。临时表与永久表相似,但临时表存储在tempdb中,当不再使用时会自动删除。

有本地和全局两种类型的临时表,二者在名称、可见性和可用性上均不相同。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 Microsoft SQL Server实例断开连接时被删除。全局临时表的名称以数学符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。

SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的名称引用临时表:

  1. CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)  
  2. INSERT INTO #MyTempTable VALUES (1) 

 

如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 数据库的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名 table_name 不能超过116 个字符。

除非使用 DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:

当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。

所有其它本地临时表在当前会话结束时自动除去。

全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的Transact-SQL语句完成后,将自动除去此表。

例如,如果创建名为 employees 的表,则任何人只要在数据库中有使用该表的安全权限就可以使用该表,除非它已删除。如果创建名为 #employees 的本地临时表,只有您能对该表执行操作且在断开连接时该表删除。如果创建名为 ##employees 的全局临时表,数据库中的任何用户均可对该表执行操作。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果该表在您创建后有其他用户使用,则 SQL Server在所有用户断开连接后删除该表。

在存储过程或触发器中创建的本地临时表与在调用存储过程或触发器之前创建的同名临时表不同。如果查询引用临时表,而同时有两个同名的临时表,则不定义针对哪个表解析该查询。tb嵌套存储过程同样可以创建与调用它的存储过程所创建的临时表同名的临时表。嵌套存储过程中对表名的所有引用都被解释为是针对该嵌套过程所创建的表,例如:

 

  1. CREATE PROCEDURE Test2  
  2. AS  
  3. CREATE TABLE #t(x INT PRIMARY KEY)  
  4. INSERT INTO #t VALUES (2)  
  5. SELECT Test2Col = x FROM #t  
  6. GO  
  7. CREATE PROCEDURE Test1  
  8. AS  
  9. CREATE TABLE #t(x INT PRIMARY KEY)  
  10. INSERT INTO #t VALUES (1)  
  11. SELECT Test1Col = x FROM #t  
  12. EXEC Test2  
  13. GO  
  14. CREATE TABLE #t(x INT PRIMARY KEY)  
  15. INSERT INTO #t VALUES (99)  
  16. GO  
  17. EXEC Test1  
  18. GO  

 

下面是结果集:

  1. (1 row(s) affected)  
  2. Test1Col   
  3. -----------   
  4. 1   
  5. (1 row(s) affected)  
  6. Test2Col   
  7. -----------   

 

当创建本地或全局临时表时,CREATE TABLE 语法支持除 FOREIGN KEY 约束以外的其它所有约束定义。如果在临时表中指定 FOREIGN KEY 约束,该语句将返回警告信息,指出此约束已被忽略,表仍会创建,但不具有 FOREIGN KEY 约束。在 FOREIGN KEY 约束中不能引用临时表。

考虑使用表变量而不使用临时表。当需要在临时表上显式地创建索引时,或多个存储过程或函数需要使用表值时,临时表很有用。通常,表变量提供更有效的查询处理。

和Oracle的不同点:

1. SQL Server临时表是一种”内存表”,tb表是存储在内存中的.ORACLE临时表除非执行DROP TABLE,否则表定义会保留在数据字典中。

2. SQL Server临时表不存在类似ORACLE临时表事务级别上的功能。

3.SQL Server本地临时表(#) 与 ORACLE的会话级别临时表类似,但是在会话退出的时候,ORACLE不会删除表。

4.SQL Server的全局临时表(##) 是指多个连接共享同一片内存.当没有指针引用该内存区域时,SQL Server自动释放全局临时表。

5.由于Oracle不是一种内存中的数据库. 所以如果Oracle类似SQL Server 频繁的对临时表进行建立和删除,必定会影响性能.所以Oracle会保留临时表的定义直到用户DROP TABLE。

6.在Oracle中,如果需要多个用户共享一个表(类似SQL Server的全局临时表##).则可以利用永久表,并且在表中添加一些可以唯一标识用户的列.利用触发器和视图.当用户退出的时候,根据该登陆用户的唯一信息删除相应的表中的数据. 这种方法给Oracle带来了一定量的负载。

 

关于Oracle临时表和SQL Server临时表的不同点对比的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

posted @ 2012-07-08 10:47 tbwshc 阅读(850) | 评论 (0)编辑 收藏

Oracle临时表可以说是提高数据库处理性能的好方法,在没有必要存储时,只存储在Oracle临时表空间中。希望本文能对大家有所帮助。

1 、前言

 

Oracle Logo

目前所有使用 Oracle 作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。

当然在 Oracle 中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小并且查询得到这个结果集的速度非常快,那么这个时候我考虑在 Oracle 中创建“临时表”。

我对临时表的理解:在 Oracle 中创建一张表,这个表不用于其他的什么功能,主要用于自己的软件系统一些特有功能才用的,而当你用完之后表中的数据就没用了。 Oracle 的临时表创建之后基本不占用表空间,如果你没有指定临时表(包括临时表的索引)存放的表空的时候,你插入到临时表的数据是存放在 ORACLE 系统的临时表空间中( TEMP )。

2 、临时表的创建

创建Oracle 临时表,可以有两种类型的临时表:

会话级的临时表

事务级的临时表 。

1) 会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION 不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION 的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION 登陆的时候是看不到另外一个SESSION 中插入到临时表中的数据的。即两个不同的SESSION 所插入的数据是互不相干的。当某一个SESSION 退出之后临时表中的数据就被截断(truncate table ,即数据清空)了。会话级的临时表创建方法:


Create Global Temporary Table Table_Name  (Col1 Type1,Col2 Type2...) On Commit Preserve Rows ;
举例:


create global temporary table Student  (Stu_id Number(5),  Class_id Number(5),  Stu_Name Varchar2(8),  Stu_Memo varchar2(200)) on Commit Preserve Rows ;
2) 事务级临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION 的时候,事务级的临时表也会被自动截断)。事务级临时表的创建方法:


Create Global Temporary Table Table_Name  (Col1 Type1,Col2 Type2...) On Commit Delete Rows ;
举例:

create global temporary table Classes  (Class_id Number(5),  Class_Name Varchar2(8),  Class_Memo varchar2(200)) on Commit delete Rows ; 3) 两中类型临时表的区别

会话级临时表采用 on commit preserve rows ;而事务级则采用 on commit delete rows ;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是 commit 、 rollback 或者是会话结束,tb临时表中的数据都将被截断

4 )什么时候使用临时表

1 )、当某一个 SQL 语句关联的表在 2 张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中

2 )、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。

3 . 例子:略

4 .临时表的不足之处

1 )不支持 lob 对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。

2 )不支持主外键关系

所以,由于以上原因,我们可以自己创建临时表,以弥补 oracle 临时表的不足之处

上面的都是本人经过测试的,但下面是在网上搜索到的方法,本人具体没有测试过,不过觉得可行性很强,有时间测试下

创建方法:

1 、以常规表的形式创建临时数据表的表结构,但要在每一个表的主键中加入一个 SessionID 列以区分不同的会话。(可以有 lob 列和主外键)

2 、写一个用户注销触发器,在用户结束会话的时候删除本次会话所插入的所有记录 (SessionID 等于本次会话 ID 的记录 ) 。

3 、程序写入数据时,要顺便将当前的会话 ID(SessionID) 写入表中。

4 、程序读取数据时,只读取与当前会话 ID 相同的记录即可。

功能增强的扩展设计:

1 、可以在数据表上建立一个视图,视图对记录的筛选条件就是当前会话的SessionID 。

2 、数据表中的SessionID 列可以通过Trigger 实现,以实现对应用层的透明性。

3 、高级用户可以访问全局数据,以实现更加复杂的功能。

扩展临时表的优点:

1 、实现了与Oracle 的基于会话的临时表相同的功能。

2 、支持SDO_GEOMETRY 等lob 数据类型。

3 、支持表间的主外键连接,且主外键连接也是基于会话的。

4 、高级用户可以访问全局数据,以实现更加复杂的功能

 

posted @ 2012-07-07 13:26 tbwshc 阅读(861) | 评论 (0)编辑 收藏

经验总结:

联机日志分为当前联机日志和非当前联机日志,非当前联机日志的损坏是比较简单的,一般通过clear命令就可以解决问题。

损坏非当前联机日志:
1、启动数据库,遇到ORA-00312 or ORA-00313错误,如:
ORA-00313: open failed for members of log group 4 of tbhread 1
ORA-00312: online log 3 thread 1: '/opt/oracle/db04/oradata/ORCL/redo03.log'
从这里我们知道日志组1的数据文件损坏或丢失了
从报警文件可以看到更详细的信息
2、查看V$log视图:
SQL> select group#,sequence#,archived,status from v$log;

GROUP# SEQUENCE# ARC STATUS

---------- ---------- --- ----------------

1 54 YES INACTIVE

2 55 NO CURRENT

3 53 YES INACTIVE

可以知道,该组是非当前状态,而且已经归档。
3、用CLEAR命令重建该日志文件
SQL>alter database clear logfile group 3;
如果是该日志组还没有归档,则需要用
SQL>alter database clear unarchived logfile group 3;
4、打开数据库,重新备份数据库
SQL>alter database open;
说明:
1)、如果损坏的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库处于归档状态但该日志还没有归档,就需要强行clear。
2)、建议clear,特别是强行clear后作一次数据库的全备份。
3)、此方法适用于归档与非归档数据库。

损坏当前联机日志:

归档模式下当前日志的损坏有两种情况,
一、是数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损坏就可以直接用alter database clear unarchived logfile group n来重建。
二、是日志组中有活动的事务,数据库需要媒体恢复,日志组需要用来同步,有两种补救办法
A. 最好的办法就是通过不完全恢复,可以保证数据库的一致性,但是这种办法要求在归档方式下,并且有可用的备份
B. 通过强制性恢复,但是可能导致数据库不一致。
下面分别用来说明这两种恢复方法
5.1.2.1 通过备份来恢复
1、打开数据库,会遇到一个类似的错误
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系统找不到指定的文件

2、查看V$log,发现是当前日志
SQL> select group#,sequence#,archived,status from v$log;

GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
1 1 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE

3、发现clear不成功
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'

4、拷贝有效的数据库的全备份,并不完全恢复数据库
可以采用获取最近的SCN的办法用until scn恢复或用until cnacel恢复
recover database until cancel
先选择auto,尽量恢复可以利用的归档日志,然后重新
recover database until cancel
这次输入cancel,完成不完全恢复,也就是说恢复两次。
如:
SQL> recover database until cancel;
Auto
……
SQL> recover database until cancel;
Cancel;
5、利用alter database open resetlogs打开数据库
说明:
1、这种办法恢复的数据库是一致的不完全恢复,会丢失当前联机日志中的事务数据
2、这种方法适合于归档数据库并且有可用的数据库全备份。
3、恢复成功之后,记得再做一次数据库的全备份。
4、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

如果没有备份,进行强制性恢复
1、打开数据库,会遇到一个类似的错误
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系统找不到指定的文件

2、查看V$log,发现是当前日志
SQL> select group#,sequence#,archived,status from v$log;

GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
1 1 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE

3、发现clear不成功
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: 'D:ORACLEORADATATESTREDO01.LOG'

4、把数据库down掉
SQL>shutdown immediate

5、在init<sid>.ora中加入如下参数
_allow_resetlogs_corruption=TRUE

6、重新启动数据库,利用until cancel恢复
SQL>recover database until cancel;
Cancel
如果出错,不再理会,发出
SQL>alter database open resetlogs;

7、数据库被打开后,马上执行一个full export

8、shutdown数据库,去掉_all_resetlogs_corrupt参数

9、重建库

10、import并完成恢复

11、建议执行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE;
说明:
1、该恢复方法是没有办法之后的恢复方法,一般情况下建议不要采用,因为该方法可能导致数据库的不一致
2、该方法也丢失数据,但是丢失的数据没有上一种方法的数据多,主要是未写入数据文件的已提交或未提交数据。
3、建议成功后严格执行以上的7到11步,完成数据库的检查与分析
4、全部完成后做一次数据库的全备份
5、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。

posted @ 2012-07-07 13:24 tbwshc 阅读(164) | 评论 (0)编辑 收藏

仅列出标题
共10页: First 2 3 4 5 6 7 8 9 10