為每張表選擇了存儲方式、壓縮級別、分布方式和分布列后,使用這些屬性創建表并重新加載數據。以便對比表設計前后的系統性能。
1.執行CREATE TABLE創建表前,刪除前面創建的表。
DROP TABLE store_sales;
DROP TABLE date_dim;
DROP TABLE store;
DROP TABLE item;
DROP TABLE time_dim;
DROP TABLE promotion;
DROP TABLE customer_demographics;
DROP TABLE customer_address;
DROP TABLE household_demographics;
DROP TABLE customer;
DROP TABLE income_band;
DROP FOREIGN TABLE obs_from_store_sales_001;
DROP FOREIGN TABLE obs_from_date_dim_001;
DROP FOREIGN TABLE obs_from_store_001;
DROP FOREIGN TABLE obs_from_item_001;
DROP FOREIGN TABLE obs_from_time_dim_001;
DROP FOREIGN TABLE obs_from_promotion_001;
DROP FOREIGN TABLE obs_from_customer_demographics_001;
DROP FOREIGN TABLE obs_from_customer_address_001;
DROP FOREIGN TABLE obs_from_household_demographics_001;
DROP FOREIGN TABLE obs_from_customer_001;
DROP FOREIGN TABLE obs_from_income_band_001;
2.創建具有存儲方式和分布方式的表。
限于篇幅,此處僅給出再次創建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)
)
WITH (ORIENTATION = column,COMPRESSION=middle)
DISTRIBUTE BY hash (ss_item_sk);
3.參考步驟1:創建初始表并加裝樣例數據中的“為這些表加載樣例數據”。
4.在基準表中記錄加載時間。
基準 優化前 優化后 加載時間(11張表)
341584ms
257241ms
占用存儲
Store_Sales
42GB
-
Date_Dim
11MB
-
Store
232kB
-
Item
110MB
-
Time_Dim
11MB
-
Promotion
256kB
-
Customer_Demographics
171MB
-
Customer_Address
170MB
-
Household_Demographics
504kB
-
Customer
441MB
-
Income_Band
88kB
-
總存儲空間
42GB
-
查詢執行時間
查詢1
14552.05ms
-
查詢2
27952.36ms
-
查詢3
17721.15ms
-
總執行時間
60225.56ms
-
5.執行ANALYZE更新統計信息。
ANALYZE;
返回ANALYZE后,表示執行成功。
ANALYZE
6.檢查數據傾斜性。
對于Hash分表策略,如果分布列選擇不當,可能導致數據傾斜,查詢時出現部分DN的I/O短板,從而影響整體查詢性能。因此在采用Hash分表策略之后需對表的數據進行數據傾斜性檢查,以確保數據在各個DN上是均勻分布的。可以使用以下SQL檢查數據傾斜性
SELECT a.count,b.node_name FROM (SELECT count(*) AS count,xc_node_id FROM table_name GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;
其中xc_node_id對應DN,一般來說,不同DN 的數據量相差5% 以上即可視為傾斜,如果相差10% 以上就必須要調整分布列 。DWS支持多分布列特性,可以更好地滿足數據分布的均勻性要求。