InterBase 6.5的新特性

** InterBase 6.5 ** ** 的新特性 ** ** **

作者: Bill Todd ( Team B 成员)

译者: TR@SOE

原文 URI : _ http://www.dbginc.com/tech_pprs/IB65New.html _

1. 改良的缓存管理

2. 指定处理器

3. 取消语句的执行

4. 元数据的安全性

5. 64 位文件 I/O

6. ROWS 语句

7. 以 XML 格式导出数据

8. 其它改进

** 改良的缓存管理 **

以前版本的 IB 中,如果缓存大小超过 10,000 页,性能将会降低。该问题已经得到解决。缓存管理器也进行了修改以减少处理大缓存时的额外开销。例如, 65,000 页缓存所需要的总内存量几乎减少了七兆。分配大的缓存空间的速度也得到提高,缓存 I/O 的效率也得到提高。在重负载的情况下,线程需要等待共享页面加锁而带来的问题也消除了。增加缓存大小并不能保证性能的提升,但是绝对没有坏处。在用户数量大和其它一些场合时,增加缓存大小会有帮助。

** 指定处理器 **

在运行 WINDOWS 的多处理器系统中, IB 超级服务器版本的性能可能会降低,因为 WINDOWS 总是不断地将 IB 进程从一个处理器切换到另一个处理器。 WINDOWS 版本的 IB 6.5 可以在 IBCONFIG 文件中包含如下的指令: CPU_AFFINITY 1 从而将 IB 进程与第一个处理器连接。通过改变数值,你可以将 IB 与任何一个处理器相连接,方法是修改对应的处理器的位。例如, 1 代表第一个处理器, 2 代表第二个, 4 代表第三个。这一语法允许你将 IB 分配到多个处理器上( IB 7 将支持 SMP )。例如,将 IB 分配到第二和第三个处理器时,可以这么写: CPU_AFFINITY 6 。

** 取消语句的执行 **

使用 IB 的 API 函数 isc_dsql_free_statement 可以取消任何语句的执行。如下所示:

procedure TfrmMain.StopQuery;

var

StatementHandle: TISC_STMT_HANDLE;

ISC_Result: ISC_STATUS;

begin

StatementHandle := dmMain.ibqTest.StmtHandle;

ISC_Result := isc_dsql_free_statement(StatusVector, @StatementHandle, DSQL_CANCEL);

if ISC_Result > 0 then IBDatabaseError;

end;

在运行语句的线程里不可以取消该语句的执行。因此,如果你希望使用这一特性,应该在一个后台线程中运行你的 SQL 语句。该 API 调用不能与 dbExpress 或 BDE 合用,因为它们无法存取语句的句柄,而该句柄是函数调用的第二个参数。 InterBase Express 中提供该属性,上面的代码来源于一个使用 IBQuery 的应用,它在一个后台线程中执行 SQL 语句。

你取消一个语句的执行时, IB 的表现如同该语句执行时出错。被取消的语句所做的一切更改都被取消,但是事务处理还将继续。你可以决定是要确认还是回滚事务。如果在 ISQL 中你执行了一个语句而又想取消,只要按 Ctrl+C 即可。

** 元数据的安全性 **

在以前版本的 IB 中,你可以对系统表格授权或取消授权,但是这些权限在备份与恢复后不被保留。 IB 6.5 就不同了。你创建的任意数据库中所有系统表格给予公众的缺省权限是 SELECT 。它允许用户看到系统表格,但是他们不能直接修改系统表格。 IB 6.5 有三个脚本,让你轻松地修改系统表格的权限。 readmeta.sql 脚本将系统表格给予 SELECT 权限。 writemeta.sql 脚本将系统表格给予所有的权限。而 blindmeta.sql 脚本收回所有给予的权限。

限制系统表格的存取绝不是限制用户使用 DDL 语句修改数据库中其它表格的能力。 IB 引擎做了改进,即使用户没有权限直接操作系统表格,引擎也可以代替用户对系统表格进行相应的修改。

如果你用 blindmeta.sql 脚本或者在早期的 IB 中使用 REVOKE 语句收回了系统表格存取的所有权限,你将根本无法存取数据库。 IB 6.5 第一次打开 IB 6 ODS 10 的数据库时, ODS 版本将自动升为 10.1 ,而公共用户对系统表格的权限将设置为 SELECT 。 IB 6.5 也能打开 ODS 9 的数据库,但是不会对它们进行任何修改。

IB 6.0 可以打开一个 ODS 10.1 的数据库,只要公共用户对系统表格的权限至少为 SELECT 以上。不过,如果数据库由 IB 6.0 服务器备份和恢复,所有对系统表格的存取限制都将丢失。

** 64 ** ** 位文件 **

IB 现在支持 Windows/Linux/Solaris 平台上的 64 位文件 I/O 操作。数据库的大小将只受限于硬盘的大小。只有 2.4 核心的 Linux 提供 64 位文件 I/O 。如果是以前版本的 Linux , IB 6.5 将自动使用 32 位文件 I/O ,其表现如 IB 6.0 一样。

** ROWS ** ** 语句 [1] **

ROWS 语句是 IB SQL 的扩展,它允许你控制 SELECT/UPDATE/DELETE 语句所影响的范围。 ROWS 语句的语法如下:

ROWS

  1<lower_value> [TO <upper_value>] [BY <step_value>] [PERCENT] [WITH TIES] 
  2
  3ROWS  语句在  SQL  语句中的位置如下: 
  4
  5<from_clause>
  6<where_clause>
  7<group_by_clause>
  8<having_clause>
  9<order_by_clause>
 10<rows_clause>
 11
 12要理解  ROWS  语句到底能做什么的最好方法是看看例子。本文中所有的例子都使用  IB  自带的  Employee  数据库。第一个例子中,  ROWS  语句与  ORDER BY  连用,选出折扣最高的五个记录: 
 13
 14SELECT * FROM SALES 
 15
 16ORDER BY DISCOUNT DESC 
 17
 18ROWS 1 TO 5 
 19
 20ORDER BY  语句将返回的记录以  DISCOUNT  的降序排列,而  ROWS  语句将返回的记录数量限制为前五个。尽管你可以独立使用  ROWS  而没有  ORDER BY  ,但是那样没有什么意义,因为限制返回行的数量就意味着你需要以某种顺序排列的前  N  个记录。如果你需要返回的第一行就是结果记录集的第一行,你可以把上面的查询简写为: 
 21
 22SELECT * FROM SALES 
 23
 24ORDER BY DISCOUNT DESC 
 25
 26ROWS 5 
 27
 28如果你希望  ORDER BY  语句中具有相同列值的行都作为前五行显示,你可以使用  WITH TIES  选项: 
 29
 30SELECT * FROM SALES 
 31
 32ORDER BY DISCOUNT DESC 
 33
 34ROWS 1 TO 5 WITH TIES 
 35
 36该查询将返回  8  行而不是  5  行,因为前五行的  DISCOUNT  字段中的某些数据也出现在其它行中。注意,使用  WITH TIES  时  必须同时使用  ORDER BY  。 
 37
 38除了固定数量的列,你也可以指定返回结果数据集里一定百分比的行数。如下例所示,它将返回  SALES  中  TOTAL_VALUE  在前  10%  内的记录: 
 39
 40SELECT * FROM SALES 
 41
 42ORDER BY TOTAL_VALUE DESC 
 43
 44ROWS 10 PERCENT 
 45
 46PERCENT  选项另一个有趣的应用是选择一个平均分布的行子集。  下面的查询返回五行,每个行与它的邻居在表中的距离都是  20%  的记录数。尽管该查询没有使用  ORDER BY  ,但是使用  ORDER BY  也是可以的。例如,要获得根据地理位置均匀分布的行,就可以根据州名或  ZIP  来排序表格。 
 47
 48SELECT * FROM CUSTOMER 
 49
 50ROWS 100 BY 20 PERCENT 
 51
 52ROWS  语句可以和统计值联合使用。下面的查询根据各销售人员的定单总额排序而返回前三个销售人员的信息。第二个查询根据各销售人员的定单总额返回前  25%  的销售人员信息: 
 53
 54SELECT SALES_REP, SUM(TOTAL_VALUE) AS TOTAL 
 55
 56FROM SALES 
 57
 58GROUP BY SALES_REP 
 59
 60ORDER BY 2 DESC 
 61
 62ROWS 3 
 63
 64SELECT SALES_REP, SUM(TOTAL_VALUE) AS TOTAL 
 65
 66FROM SALES 
 67
 68GROUP BY SALES_REP 
 69
 70ORDER BY 2 DESC 
 71
 72ROWS 25 PERCENT 
 73
 74ROWS  语句可以和  UPDATE  合用,来给工资最高的前  10  名员工加工资: 
 75
 76UPDATE EMPLOYEE 
 77
 78SET SALARY = SALARY * 1.01 
 79
 80ORDER BY SALARY DESC 
 81
 82ROWS 10 
 83
 84你也可以将  ROWS  与  DELETE  合用,来删除工资最高的前  10  名员工。如果你还想删除那些与前  10  名员工工资一样的员工,只要加入  WITH TIES  选项: 
 85
 86DELETE FROM EMPLOYEE 
 87
 88ORDER BY SALARY DESC 
 89
 90ROWS 10 
 91
 92#  以  XML  格式导出数据 
 93
 94InterBase Express  现在包含一个新的类,  TIBOutputXML  ,让你轻松地以  XML  来读取数据。下表中列出了  TIBOutputXML  的属性。要使用这个类,你必须在文件中包含  IBXML  单元。  InterBase XML  支持是以独立的  DLL  实现的,所以如果你不需要该功能,也就不用分发该文件。 
 95
 96** 属性  **
 97
 98| 
 99
100** 描述  **  
101  
102---|---  
103  
104HeaderTag 
105
106| 
107
108XML  流中作为头部标记的字符串。如果它为空,那么就使用  "<?xml version="1.0">"  作为缺省值。   
109  
110DatabaseTag 
111
112| 
113
114作为数据库标记的字符串。如果为空,就使用  "Database"  。   
115  
116TableTag 
117
118| 
119
120作为表格标记的字符串。如果为空,就使用  "Table"  。   
121  
122RowTag 
123
124| 
125
126作为行标记的字符串。如果为空,就使用  "Row"  。   
127  
128Flags 
129
130| 
131
132有三个成员的属性集。 
133
134xmlAttribute  :以属性生成  XML  而不是标记; 
135
136xmlDisplayNull  :在  XML  数据中包含空值; 
137
138xmlNoHeader  :在  XML  中不要包含头信息。   
139  
140Stream 
141
142| 
143
144接收  XML  的流。   
145  
146下面的代码演示了如何导出到  XML  并将  XML  显示在  DELPHI  表单里的一个备注控件里: 
147
148procedure TMainForm.ShowXMLBtnClick(Sender: TObject); 
149
150var 
151
152IBOutputXML:  TIBOutputXML; 
153
154Stream:  TStringStream; 
155
156begin 
157
158IBOutputXML := TIBOutputXML.Create; 
159
160Stream := TStringStream.Create(''); 
161
162try 
163
164IBOutputXML.HeaderTag := '' + #10#13 + '' + #10#13; 
165
166IBOutputXML.DatabaseTag := DatabaseEdit.Text; 
167
168IBOutputXML.TableTag := TableEdit.Text; 
169
170&lt;SPAN lang=EN-US style="FONT-FAMILY: 'Courier New'</rows_clause></order_by_clause></having_clause></group_by_clause></where_clause></from_clause></step_value></upper_value></lower_value>
Published At
Categories with 数据库类
Tagged with
comments powered by Disqus