無論您是在用原型證明某一概念,還是開發一個全新的應用程序,或者只是學習 SQL,您都需要在您的應用程序上運行測試數據。為了有效地測試應用程序的性能,您必須擁有足夠的測試數據,以便暴露潛在的性能問題。只要可以得到,用實際數據來進行測試總是更可取一些。如果沒有可用的實際數據,那么在許多情況下,也可以生成足夠的假想數據。一般來說,從頭開始構造大量數據是件很容易的工作,您自己就可以快速地獨立完成。
本文提供了一些如何利用 SQL 腳本來生成測試數據的示例,而這些腳本本身就是較好的 SQL 實踐。并且還討論了一些為了生成盡可能真實的數據而應該注意的問題。
生成大量記錄 即使數據庫是新創建且仍然為空的,也總是會帶有系統表和視圖,因此,您可以按以下方法使用它們: CREATE TABLE DB2ADMIN.SALESSALES 表中的記錄數就與 SYSCAT.COLUMNS 中的完全一樣了。請注意,多個列都是用隨機值來填充的。例如,SALE_QUANTITY 列中的所有值都是處于 1 到 10 之間,約 10% 的記錄具有各不相同的值。如果您需要更多記錄,就可以根據需要多次重復執行這條 INSERT 語句。您還可以像下面這樣使用交叉連接(CROSS JOIN),以便每條語句獲得更多記錄:
注意:本例中,表 T1 和 T2 的連接是不含任何條件的,因此,T1 中的每一行會匹配 T2 中的每一行。這種類型的連接稱作交叉連接。
注意:這條 INSERT 語句所涉及的事務可能會相當大,以致于您的服務器無法加以處理。如果您遇到“log full”的情況(SQL0964C 數據庫的事務日志已滿),您可能需要增加日志空間,或者通過指定 T1 或 T2 或兩者中的 WHERE 子句來獲得一個較小的事務。
您可以使用該方法來生成大量記錄,然而,該方法有點過分簡單了,因為所有的值都是均勻分布的,而且它們之間不存在相關性。
填充子表 您的數據庫中很可能存在多對一的關系。下列示例展示了如何填充子表,以使每一條父記錄都具有隨機的多條子記錄。 CREATE TABLE DB2ADMIN.PARENT_TABLE(PARENT_ID INT NOT NULL, NUM_CHILDREN INT NOT NULL);CREATE TABLE DB2ADMIN.CHILD_TABLE(PARENT_ID INT NOT NULL, CHILD_NUM INT NOT NULL);
INSERT INTO DB2ADMIN.CHILD_TABLE
SELECT PARENT_ID, SEQUENCE_TABLE.NUM
FROM DB2ADMIN.PARENT_TABLE
JOIN
(SELECT ROW_NUMBER() OVER() AS NUM
FROM SYSCAT.TABLES) AS SEQUENCE_TABLE
ON AUXILIARY_TABLE.NUM<NUM_CHILDREN;