創建一組不設置存儲方式,無分布鍵、分布方式和壓縮方式的表。然后,為這些表加載樣例數據。
1.(可選)創建集群。
如果已經有可供使用的集群,則可跳過這一步。創建集群的操作,請按中的步驟操作。同時請使用SQL客戶端連接到集群并測試連接。
本實踐所使用的是8節點集群。也可以使用4節點集群進行測試。
2.使用最少的屬性創建SS(Store_Sales)測試表。
說明如果SS表在當前數據庫中已存在,需要先刪除這些表。刪除表使用DROP TABLE命令。如下示例表示刪除表store_sales。
DROP TABLE store_sales;
考慮到本實踐的目的,首次創建表時,沒有設置存儲方式、分布鍵、分布方式和壓縮方式。
執行CREATE TABLE命令創建上圖"TPC-DS Store Sales ER-Diagram"中的11張表。限于篇幅,這里僅附store_sales的創建語法。請從附錄初始表創建中拷貝所有建表語法進行創建。
CREATE TABLE store_sales
(
ss_sold_date_sk integer ,
ss_sold_time_sk integer ,
ss_item_sk integer not null,
ss_customer_sk integer ,
ss_cdemo_sk integer ,
ss_hdemo_sk integer ,
ss_addr_sk integer ,
ss_store_sk integer ,
ss_promo_sk integer ,
ss_ticket_number bigint not null,
ss_quantity integer ,
ss_wholesale_cost decimal(7,2) ,
ss_list_price decimal(7,2) ,
ss_sales_price decimal(7,2) ,
ss_ext_discount_amt decimal(7,2) ,
ss_ext_sales_price decimal(7,2) ,
ss_ext_wholesale_cost decimal(7,2) ,
ss_ext_list_price decimal(7,2) ,
ss_ext_tax decimal(7,2) ,
ss_coupon_amt decimal(7,2) ,
ss_net_paid decimal(7,2) ,
ss_net_paid_inc_tax decimal(7,2) ,
ss_net_profit decimal(7,2)
) ;
3.為這些表加載樣例數據。
OBS存儲桶中提供了本次實踐的樣例數據。該存儲桶向所有經過身份驗證的云用戶提供了讀取權限。請按照下面的步驟加載這些樣例數據:
a.為每個表創建對應的外表。
DWS應用Postgres提供的外部數據封裝器FDW(Foreign Data Wrapper)進行數據并行導入。因此需要先創建FDW表,又稱外表。限于篇幅,此處僅給出“store_sales”表對應的外表“obs_from_store_sales_001”的創建語法。請從附錄外表創建拷貝其他外表的語法進行創建。

說明l? 注意,以下語句中的
代表OBS桶名,僅支持部分區域。DWS集群不支持跨區域訪問OBS桶數據。 l? 外表字段需與即將注入數據的普通表字段保持一致。例如此處store_sales表及其對應的外表obs_from_store_sales_001,他們的字段是一致的。
l? 這些外表語法能夠幫助您獲取OBS存儲桶中為本次實踐所提供的樣例數據。如果您需要加載其他樣例數據,需進行SERVER gsmpp_server OPTIONS的調整。
CREATE FOREIGN TABLE obs_from_store_sales_001
(
ss_sold_date_sk integer ,
ss_sold_time_sk integer ,
ss_item_sk integer not null,
ss_customer_sk integer ,
ss_cdemo_sk integer ,
ss_hdemo_sk integer ,
ss_addr_sk integer ,
ss_store_sk integer ,
ss_promo_sk integer ,
ss_ticket_number bigint not null,
ss_quantity integer ,
ss_wholesale_cost decimal(7,2) ,
ss_list_price decimal(7,2) ,
ss_sales_price decimal(7,2) ,
ss_ext_discount_amt decimal(7,2) ,
ss_ext_sales_price decimal(7,2) ,
ss_ext_wholesale_cost decimal(7,2) ,
ss_ext_list_price decimal(7,2) ,
ss_ext_tax decimal(7,2) ,
ss_coupon_amt decimal(7,2) ,
ss_net_paid decimal(7,2) ,
ss_net_paid_inc_tax decimal(7,2) ,
ss_net_profit decimal(7,2)
)
-- Configure OBS server information and data format details.
SERVER gsmpp_server
OPTIONS (
LOCATION '/tpcds/store_sales',
FORMAT 'text',
DELIMITER '|',
ENCODING 'utf8',
NOESCAPING 'true',
ACCESS_KEY 'access_key_value_to_be_replaced',
SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced',
REJECT_LIMIT 'unlimited',
CHUNKSIZE '64'
)
-- If create foreign table failed,record error message
WITH err_obs_from_store_sales_001;
b.將創建外表語句中的參數ACCESS_KEY和SECRET_ACCESS_KEY替換為實際值,然后在客戶端工具中執行替換后的語句創建外表。
ACCESS_KEY和SECRET_ACCESS_KEY的值,請參見“常見問題-通用問題”中的“如何獲取Access Key ID(AK)和 Secret Access Key(SK)”。
c.執行數據導入。
創建包含如下語句的insert.sql腳本文件,并執行.sql腳本文件。
\timing on
\parallel on 4
INSERT INTO store_sales SELECT * FROM obs_from_store_sales_001;
INSERT INTO date_dim SELECT * FROM obs_from_date_dim_001;
INSERT INTO store SELECT * FROM obs_from_store_001;
INSERT INTO item SELECT * FROM obs_from_item_001;
INSERT INTO time_dim SELECT * FROM obs_from_time_dim_001;
INSERT INTO promotion SELECT * FROM obs_from_promotion_001;
INSERT INTO customer_demographics SELECT * from obs_from_customer_demographics_001 ;
INSERT INTO customer_address SELECT * FROM obs_from_customer_address_001 ;
INSERT INTO household_demographics SELECT * FROM obs_from_household_demographics_001;
INSERT INTO customer SELECT * FROM obs_from_customer_001;
INSERT INTO income_band SELECT * FROM obs_from_income_band_001;
\parallel off
結果應該類似如下:
SET
Timing is on.
SET
Time: 2.831 ms
Parallel is on with scale 4.
Parallel is off.
INSERT 0 402
Time: 1820.909 ms
INSERT 0 73049
Time: 2715.275 ms
INSERT 0 86400
Time: 2377.056 ms
INSERT 0 1000
Time: 4037.155 ms
INSERT 0 204000
Time: 7124.190 ms
INSERT 0 7200
Time: 2227.776 ms
INSERT 0 1920800
Time: 8672.647 ms
INSERT 0 20
Time: 2273.501 ms
INSERT 0 1000000
Time: 11430.991 ms
INSERT 0 1981703
Time: 20270.750 ms
INSERT 0 287997024
Time: 341395.680 ms
total time: 341584 ms
d.計算所有11張表的總執行時間。該數字將作為加載時間記錄在下一小節步驟步驟1中的基準表內。
e.執行以下命令,驗證每個表是否都已正確加載并將行數記錄到表中。
SELECT COUNT(*) FROM store_sales;
SELECT COUNT(*) FROM date_dim;
SELECT COUNT(*) FROM store;
SELECT COUNT(*) FROM item;
SELECT COUNT(*) FROM time_dim;
SELECT COUNT(*) FROM promotion;
SELECT COUNT(*) FROM customer_demographics;
SELECT COUNT(*) FROM customer_address;
SELECT COUNT(*) FROM household_demographics;
SELECT COUNT(*) FROM customer;
SELECT COUNT(*) FROM income_band;
以下顯示每個SS表的行數:
| 表名稱 | 行數 |
|---|---|
| Store_Sales | 287997024 |
| Date_Dim | 73049 |
| Store | 402 |
| Item | 204000 |
| Time_Dim | 86400 |
| Promotion | 1000 |
| Customer_Demographics | 1920800 |
| Customer_Address | 1000000 |
| Household_Demographics | 7200 |
| Customer | 1981703 |
| Income_Band | 20 |
4.執行ANALYZE更新統計信息。
ANALYZE;
返回ANALYZE后,表示執行成功。
ANALYZE
ANALYZE語句可收集數據庫中與表內容相關的統計信息,統計結果存儲在系統表PG_STATISTIC中。查詢優化器會使用這些統計數據,以生成最有效的執行計劃。
建議在執行了大批量插入/刪除操作后,例行對表或全庫執行ANALYZE語句更新統計信息。