燕之庐网站建设 - 优质网站设计公司

Archive for 12月, 2009

网站建设

2009/12/31

如何高效删除Oracle数据库中的重复数据

Tags: ,

在对数据库进行操作过程中我们可能会遇到这种情况,表中的数据可能重复出现,使我们对数据库的操作过程中带来很多的不便,那么怎么删除这些重复没有用的数据呢?

重复数据删除技术可以提供更大的备份容量,实现更长时间的数据保留,还能实现备份数据的持续验证,提高数据恢复服务水平,方便实现数据容灾等。重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样。Oracle数据库重复数据删除技术有如下优势:更大的备份容量、数据能得到持续验证、有更高的数据恢复服务水平、方便实现备份数据的容灾。

一、删除部分字段重复数据

先来谈谈如何查询重复的数据吧。

下面语句可以查询出那些数据是重复的:

select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1

将上面的>号改为=号就可以查询出没有重复的数据了。

想要删除这些重复的数据,可以使用下面语句进行删除:

delete from 表名 a where 字段1,字段2 in

(select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)

上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以我建议先将查询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:

CREATE TABLE 临时表 AS

(select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)

上面这句话就是建立了临时表,并将查询到的数据插入其中。

下面就可以进行这样的删除操作了:

delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);

这种先建临时表再进行删除的操作要比直接用一条语句进行删除要高效得多。

这个时候,大家可能会跳出来说,什么?你叫我们执行这种语句,那不是把所有重复的全都删除吗?而我们想保留重复数据中最新的一条记录啊!大家不要急,下面我就讲一下如何进行这种操作。

在Oracle中,有个隐藏了自动ROWID,里面给每条记录一个唯一的ROWID,我们如果想保留最新的一条记录,我们就可以利用这个字段,保留重复数据中ROWID最大的一条记录就可以了。

下面是查询重复数据的一个例子:

select a.rowid,a.* from 表名 a
where a.rowid !=
(
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)

下面我就来讲解一下,上面括号中的语句是查询出重复数据中ROWID最大的一条记录。

而外面就是查询出除了ROWID最大之外的其他重复的数据了。

由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:

delete from 表名 a
where a.rowid !=
(
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)

随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、ROWID插入临时表中,然后删除的时候在进行比较。

create table 临时表 as
select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;
delete from 表名 a
where a.rowid !=
(
select b.dataid from 临时表 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
);
commit;

二、完全删除重复记录

对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:

select distinct * from 表名

可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:

CREATE TABLE 临时表 AS (select distinct * from 表名);
truncate table 正式表; --注:原先由于笔误写成了drop table 正式表;,现在已经改正过来
insert into 正式表 (select * from 临时表);
drop table 临时表;

如果想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从临时表将数据导入正式表中,如下:

INSERT INTO t_table_bak

select distinct * from t_table;

三、怎样快速删除Oracle数据库

最快的方法就进入注册表在运行里输入regedit,依次展开HKEY_LOCAL_MACHINE SOFTWARE,找到Oracle节点。删除。然后删除Oracle数据文件,安装的时候选的路径。最后删除Oracle引导文件,在系统盘符的 Program Files 里面删除Oracle文件夹。

网站建设公司

产业新闻, 开源动态

Oracle性能调整与优化(三)

Tags: ,

正如在第1和第2部分中提到那样,有几个相对容易的改善性能的步骤你可以采取,这些步骤其中一个涉及到使用自动化工具“指导”你编写SQL语句,有许多生产性能分析或性能调整工具的厂家,在接下来的文章中,我们将对它们中的一个进行考察。

Quest Software

许 多DBA和开发者使用一个名叫Toad的工具,它出自Quest Software公司,按照Quest Software网站上说法,Toad用户社区大约有500,000数量的用户,Toad的一个特色就是它有能力优化SQL查询,换句话说,Oralce 公司还没有占领调整顾问类型工具的市场。

关于顾问工具你有多种选择,理解它们是做什么的,如果你没有工作在生产或开发环境中你使用它们做什么?可能仅仅是喜欢,即使你处于一个开发环境,但你可能也没有使用到非常大的数据,本文的焦点集中在如何产生大量的数据,我们将介绍Quest Software的另一个产品:DataFactory for Oracle

DataFactory

DataFactory的用途是为多种数据库平台快速创建有意义的测试数据,包括Oracle、DB2、Sybase以及ODBC兼容的数据库,正常情况下,每服务器零售价为595美元,在Quest Software的网站有一个可免费使用30天的版本可下载。

要获得这个软件(目前是5.5.0版本),你必须用真实的电子邮件地址注册,hotmail和gmail会被拒绝的,一旦你注册成功了,你将收到一封包含密钥的邮件,这个密钥用于解锁应用程序,开始30天的试用。

安装过程是相当简单的,如果你运行了微软的AntiSpyware,你可能会收到一个或多个错误,禁用掉实时保护后重新安装。

创建辅助对象

了解应用程序较好的方法是使用它的辅助对象,一般的过程有:

1、创建一个项目

2、在方案中创建表

3、运行脚本载入数据

不幸的是,在禁用了系统名参考的约束上获取刷新最好的方法是使用内置的辅助对象,使用一个反复的处理方法,可以禁用掉所有约束直到载入脚本运行不出现错误为止,然而,当Quest运行时修复了这个bug时,我可以标识和禁用这个约束。

启动DataFactory后,你可以选择启动自学教材,关于如何载入自学教材对象的指令(也就是所有的帮助)都在HTML文件中。

帮助系统中的指令规定了使用哪些表,但那是不准确的,下一步我会提到要用到哪些表(总共15个,都是以DF_前缀开头的)。

要创建辅助对象,安装下列步骤做:

1、选择工具(Tools)创建辅助对象(Create Tutorial Objects),显示辅助对象创建向导。

2、从选择连接方法的下拉列表中选择合适的数据库类型。

3、点击下一步(Next)。

4、输入连接参数。

5、点击下一步(Next),显示完成页面。

6、点击完成(Finish),DataFactory辅助表就创建好了。

在创建表之前,你应该在数据库中先创建一个单独的方案对象,使用Oracle 10g,我创建了一个quest用户对象/方案(授予它connect和resource权限即可)。

点击Tools Create Tutorial Objects

辅助设置向导显示它自己的版本和oracle的logo

在完成页显示一列表名

DataFactory告诉你创建成功了

在左边框架中显示了项目文件夹

在 主菜单上点击运行按钮(Run),立即报出ORA-02291错误,这是违反了完整性约束的错误提示(某些表上还不止一次),因为在一个外键关联的列上载 入的数据没有同时往主表插入对应的数据,几乎所有的约束命名都采取SYS_Cxxxxxx命名结构,意味着它们不是明确的名字。

为了解决完整性约束问题,你可以禁用掉约束(只要你知道要修改哪个表),下面的查询和ALTER TABLE命令显示识别并禁用有问题的约束:

SQL> select owner, constraint_name, table_name, column_name
2  from all_cons_columns
3  where constraint_name like '%9814%';
OWNER CONSTRAINT_NAME                TABLE_NAME           COLUMN_NAME
----- ------------------------------ -------------------- ------------
QUEST SYS_C009814                    DF_ORDERS            CUSTID
SQL> alter table df_orders
2  disable constraint sys_c009814;
Table altered.

结果(Results)窗口显示你的脚本完全成功执行了,意味着你可以看看究竟创建了些什么。

不是一次分析一个表,使用内置的DBMS_STATS(它是Oracle推荐的分析工具包),如果你使用的是Oracle 10g,你应该添加一个WHERE dropped=’NO’条件阻止在显示查询结果时显示被删掉的表。

SQL> execute dbms_stats.gather_schema_stats('QUEST');
PL/SQL procedure successfully completed.
SQL> select table_name, num_rows
2  from user_tables
3  where dropped='NO';
TABLE_NAME             NUM_ROWS
-------------------- ----------
DF_TITLES                   100
DF_MOVIE_CUSTOMER          1100
DF_MOVIE_EMPLOYEE           900
DF_DUMMY                   1100
DF_AUTHORS_TITLES          1100
DF_MOVIE_RENTAL             700
DF_PRODUCTS                 100
DF_MOVIE_TAPE               400
DF_CUSTOMERS               1100
DF_AUTHORS                 1100
DF_MOVIE_DISTRICT          1100
DF_ORDERS                   101
DF_MOVIE_MOVIE              900
DF_ORDERDETAILS             200
DF_MOVIE_STORE              500
15 rows selected.

返回项目或列表,在列表中选择一个表,将会显示它的列和列的数据类型,你可能需要在结果(Results)和子段(Children)之间使用固定按钮功能。

使用DF_MOVIE_CUSTOMER作为一个例子,如何查看它的数据?随机字符串选项刚好准确地用于这里。

辅助表上更多的内容

在外键列上有索引吗?

SQL> select index_name, table_name, column_name, column_position
2  from user_ind_columns;
INDEX_NAME   TABLE_NAME           COLUMN_NAME          COLUMN_POSITION
------------ -------------------- -------------------- ---------------
SYS_C009823  DF_MOVIE_DISTRICT    DISTRICTID                         1
SYS_C009827  DF_MOVIE_STORE       STOREID                            1
SYS_C009830  DF_MOVIE_EMPLOYEE    EMPID                              1
SYS_C009837  DF_MOVIE_CUSTOMER    CUSTID                             1
SYS_C009841  DF_MOVIE_MOVIE       MOVIEID                            1
SYS_C009845  DF_MOVIE_TAPE        TAPEID                             1
SYS_C009850  DF_MOVIE_RENTAL      TAPEID                             1
SYS_C009850  DF_MOVIE_RENTAL      CUSTID                             2
SYS_C009850  DF_MOVIE_RENTAL      RENTDATE                           3
SYS_C009810  DF_CUSTOMERS         CUSTID                             1
SYS_C009813  DF_ORDERS            ORDERID                            1
SYS_C009816  DF_PRODUCTS          PRODUCTID                          1
SYS_C009819  DF_ORDERDETAILS      ORDERID                            1
SYS_C009819  DF_ORDERDETAILS      PRODUCTID                          2
14 rows selected.

输 出内容意味着什么?你可以立即判断出这样一个事实,不是所有表上都有主键,有15个表,但这里只返回了14行(或如果使用distinct的话,只返回 11行),为什么我们会知道这个结果?因为创建主键时会自动创建一个索引,如果你在载入脚本中禁用了所有的引用完整性约束,你还会怀疑什么呢?

Oracle推荐将索引列作为经常访问的关联列,常见的规则是索引列用于where子句,缺少索引,你应该怀疑“create  table”部分没有创建外键索引列。

下面的查询显示了带外键的表名/列名:

SQL> select a.constraint_name, b.constraint_type,
2  a.table_name, a.column_name
3  from user_cons_columns a, all_constraints b
4  where a.constraint_name=b.constraint_name
5  and constraint_type = 'R';
CONSTRAINT_NAME  C TABLE_NAME           COLUMN_NAME
---------------- - -------------------- -------------
SYS_C009831      R DF_MOVIE_EMPLOYEE    SUPERVISORID
SYS_C009828      R DF_MOVIE_STORE       DISTRICTID
SYS_C009821      R DF_ORDERDETAILS      PRODUCTID
SYS_C009820      R DF_ORDERDETAILS      ORDERID
DFMOVIESTOREFK2  R DF_MOVIE_STORE       MANAGERID
SYS_C009852      R DF_MOVIE_RENTAL      TAPEID
SYS_C009851      R DF_MOVIE_RENTAL      CUSTID
SYS_C009838      R DF_MOVIE_CUSTOMER    STOREID
SYS_C009814      R DF_ORDERS            CUSTID
SYS_C009846      R DF_MOVIE_TAPE        MOVIEID
DFMOVIEEMPFK2    R DF_MOVIE_EMPLOYEE    STOREID
11 rows selected.

这是最终结果吗?怀疑被证实了,外键没有被索引。

从管理和维护角度来看,为什么只有两个约束是明确命名的而剩下的都是系统命名的?实际上是这个方案总共有51个约束,这里只是发生了两个命名的约束。

小结

从 这次探索来看,工具如DataFactory或你自己编写的脚本最关键的地方是能够产生百万计的测试样本数据,如果不能保证引用完整性,或在数据建模方面 的最佳实践,它有什么好处?如果你打算在应用程序上调试查询,测试数据需要反应应用程序如何使用它。如果你依赖于数据完整性,你的测试数据需要支持并遵从 父表/子表关联关系。

从设计的立场来看,有两个最佳实践容易被违背,其一是外键列无索引,其二是3个主要项目(主键、外键和索引)没有明确 的名字。第三个可能是在表上无主键,难道在每个表上都需要主键吗?不是!但大多数情况下,每个表都需要主键,即使没有主键,你也要知道为什么没有设置主 键,换句话说,不规范的表应该是有意识的决定,而不是失败。

【51CTO译稿】

网站建设

产业新闻

适用于SQL Server生产环境DBA的七大技巧

Tags: ,

由于SQL Server的普及程度非常高,也出现了大量的辅助工具,让DBA感觉眼花缭乱,为了避免在这些工具堆中不知所措,本文将向那些管理生产系统的DBA提供一些工具选择及使用方面的技巧,让他们的工作变得更简单。

1、使用forfiles命令删除陈旧的数据库备份文件

Windows Server 2003开始forfiles命令就是Windows的一个自带命令行工具,它主要用于对文件的批处理,利用SQL Server代理作业,加上这个工具,可以删除SQL Server陈旧的数据库备份文件,以往这个工作一般都依赖于SQL Server维护计划、xp_cmdshell扩展存储过程,或VBScript对象。下面的forfiles命令删除了E:\sqlbackup文件夹 下两天及两天以前的所有.bak文件。

forfiles /p “e:\sqlbackup” /m “*.bak” /c “cmd /c del /Q @path” /d -2

关于forfiles的具体用法请查看其命令行帮助说明,或参考微软的官方文档:http://technet2.microsoft.com /WindowsServer/en/Library/9660fea1-65c7-48cf-b466-204ba159381e1033.mspx。

2、使用ALTER USER WITH LOGIN修复孤儿登录

从SQL Server 2005 SP2开始,T-SQL的ALTER USER命令就包含了WITH LOGIN子句,这个子句通过修改数据库用户的SID为服务器登 录的安全标识符修复孤儿登录,它可以同时修复Windows和SQL Server登录的功能。从另一个服务器恢复数据库,登录是独立的创建的(不是从其它服务器复制过来的),这个时候创建的就是孤儿用户。关于ALTER USER WITH LOGIN的详细情况,请参考Laurentiu Cristofor的博客文章”SQL Server 2005:SP2中的一些新特性”,或者参考SQL Server在线电子书中关于ALTER USER命令的页面。

3、使用sp_addsrvrolemember将自己提升为sysadmin角色

在SQL Server 2005中,默认情况下,Windows内置的Administrators组没有授予它sysadmin角色,作为Windows系统管理员,你可以讲 SQL Server启动到单用户模式(即维护模式),然后在Sqlcmd命令行环境中运行sp_addsrvrolemember系统存储过程,将你的 Windows登录用户添加到sysadmin角色。更多信息请参考Raul Garcia的博客文章”灾难恢复:SQL Server 2005中SA账号密码丢失时该怎么办”

4、使用PortQryUI排除连接故障

为了解决TCP/IP连接问 题,可以选择微软提供的PortQryUI工具,这个工具和PortQry一样好用,其实它就是在PortQry外面套了一层外衣,它内置了一些服务,如 一组端口扫描,包括UDP 1434和TCP 1433端口。因此,要检查这些端口的话,只需要输入目标SQL Server实例的IP地址或完全限定域名 (FQDN)即可,如果检查到端口可访问,PortQryUI就会告诉你端口正在监听,否则,它会告诉你端口可能被过滤掉了,或者没有监听。可以从 http://www.microsoft.com/downloads /details.aspx?FamilyID=8355e537-1ea6-4569-aabb-f248f4bd91d0& displaylang=en下载这个好用的工具。

5、在大型数据库上运行DBCC CHECKDB时采用不同的策略

由于数据库越变越大,使用诸如T-SQL的DBCC CHECKDB命令行工具检查数据库的完整性将会耗费很长时间。如果执行DBCC CHECKDB时超出了分配的维护窗口周期该怎么办?Paul S. Randal在他的博客中提供了几种方法(博 客链接:http://sqlskills.com/BLOGS/PAUL/post/CHECKDB- From-Every-Angle-Consistency-Checking-Options-for-a-VLDB.aspx),其中一个解决办法就 是一台独立的服务器上使用备份还原数据库,然后再在这个服务器上运行DBCC CHECKDB,另一个解决办法就是设置数据库的页面验证选项(从CHECKSUM改为PHYSICAL_ONLY),然后再运行DBCC CHECKDB,这样运行DBCC CHECKDB的时间就大大减小了,但它仍然会影响I/O子系统和页面腐化。

网站建设

产业新闻

MySQL五个查询优化方法

Tags: ,

熟悉SQL的人都知道,完成同一个任务,SQL可能有多种写法,但不同写法的查询性能可能会有天壤之别,本文列举出五个查询优化的方法,当然,优化的方法还有很多。

1、优化数据类型

MySQL中数据类型有多种,如果你是一名DBA,正在按照优化的原则对数据类型进行严格的检查,但开发人员可能会选择他们认为最简单的方案,以加快编码速度,或者选择最明显的选择,因此,你可能面临的都不是最佳的选择,如果可能的话,你应该尝试以通用准则来改变这些决定。  IT专家网独家:MySQL存储过程调试

(1)避免使用NULL

NULL对于大多数数据库都需要特殊处理,MySQL也不例外,它需要更多的代码,更多的检查和特殊的索引逻辑,有些开发人员完全没有意识到,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默认值。

(2)仅可能使用更小的字段

MySQL从磁盘读取数据后是存储到内存中的,然后使用cpu周期和磁盘I/O读取它,这意味着越小的数据类型占用的空间越小,从磁盘读或打包到内存的效率都更好,但也不要太过执着减小数据类型,要是以后应用程序发生什么变化就没有空间了。修改表将需要重构,间接地可能引起代码的改变,这是很头疼的问题,因此需要找到一个平衡点。MySQL中隐藏空间问题介绍

2、小心字符集转换

客户端或应用程序使用的字符集可能和表本身的字符集不一样,这需要MySQL在运行过程中隐含地进行转换,此外,要确定字符集如UTF-8是否支持多字节字符,因此它们需要更多的存储空间。

3、优化count(my_col)和count(*)

如 果你使用MyISAM表,在没有where子句的情况下使用count(*)速度是很快的,因为行数量的统计是非常精确的,因此MySQL不会一行一行地 去找,进而得出行数,如my_col列没有空值,那么和前面说的情况会一样,即count(my_col)速度也会很快。

如果有where子句时使用count( ),基本上就无法进行更多优化了,在where子句中超出了明显的索引列,对于复杂的where子句,只有使用覆盖索引才有用。

除 了上面的建议外,你还可以使用汇总表,它们让你可以对表的内容保持更新,你可以使用触发器,或者应用程序逻辑保持汇总表总是最新状态,或者定期运行一个批 处理作业保持填充最新的数据信息,如果你采用后者,你的信息将会非常接近,但不是精确的,依赖于批处理作业多久运行一次,这需要权衡应用程序对精确信息的 需要,和保持数据更新的系统开销,要在这二者之间找到一个平衡点。

4、优化子查询

遇 到子查询时,MySQL的查询优化引擎并不是总是最有效的,这就是为什么经常将子查询转换为连接查询的原因了,优化器已经能够正确处理连接查询了,当然要 注意的一点是,确保连接表(第二个表)的连接列是有索引的,在第一个表上MySQL通常会相对于第二个表的查询子集进行一次全表扫描,这是嵌套循环算法的 一部分。

5、优化UNION

在跨多个不同的数据库时使用UNION是一个有趣的优化方法,UNION从两个互不关联的表中返回数据,这就意味着不会出现重复的行,同时也必须对数据进行排序,我们知道排序是非常耗费资源的,特别是对大表的排序。

UNION ALL可以大大加快速度,如果你已经知道你的数据不会包括重复行,或者你不在乎是否会出现重复的行,在这两种情况下使用UNION ALL更适合。此外,还可以在应用程序逻辑中采用某些方法避免出现重复的行,这样UNION ALL和UNION返回的结果都是一样的,但UNION ALL不会进行排序。

小结

虽然本文列举的优化方法并不完全,但无论何时,只要可能,尽可能尝试不同的解决方案,查看查询计划,在大数据集上进行测试,并会定位结果基准点,观察在实际应用中的情况怎么样。同时,事先查看一下你的慢速查询日志,尽可能早地找出需要调整的查询。


网站建设

产业新闻

浅析SQL Server三大算法的I/O成本

Tags: ,

本文作者先对SQL Server三大算法的IO成本进行分析,然后提出优化原则。希望可以给读者带来帮助。

1. Nested Loop Join(嵌套循环联结)

算法:

其思路相当的简单和直接:对于关系R的每个元组 r 将其与关系S的每个元组 s 在JOIN条件的字段上直接比较并筛选出符合条件的元组。写成伪代码就是:

代价:

被联结的表所处内层或外层的顺序对磁盘I/O开销有着非常重要的影响。而CPU开销相对来说影响较小,主要是元组读入内存以后(in-memory)的开销,是 O (n * m)

对于I/O开销,根据 page-at-a-time 的前提条件,I/O cost = M + M * N,

翻译一下就是 I/O的开销 = 读取M页的I/O开销 + M次读取N页的I/O开销。

2. Sort-Merge Join (排序合并联结)

Nested Loop一般在两个集合都很大的情况下效率就相当差了,而Sort-Merge在这种情况下就比它要高效不少,尤其是当两个集合的JOIN字段上都有聚集索引(clustered index)存在时,Sort-Merge性能将达到最好。

算法:

基本思路也很简单(复习一下数据结构中的合并排序吧),主要有两个步骤:

a.按JOIN字段进行排序

b.对两组已排序集合进行合并排序,从来源端各自取得数据列后加以比较(需要根据是否在JOIN字段有重复值做特殊的“分区”处理)

代价:(主要是I/O开销)

有两个因素左右Sort-Merge的开销:JOIN字段是否已排序 以及 JOIN字段上的重复值有多少。

◆最好情况下(两列都已排序且至少有一列没有重复值):O (n + m) 只需要对两个集合各扫描一遍。(这里的m,n如果都能用到索引那就更好了)

◆最差情况下(两列都未排序且两列上的所有值都相同):O (n * log n + m * log m + n * m) 两次排序以及一次全部元组间的笛卡尔乘积

3. Hash Join (哈希联结)

Hash Join在本质上类似于两列都有重复值时的Sort-Merge的处理思想——分区(patitioning)。但它们也有区别:Hash Join通过哈希来分区(每一个桶就是一个分区)而Sort-Merge通过排序来分区(每一个重复值就是一个分区)。

值得注意的是,Hash Join与上述两种算法之间的较大区别同时也是一个较大限制是它只能应用于等值联结(equality join),这主要是由于哈希函数及其桶的确定性及无序性所导致的。

算法:

基本的Hash Join算法由以下两步组成:

同nested loop,在执行计划中build input位于上方,probe input位于下方。

hash join操作分两个阶段完成:build(构造)阶段和probe(探测)阶段。

a.Build Input Phase: 基于JOIN字段,使用哈希函数h2为较小的S集合构建内存中(in-memory)的哈希表,相同键值的以linked list组成一个桶(bucket)

b.Probe Input Phase: 在较大的R集合上对哈希表进行核对以完成联结。

代价:

值得注意的是对于大集合R的每个元组 r ,hash bucket中对应 r 的那个bucket中的每个元组都需要与 r 进行比较,这也是算法最耗时的地方所在。

CPU开销是O (m + n * b) b是每个bucket的平均元组数量。

总结

三种join方法,都是拥有两个输入,优化的基本原则:

1.避免大数据的hash join,(hash join适合低并发情况,他占用内存和io是很大的);

2.尽量将其转化为高效的merge join、nested loop join。可能使用的手段有表结构设计、索引调整设计、SQL优化,以及业务设计优化。

站建设

产业新闻

如何高效删除Oracle数据库中的重复数据

Tags:

在对数据库进行操作过程中我们可能会遇到这种情况,表中的数据可能重复出现,使我们对数据库的操作过程中带来很多的不便,那么怎么删除这些重复没有用的数据呢?

重复数据删除技术可以提供更大的备份容量,实现更长时间的数据保留,还能实现备份数据的持续验证,提高数据恢复服务水平,方便实现数据容灾等。重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样。Oracle数据库重复数据删除技术有如下优势:更大的备份容量、数据能得到持续验证、有更高的数据恢复服务水平、方便实现备份数据的容灾。

一、删除部分字段重复数据

先来谈谈如何查询重复的数据吧。

下面语句可以查询出那些数据是重复的:

select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1

将上面的>号改为=号就可以查询出没有重复的数据了。

想要删除这些重复的数据,可以使用下面语句进行删除:

delete from 表名 a where 字段1,字段2 in

(select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)

上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以我建议先将查询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:

CREATE TABLE 临时表 AS

(select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)

上面这句话就是建立了临时表,并将查询到的数据插入其中。

下面就可以进行这样的删除操作了:

delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);

这种先建临时表再进行删除的操作要比直接用一条语句进行删除要高效得多。

这个时候,大家可能会跳出来说,什么?你叫我们执行这种语句,那不是把所有重复的全都删除吗?而我们想保留重复数据中最新的一条记录啊!大家不要急,下面我就讲一下如何进行这种操作。

在Oracle中,有个隐藏了自动ROWID,里面给每条记录一个唯一的ROWID,我们如果想保留最新的一条记录,我们就可以利用这个字段,保留重复数据中ROWID最大的一条记录就可以了。

下面是查询重复数据的一个例子:

select a.rowid,a.* from 表名 a
where a.rowid !=
(
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)

下面我就来讲解一下,上面括号中的语句是查询出重复数据中ROWID最大的一条记录。

而外面就是查询出除了ROWID最大之外的其他重复的数据了。

由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:

delete from 表名 a
where a.rowid !=
(
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)

随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、ROWID插入临时表中,然后删除的时候在进行比较。

create table 临时表 as
select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;
delete from 表名 a
where a.rowid !=
(
select b.dataid from 临时表 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
);
commit;

二、完全删除重复记录

对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:

select distinct * from 表名

可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:

CREATE TABLE 临时表 AS (select distinct * from 表名);
truncate table 正式表; --注:原先由于笔误写成了drop table 正式表;,现在已经改正过来
insert into 正式表 (select * from 临时表);
drop table 临时表;

如果想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从临时表将数据导入正式表中,如下:

INSERT INTO t_table_bak

select distinct * from t_table;

三、怎样快速删除Oracle数据库

最快的方法就进入注册表在运行里输入regedit,依次展开HKEY_LOCAL_MACHINE SOFTWARE,找到Oracle节点。删除。然后删除Oracle数据文件,安装的时候选的路径。最后删除Oracle引导文件,在系统盘符的 Program Files 里面删除Oracle文件夹。

网站建设

产业新闻

memcached全面剖析–5. memcached的应用和兼容程序

Tags: ,

原文链接:http://gihyo.jp/dev/feature/01/memcached/0005

这个系列文章的链接在这里:

我是Mixi的长野。memcached的连载终于要结束了。 到上次为止, 我们介绍了与memcached直接相关的话题,本次介绍一些mixi的案例和 实际应用上的话题,并介绍一些与memcached兼容的程序。

mixi案例研究

mixi在提供服务的初期阶段就使用了memcached。 随着网站访问量的急剧增加,单纯为数据库添加slave已无法满足需要,因此引入了memcached。 此外,我们也从增加可扩展性的方面进行了验证,证明了memcached的速度和稳定性都能满足需要。 现在,memcached已成为mixi服务中非常重要的组成部分。

memcached-0005-01.png

图1 现在的系统组件

服务器配置和数量

mixi使用了许许多多服务器,如数据库服务器、应用服务器、图片服务器、 反向代理服务器等。单单memcached就有将近200台服务器在运行。 memcached服务器的典型配置如下:

  • CPU:Intel Pentium 4 2.8GHz
  • 内存:4GB
  • 硬盘:146GB SCSI
  • 操作系统:Linux(x86_64)
  • 这 些服务器以前曾用于数据库服务器等。随着CPU性能提升、内存价格下降, 我们积极地将数据库服务器、应用服务器等换成了性能更强大、内存更多的服务器。 这样,可以抑制mixi整体使用的服务器数量的急剧增加,降低管理成本。 由于memcached服务器几乎不占用CPU,就将换下来的服务器用作memcached服务器了。

    memcached进程每台memcached服务器仅启动一个memcached进程。分配给memcached的内存为3GB, 启动参数如下:

    /usr/bin/memcached -p 11211 -u nobody -m 3000 -c 30720

    由 于使用了x86_64的操作系统,因此能分配2GB以上的内存。32位操作系统中, 每个进程最多只能使用2GB内存。也曾经考虑过启动多个分配2GB以下内存的进程, 但这样一台服务器上的TCP连接数就会成倍增加,管理上也变得复杂, 所以mixi就统一使用了64位操作系统。

    另外,虽然服务器的内存为4GB,却仅分配了3GB,是因为内存分配量超过这个值, 就有可能导致内存交换(swap)。连载的第2次中 前坂讲解过了memcached的内存存储“slab allocator”,当时说过,memcached启动时 指定的内存分配量是memcached用于保存数据的量,没有包括“slab allocator”本身占用的内存、 以及为了保存数据而设置的管理空间。因此,memcached进程的实际内存分配量要比 指定的容量要大,这一点应当注意。

    mixi保存在memcached中的数据大部分都比较小。这样,进程的大小要比 指定的容量大很多。因此,我们反复改变内存分配量进行验证, 确认了3GB的大小不会引发swap,这就是现在应用的数值。

    memcached使用方法和客户端现 在,mixi的服务将200台左右的memcached服务器作为一个pool使用。 每台服务器的容量为3GB,那么全体就有了将近600GB的巨大的内存数据库。 客户端程序库使用了本连载中多次提到车的Cache::Memcached::Fast, 与服务器进行交互。当然,缓存的分布式算法使用的是第4次介绍过的 Consistent Hashing算法。

    应用层上memcached的使用方法由开发应用程序的工程师自行决定并实现。 但是,为了防止车轮再造、防止Cache::Memcached::Fast上的教训再次发生, 我们提供了Cache::Memcached::Fast的wrap模块并使用。

    通过Cache::Memcached::Fast维持连接

    Cache::Memcached 的情况下,与memcached的连接(文件句柄)保存在Cache::Memcached包内的类变量中。 在mod_perl和FastCGI等环境下,包内的变量不会像CGI那样随时重新启动, 而是在进程中一直保持。其结果就是不会断开与memcached的连接, 减少了TCP连接建立时的开销,同时也能防止短时间内反复进行TCP连接、断开 而导致的TCP端口资源枯竭。

    但是,Cache::Memcached::Fast没有这个功能,所以需要在模块之外 将Cache::Memcached::Fast对象保持在类变量中,以保证持久连接。

    package Gihyo::Memcached; use strict; use warnings; use Cache::Memcached::Fast; my @server_list = qw/192.168.1.1:11211 192.168.1.1:11211/; my $fast; ## 用于保持对象 sub new { my $self = bless {}, shift; if ( !$fast ) { $fast = Cache::Memcached::Fast->new({ servers => \@server_list }); } $self->{_fast} = $fast; return $self; } sub get { my $self = shift; $self->{_fast}->get(@_); }

    上面的例子中,Cache::Memcached::Fast对象保存到类变量$fast中。

    公共数据的处理和rehash诸 如mixi的主页上的新闻这样的所有用户共享的缓存数据、设置信息等数据, 会占用许多页,访问次数也非常多。在这种条件下,访问很容易集中到某台memcached服务器上。 访问集中本身并不是问题,但是一旦访问集中的那台服务器发生故障导致memcached无法连接, 就会产生巨大的问题。

    连载的第4次 中提到,Cache::Memcached拥有rehash功能,即在无法连接保存数据的服务器的情况下, 会再次计算hash值,连接其他的服务器。

    但是,Cache::Memcached::Fast没有这个功能。不过,它能够在连接服务器失败时, 短时间内不再连接该服务器的功能。

    my $fast = Cache::Memcached::Fast->new({ max_failures => 3, failure_timeout => 1 });

    在failure_timeout秒内发生max_failures以上次连接失败,就不再连接该memcached服务器。 我们的设置是1秒钟3次以上。

    此外,mixi还为所有用户共享的缓存数据的键名设置命名规则, 符合命名规则的数据会自动保存到多台memcached服务器中, 取得时从中仅选取一台服务器。创建该函数库后,就可以使memcached服务器故障 不再产生其他影响。

    memcached应用经验

    到此为止介绍了memcached内部构造和函数库,接下来介绍一些其他的应用经验。

    通过daemontools启动

    通 常情况下memcached运行得相当稳定,但mixi现在使用的最新版1.2.5 曾经发生过几次memcached进程死掉的情况。架构上保证了即使有几台memcached故障 也不会影响服务,不过对于memcached进程死掉的服务器,只要重新启动memcached, 就可以正常运行,所以采用了监视memcached进程并自动启动的方法。 于是使用了daemontools。

    daemontools是qmail的作者DJB开发的UNIX服务管理工具集, 其中名为supervise的程序可用于服务启动、停止的服务重启等。

    • daemontools

    这里不介绍daemontools的安装了。mixi使用了以下的run脚本来启动memcached。

    #!/bin/sh if [ -f /etc/sysconfig/memcached ];then . /etc/sysconfig/memcached fi exec 2>&1 exec /usr/bin/memcached -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN $OPTIONS

    监视

    mixi使用了名为“nagios”的开源监视软件来监视memcached。

    在nagios中可以简单地开发插件,可以详细地监视memcached的get、add等动作。 不过mixi仅通过stats命令来确认memcached的运行状态。

    define command { command_name check_memcached command_line $USER1$/check_tcp -H $HOSTADDRESS$ -p 11211 -t 5 -E -s 'stats\r\nquit\r\n' -e 'uptime' -M crit }

    此外,mixi将stats目录的结果通过rrdtool转化成图形,进行性能监视, 并将每天的内存使用量做成报表,通过邮件与开发者共享。

    memcached的性能

    连载中已介绍过,memcached的性能十分优秀。我们来看看mixi的实际案例。 这里介绍的图表是服务所使用的访问最为集中的memcached服务器。

    memcached-0005-02.png

    图2 请求数

    图3 流量

    图4 TCP连接数

    从上至下依次为请求数、流量和TCP连接数。请求数最大为15000qps, 流量达到400Mbps,这时的连接数已超过了10000个。 该服务器没有特别的硬件,就是开头介绍的普通的memcached服务器。 此时的CPU利用率为:

    memcached-0005-05.png

    图5 CPU利用率

    可见,仍然有idle的部分。因此,memcached的性能非常高, 可以作为Web应用程序开发者放心地保存临时数据或缓存数据的地方。

    兼容应用程序

    memcached的实现和协议都十分简单,因此有很多与memcached兼容的实现。 一些功能强大的扩展可以将memcached的内存数据写到磁盘上,实现数据的持久性和冗余。 连载第3次介绍过,以后的memcached的存储层将变成可扩展的(pluggable),逐渐支持这些功能。

    这里介绍几个与memcached兼容的应用程序。

    repcached
    为memcached提供复制(replication)功能的patch。
    Flared
    存储到QDBM。同时实现了异步复制和fail over等功能。
    memcachedb
    存储到BerkleyDB。还实现了message queue。
    Tokyo Tyrant
    将数据存储到Tokyo Cabinet。不仅与memcached协议兼容,还能通过HTTP进行访问。

    Tokyo Tyrant案例

    mixi 使用了上述兼容应用程序中的Tokyo Tyrant。Tokyo Tyrant是平林开发的 Tokyo Cabinet DBM的网络接口。它有自己的协议,但也拥有memcached兼容协议, 也可以通过HTTP进行数据交换。Tokyo Cabinet虽然是一种将数据写到磁盘的实现,但速度相当快。

    mixi并没有将Tokyo Tyrant作为缓存服务器,而是将它作为保存键值对组合的DBMS来使用。 主要作为存储用户上次访问时间的数据库来使用。它与几乎所有的mixi服务都有关, 每次用户访问页面时都要更新数据,因此负荷相当高。MySQL的 处理十分笨重, 单独使用memcached保存数据又有可能会丢失数据,所以引入了Tokyo Tyrant。 但无需重新开发客户端,只需原封不动地使用Cache::Memcached::Fast即可, 这也是优点之一。关于Tokyo Tyrant的详细信息,请参考本公司的开发blog。

    总结

    到本次为止,“memcached全面剖析”系列就结束了。我们介绍了memcached的基础、内部结构、 分散算法和应用等内容。读完后如果您能对memcached产生兴趣,就是我们的荣幸。 关于mixi的系统、应用方面的信息,请参考本公司的开发blog。 感谢您的阅读。

    版权声明:可以任意 转载,但转载时必须标明原作者charlee、原始链接以及本声明。

    产业新闻

    【架构与优化】从Facebook中集思广益,相互学习

    Tags:

    人才学疏浅,提出这个问题只是为了抛砖引玉,希望大家能在自己擅长的领域里对Facebook中可能采用的某个技术或者架构方案或优化方法,做个自己的论述。根据2008年9月1日,腾讯网对Facebook的技术运营副总裁Jonathan Heiliger的访问,我们了解到:
    (1)Facebook自称全球流量第四的网站,每天9000万活跃用户访问Facebook的1万台服务器
    (2)25TB数据(08年12月为28TB),40万名外部开发者支持,开发了2.5万套应用软件
    (3)使用LAMPLinux、 Apache MySQLPHP)技术构架;数据库使用MySQL;使用Memcached缓存SQL加速(全球最大的分布式Memcached缓存,800多台服务器,光缓存在Memcached中数据就达20多TB);使用APC进行opcode编译缓存。关于PHP的编译执行如下图所示:
    机制.jpg

    而Facebook的缓存方案如下图所示:
    facebook机制.jpg


    (4)一些后台应用是用Python、Perl和Java,以及一些gcc和Boost。(5)使用SVN和Git来进行代码管理,并且全部企业内部的软件部署都采用开源程序


    2. 可能会采用的MySQL架构与优化
    (1)数据的垂直(无关联数据放置不同数据库服务器)与水平分割(库表散列,如用user_id散列),然后用MySQL Proxy/Spock Proxy进行分割表的反向代理。
    (2)合理使用变量,并在本地文件建立散列的映射关系,进一步进行分割。
    (3)Master/Slave集群架构,实现读写分离。
    (4)合理的数据库结构设计,与索引优化

    (5)其他:索引缓存、联合索引、查询缓存等。


    3. 可能会采用的系统优化
    (1)使用epoll模型
    (2)异步I/O
    (3)fastcgi或其他方法实现多进程
    (4)sendfile系统调用增大网络I/O流量
    4. 可能会采用的Web架构或前端技术
    (1)Web组件分离,如独立的图片服务器,JavaScript、CSS文件、动态脚本的分离。
    (2)Nginx反向代理(或Squid)
    (3)多副本负载均衡
    (4)HTTP持久连接与合理利用浏览器缓存,例如背景图偏移量技术,及对CSS、JavaScript和视频
    5. 一些可能会用也可能不用的压力测试
    (1)Apache的ab进行压力测试
    (2)Apache的prefork模式进行多进程切换的压力测试
    (3)使用Nginx为多进程下的CPU与IO进行监控

    Linux下的Memcached开发,请参看逆雪寒的文章http://bbs.phpchina.com/viewthread.php?tid=48667&highlight=linux%2B%CF%C2%B5%C4%2Bmemcached%2B%BF%AA%B7%A2
    Memcached的分布式缓存机制及相关解决方案请阅读以下网址及相关文章:
    http://tech.idv2.com/2008/07/24/memcached-004/

    产业新闻

    MySQL新特性之复制特性的测试

    Tags:

    MySQL内部复制功能是建立在两个或两个以上服务器之 间,通过设定它们之间的主-从关系来实现的。其中一个作为主服务器,其它的作为从服务器。我将详细讨论如何配置两台服务器,将一个设为主服务器,另一个设 为从服务器。并且描述一下在它们之间进行切换的处理过程。我是在MySQL的3.23.23版本上进行的配置设置过程,并且也是在这个版本上进行的测试。 MySQL开发人员建议最好使用最新版本,并且主-从服务器均使用相同的版本。同时MySQL 3.23版本仍然是beta测试版,而且这个版本可能不能向下兼容。所以因为这个原因,在实际的网站中,我现在还没有使用这个版本。拥有容错能力具有一个 好处是,在不需中断任何查询的情况下,对服务器进行升级。

    第一步:配置主服务器

    在这篇文章的剩下篇幅中,我将指定两台服务器。A(IP为10.1.1.1)作为主服务器(简称为主机)。B(IP为10.1.1.2)作为后备服务器(简称为备机)。

    MySQL的复制功能的实现过程为:备机(B)与主机(A)连接,然后读出主机的二进制更新日志,再将发生的变化合并到自已的 数据中。备机需要一个用户帐号来与主机连接,所以在主机上创建一个帐号,并只给它FILE权限,如下操作:

    GRANT FILE ON *.* TOreplicate@10.1.1.2 IDENTIFIED BYpassword;

    为了备机能够与主机连接,要在主机上运行FLUSHPRIVILEGES,不过不要担心,因为我们将在下面的步骤中停掉服务器。

    现在我们需要主机数据库的一个快照,并且对主机进行配置,允许生成二进制的更新日志。首先编辑my.cnf文件,以便允许二进制更新日志,所以在 [mysqld]部分的下面某个地方增加一行:log-bin。在下一次服务器启动时,主机将生成二进制更新日志(名为:<主机 名>-bin.<增量序号#>)。为了让二进制更新日志有效,关闭MySQL服务程序,然后将主机上的所有数据库目录到另一个目录中, 接着重新启动mysqld。

    请确定得到了所有数据库,否则在进行复制时,如果一个表在主机上存在但在备机上不存在,将因为出错而退出。现在你已经得到了数据的快照,和一个从建立快照以来的二进制日志,上面记录着任何对数据库的修改。请注意MySQL数据文件(*.MYD,*.MYI和*.frm)是依赖于文件系统的,所以你不能仅仅进行文件传输,如从Solaris到Linux。如果你处于一个异种的服务器环境,你将不得不使用mysqldump实用程序或其它的定制脚本来得到数据快照。

    第二步:配置备机

    让我们继续。停掉备机上的MySQL服务程序,并且把从主机上拷贝来的数据库目录移到备机上的data目录下。请确认将目录的拥有者和属组改变为MySQL用户相应值,并且修改文件模式为660(只对拥有者和属组可读、可写),目录本身为770(只对拥有者和属组可读、可写和可执行)。

    继续。在备机上启动MySQL服务程序,确认MySQL工作正常。运行几个select查询(不要update或insert查询),看一看在第一步中得到的数据快照是否成功。接着,在测试成功后关掉MySQL服务程序。

    在备机上配置需要访问的主机,以便接收主机的更改。所以需要编辑务机上的my.cnf文件,在[mysqld]部分中增加下面几行:

    master-host=10.1.1.1 master-user=replicate master-password=password

    在启动备机服务程序后,备机服务程序将查看在my.cnf文件中所指定的主机,查看是否有改变,并且将这些改变合并到自已的数据库中。备机保持了主机的更新记录,这些记录是从主机的master.info文件中接收下来的。备机线程的状态可以通过sql命令SHOW SLAVE-STATUS看到。在备机上处理二进制日志中如果发生错误,都将导致备机线程的退出,并且在*.err的日志文件中生成一条信息。然后错误可以被改正,接着可以使用sql语句SLAVE START来重新启动备机线程。线程将从主机二进制日志处理中断的地方继续处理。

    至此,在主机上所发生的数据改变应该已经复制到备机上了,要测试它,你可以在主机上插入或更新一条记录,而在备机上选择这条记录。

    现在我们拥有了从A机到B机的这种主-从关系,这样当A机可能当机的时候,允许我们将所有的查询重定向到B机上去,但是当A机恢复时,我们没有办法将发生的改变恢复到A机中去。为了解决这个问题,我们创建从B机到A机的主-从关系。

    网站建设

    产业新闻, 开源动态, 未分类

    新版SQL Developer提高Oracle数据库开发员效率

    Tags: ,

    北京,2009年12月28日——

    l 为了进一步提高开发人员效率,简化Oracle数据开发,甲骨文公司日前宣布Oracle SQL Developer 2.1版上市,这是广受欢迎的数据库开发和迁移工具Oracle SQL Developer的最新版本。

    l Oracle SQL Developer 2.1版是一个免费且全面的工具,该新版软件的很多功能都得到了增强,此外还引入了两种关键的新功能――PL/SQL单元测试(Unit Testing)和数据建模器浏览器(Data Modeler Viewer)。Oracle SQL Developer 2.1版的两项关键新功能和所有增强功能都是应Oracle SQL Developer社区的要求和建议而开发的。

    l 新版软件引入了迁移工作台(Migration Workbench),以支持Teradata和面向Linux、UNIX和Windows操作系统的IBM DB2 UDB。

    l Oracle SQL Developer 2.1版可从Oracle技术网(OTN)下载。

    最新版软件简化数据库测试和迁移

    l Oracle SQL Developer 2.1版引入了一种单元测试框架,开发人员可利用该框架建立并共享单元测试和测试套件,这些单元测试和测试套件可以批处理方式运行,并根据不同数据库的命令行运行。PL/SQL单元测试为数据库开发人员提供了强大的预置功能,用这些功能可以开发并运行数据库代码回归测试,从而实现质量更高的数据库开发,同时减少为单元测试编写脚本程序的需求。

    l 最新版Oracle SQL Developer新增一个数据建模器浏览器,可以使用只读方式访问最近推出的Oracle SQL Developer数据建模器(Data Modeler)。这使得开发人员、数据建模人员、IT架构师以及其他相关人员能够利用该工具打开和浏览用独立的Oracle SQL Developer数据建模器建立的数据模型,并通过将表格拖到模型图上,以图形方式浏览架构对象

    l Oracle SQL Developer中新增加的数据建模器浏览器的关键好处是,用户可以用这个单一工具浏览第三方数据库表格,并在一张图上浏览关键的外部关系,然后利用这个工具将数据和对象迁移到Oracle数据库中,从而降低成本、工作量以及与向Oracle数据库迁移第三方数据库的风险。

    l Oracle SQL Developer 2.1版现在增加了迁移工作台,该工作台除了支持以前宣布的Sybase ASE 第12和15版、Microsoft SQL Server 2000和2005以及Microsoft Access,现在还支持Teradata(第12版)以及面向Linux、UNIX和Windows操作系统的IBM DB2 UDB(第7、8和9版)。

    l 这个最新版软件还具有:

    · 新的后台任务功能,使用户能够在后台运行耗时的SQL任务的同时,执行其他任务;

    · 增强的数据网格功能,为用户提供更强的控制能力,如动态搜索、过滤和高亮显示;

    · 版本控制,现在的支持范围包括Perforce和Serena Dimensions。

    l Oracle SQL Developer可用于Oracle数据库11g的所有版本,并可在Windows、Linux和Mac OS X操作系统上运行。该工具还可用于Oracle数据库10g以及Oracle 9i数据库第二版。

    甲骨文高管及客户引言

    l 甲骨文公司软件开发副总裁Mike Hichwa表示:“增加PL/SQL单元测试使Oracle SQL Developer领先于其他很多数据库开发工具。我们知道,几乎每一个Oracle数据库客户都使用PL/SQL,而拥有一个可靠的单元测试框架将使我 们的客户降低成本并提高软件质量。”

    OPITZ CONSULTING公司高级架构师Gerd Volberg表示:“专业软件开发需要强大的工具。这就是我们公司每一位开发人员都有专属的、安装了完整Oracle SQL Developer记忆棒的原因。我们的业务环境常常不允许在客户的计算机上安装软件。因此对于我们来说,有一个能从记忆棒上即时启动工作的工具非常重 要。Oracle SQL Developer 2.1版是一个极好的成套工具,其中包括强大的、新的PL/SQL单元测试,正适用于我们的咨询服务。”