发新话题
打印

[转载]不同数据库的一些优化对比

[转载]不同数据库的一些优化对比

信息来源:邪恶八进制信息安全团队(www.eviloctal.com

今天在高手温少的blog上看见的。
不同数据库DDL差别 优化 树状数据递归查询支持
引用:
不同数据库DDL的一点差别
1、DB2中,竟然没有删除列的DDL语句。办法只能是删掉数据表重建,好麻烦,特别在开发过程中,好麻烦呀!
2、Oracle的DDL不能在事务中执行。
程序中需要动态创建数据表和删除表的时候必须注意,确保不在事务中执行。

这一点上,还是SQL Server 比较好。可以在事务中执行DDL语句,可以提交,可回滚

一个Oracle、DB2、MS SQL Server都有的优化选项
Oracle、DB2、MS SQL Server都有的QueryHint,好像就只有一个了,他们在不同数据库的表现形式为:

Oracle:
复制内容到剪贴板
代码:
SELECT /*+ FIRST_ROWS */ * FROM T WHERE (F1 > 5)
MS SQL Server
复制内容到剪贴板
代码:
SELECT * FROM T WHERE (F1 > 5) OPTION ( FAST 10)
DB2 UDB
复制内容到剪贴板
代码:
SELECT * FROM T WHERE (F1 > 5) OPTIMIZE FOR 1 ROW
SELECT * FROM T WHERE (F1 > 5) OPTIMIZE FOR 10 ROWS注意,DB2中,单数和复数是不一样的,这是一个比较令人讨厌的特性。

我在PostgreSQL 7.4 文档中,找不到相应的优化选项,在MySQL中,应该也不会有。

不同数据库对树状数据递归查询支持
Oracle对树形数据的递归查询使用Connect子句,例如:
复制内容到剪贴板
代码:
SELECT ID, PARENTID, Level
FROM TREENODE
Start With ID = 'A2'
Connect By Prior ID = ParentId
在DB2和最新的MS SQL Server 2005中也支持递归查询。SQL Server 2005和DB 2语法是相似的。

如上的SQL在DB 2中应为:
复制内容到剪贴板
代码:
WITH SUB_TABLE (ID, PARENTID, Level)
AS (
  SELECT ID, PARENTID, 0 FROM TREENODE WHERE ID = 'A2'
  UNION ALL
  SELECT PRIOR_TAB.ID, PRIOR_TAB.PARENTID, KSQL_SUB_TABLE.Level + 1
   FROM (SELECT ID, PARENTID, Level FROM TREENODE) PRIOR_TAB, SUB_TABLE
  WHERE SUB_TABLE.ID = PRIOR_TAB.ParentId
)
SELECT ID, PARENTID, Level FROM SUB_TABLE
DB2中递归查询使用起来,比Oracle的麻烦。Oracle中引入了Prior关键字,使得递归查询变得简单。
MS SQL Server在最新2005的版本中,终于支持递归查询了,相比起Oracle和DB2,落后了好多年哟
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

发新话题