步骤4:创建新表并加载数据 本章节主要介绍创建新表并加载数据的最佳实践。 为每张表选择了存储方式、压缩级别、分布方式和分布列后,使用这些属性创建表并重新加载数据。以便对比表设计前后的系统性能。 1.执行CREATE TABLE创建表前,删除前面创建的表。 DROP TABLE storesales; DROP TABLE datedim; DROP TABLE store; DROP TABLE item; DROP TABLE timedim; DROP TABLE promotion; DROP TABLE customerdemographics; DROP TABLE customeraddress; DROP TABLE householddemographics; DROP TABLE customer; DROP TABLE incomeband; DROP FOREIGN TABLE obsfromstoresales001; DROP FOREIGN TABLE obsfromdatedim001; DROP FOREIGN TABLE obsfromstore001; DROP FOREIGN TABLE obsfromitem001; DROP FOREIGN TABLE obsfromtimedim001; DROP FOREIGN TABLE obsfrompromotion001; DROP FOREIGN TABLE obsfromcustomerdemographics001; DROP FOREIGN TABLE obsfromcustomeraddress001; DROP FOREIGN TABLE obsfromhouseholddemographics001; DROP FOREIGN TABLE obsfromcustomer001; DROP FOREIGN TABLE obsfromincomeband001; 2.创建具有存储方式和分布方式的表。 限于篇幅,此处仅给出再次创建storesales的语法。请从附录设计调优后二次表创建中拷贝其他表的语法进行创建。 CREATE TABLE storesales ( sssolddatesk integer , sssoldtimesk integer , ssitemsk integer not null, sscustomersk integer , sscdemosk integer , sshdemosk integer , ssaddrsk integer , ssstoresk integer , sspromosk integer , ssticketnumber bigint not null, ssquantity integer , sswholesalecost decimal(7,2) , sslistprice decimal(7,2) , sssalesprice decimal(7,2) , ssextdiscountamt decimal(7,2) , ssextsalesprice decimal(7,2) , ssextwholesalecost decimal(7,2) , ssextlistprice decimal(7,2) , ssexttax decimal(7,2) , sscouponamt decimal(7,2) , ssnetpaid decimal(7,2) , ssnetpaidinctax decimal(7,2) , ssnetprofit decimal(7,2) ) WITH (ORIENTATION column,COMPRESSIONmiddle) DISTRIBUTE BY hash (ssitemsk); 3.参考步骤1:创建初始表并加装样例数据中的“为这些表加载样例数据”。 4.在基准表中记录加载时间。 基准 优化前 优化后 加载时间(11张表) 341584ms 257241ms 占用存储 StoreSales 42GB DateDim 11MB Store 232kB Item 110MB TimeDim 11MB Promotion 256kB CustomerDemographics 171MB CustomerAddress 170MB HouseholdDemographics 504kB Customer 441MB IncomeBand 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.nodename FROM (SELECT count() AS count,xcnodeid FROM tablename GROUP BY xcnodeid) a, pgxcnode b WHERE a.xcnodeidb.nodeid ORDER BY a.count desc; 其中xcnodeid对应DN,一般来说,不同DN 的数据量相差5% 以上即可视为倾斜,如果相差10% 以上就必须要调整分布列 。DWS支持多分布列特性,可以更好地满足数据分布的均匀性要求。