1. 程式人生 > >全面認識INFORMIX臨時表

全面認識INFORMIX臨時表

全方位認識INFORMIX臨時表及臨時表IDS11.5新特性

概述

本文描述Informix臨時表的概念、SQL、臨時表空間、約束、新特性以及優化建議。目的旨在說明如何在我們的應用開發中合理的使用和管理Informix臨時表。

Informix資料庫中,我們可以建立臨時表來處理應用中的臨時資料,並且臨時表資料儲存在臨時表空間中。Informix系統不記錄臨時表的字典資訊,從資料庫系統表中查詢不到臨時表的如何相關資訊。可以在臨時表上建立索引。臨時表的作用域為session,當session結束(應用程式斷開資料庫)、資料庫例項關閉或者系統異常關閉後重新啟動時臨時表由資料庫系統自動進行刪除。因此,我們需要正確利用

Informix臨時表這些特點來解決我們資料庫應用系統中的各種業務問題。

臨時表SQL語法

可以採用如下兩種方式建立臨時表:

A、使用 SELECT INTO TEMP 語句隱含地建立臨時表;

B、使用 CREATE TEMP TABLE 語句顯示地建立臨時表;

顯示的建立臨時表的語法描述如下:

 

注意事項:

n命名規則:臨時表只作用於一個session中,而不在整個資料庫中。在一個session建立臨時表時應該遵守如下規則:

A、臨時表明必須不同於當前資料庫中其他table,view,sequencesynonym的名稱;

B、可以與其他session中的臨時表名稱相同;

C、在同一

session中,不能建立相同名稱的臨時表,可以先刪除後再建立。

nWITH NO LOG:在日誌資料庫中,定義該選項後,對該臨時表的操作不記錄事務日誌。

示例說明:如下示例說明臨時表的使用語法。

DataBase:demodb buffed log

資料庫demodb存在如下表:tab1create table tab1(c1 integer);

Session 1:
Create temp table tmp_a(c1 integer,c2 char(2)) with no log;
Insert into table tmp_a(c1,c2) values(1,’a’);
Create index idx_tmp_a on a(c1);
Select * from tab1 into tmp_b with no log;
Select c1 from tmp_a into tmp_c with no log;
Drop table tmp_a;
Create temp table tmp_a(c1 int) with no log;

Session 2:
Create temp table tmp_a(c1 integer,c2 char) with no log;
Insert into tmp_a(c1) values (3);
Select * from tmp_a into tab1 with no log;
--Error: tab1名稱與資料庫已有表tab1衝突
create temp table tmp_a(t1 integer);
--Error:臨時表表名tmp_a在該session中已經建立

系統建立的臨時表

在如下幾種情形下,資料庫伺服器將自動建立臨時表。

n使用GROUP BY ORDER BY 子句;

n包含聚集函式,並且使用了UNIQUE或者DISTINCT

n執行計劃使用HASH JOIN的表關聯;

n複雜的CREATE VIEW;

n建立scroll cursor

n關聯子查詢;

n應用IN或者ANY子句的子查詢;

n建立INDEX

臨時表的儲存

如果資料庫採用非日誌模式,DBSPACETEMP 環境變數或配置引數設定後,臨時表會自動建立在由 DBSPACETEMP 環境變數或配置引數指定的資料空間上;如果資料庫採用日誌模式,那麼建立的臨時表預設情況下是記日誌的,不會被建立在由 DBSPACETEMP 環境變數或配置引數指定的資料空間上,那麼由SELECT ... INTO TEMP語句建立的臨時表將被建立在根資料空間(root dbspace)上,由CREATE TEMP TABLE語句建立的臨時表將被建立在資料庫所在的資料空間上。如果希望臨時表建立在由 DBSPACETEMP 環境變數或配置引數指定的資料空間上,我們需要使用 SELECT INTO TEMP with no log 語句或 CREATE TEMP TABLE with no log 語句來建立臨時表。

下面的表格詳細說明了臨時表的資料儲存位置的各種情況:

Case A: select * from tab1 into temp tmp1 或者

create temp table tmp1(c1 int);

Case B: select * from tab1 into temp tmp1 with no log; 或者

create temp table tmp1(c1 int) with no log;

資料庫demodb建立在dbs1

DBSPACETEMP 設定為tmpdbs

DBSPACETEMP不設定

DB with LOG

DB No-Log

DB with LOG

DB No-Log

A

B

A

B

A

B

A

B

rootdbs

dbs1

tmpdbs

tmpdbs

tmpdbs

dbs1

dbs1

dbs1

dbs1

表格淺綠色部分情況是日誌資料庫中為了考慮效能所期望的一種臨時表儲存方式:日誌資料庫設定DBSPACETEMP引數為tmpdbs,我們在建立臨時表時加上with no log選項,臨時表將會將資料儲存在臨時表空間tmpdbs上。

另外,正如smart large objects需要SBSPACEDBS一樣,也需要為大物件臨時表設定相應的臨時儲存資料空間SBSPACETEMP。為了效能考慮,我們一般都要配置多個SBSPACETEMP資料空間。

臨時表優化建議

從上面的描述,我們可以得知不管是由使用者建立的臨時表,還是由系統自動建立的臨時表都需要進行儲存,使用者建立的臨時表某些情況下還需要記錄日誌。出於效能考慮,我們從如下兩個方面提高臨時表的效能。

1.取消日誌

在日誌資料庫中,通過with no log選項,取消臨時表的DML操作的日誌,這樣能大大提高資料處理效率。另外,尤其是在有 HDR 輔助伺服器、RS 輔助伺服器或 SD 輔助伺服器的資料複製環境中,因為其防止 Informix 通過網路傳輸臨時表。

2.利用臨時表空間

通過如下原則利用臨時表空間提高臨時表的效能:

n建立獨立的臨時表空間,防止與root dbspace及預設表空間的I/O爭用情況;

n建立多個臨時表空間,並正確配置DBSPACETEMP引數;

n為臨時表空間分配足夠大的儲存空間,防止出現臨時表空間不足的情況;

n大資料臨時表以round-robin模式分佈在多個臨時表空間上。並且設定PDQ priority>0,可以提高臨時表資料併發處理效率;

n根據臨時表儲存表空間使用原則,使用with no log選項;

n臨時表空間不能使用direct I/O,所以你需要分配足夠的AIO VPs

IDS11新特性

在採用日誌模式的資料庫中,對無with no log選項的臨時表的所有DML操作都要記日誌。當不加 with no log 選項時,臨時表不會建立在由DBSPACETEMP環境變數或配置引數指定的臨時資料空間上,往往將資料寫到rootdbs或者預設資料庫空間上,大大影響了系統性能。而且使用者在建立臨時表時,有時會忘記 with no log 選項。為了解決上述問題,IDS 11 版本開始提供了關閉對臨時表記日誌的TEMPTAB_NOLOG引數,建臨時表時,即使沒加 with no log 選項,臨時表也會建立在由 DBSPACETEMP 環境變數或配置引數指定的臨時資料空間上。

我們可以採用下述兩種方法來關閉對臨時表記日誌:

方法一

修改onconfig配置引數

TEMPTAB_NOLOG 1

方法二onmode命令動態修改

onmode -Wf TEMPTAB_NOLOG=1 或者

onmode -Wm TEMPTAB_NOLOG=1

-Wm 選項改變引數值後立即生效; -Wf 選項改變引數值後立即生效,同時將新的引數值寫到 onconfig 配置檔案中

約束

以下為Informix臨時表、臨時表空間的幾點約束:

n在資料庫伺服器重啟時,臨時表空間將被清空;

n臨時表不能進行備份、恢復;

n臨時表空間不能使用direct I/O,所以你需要分配足夠的AIO VPs

n臨時表的列上不能建立外關聯約束;