文档首页> 数据仓库服务 GaussDB(DWS)> 最佳实践> 调优表实践> 步骤1:创建初始表并加装样例数据
更新时间:2024-03-06 GMT+08:00

步骤1:创建初始表并加装样例数据

支持区域

当前已上传OBS数据的区域如表1所示。

表1 区域和OBS桶名

区域

OBS桶名

华北-北京一

dws-demo-cn-north-1

华北-北京二

dws-demo-cn-north-2

华北-北京四

dws-demo-cn-north-4

华北-乌兰察布一

dws-demo-cn-north-9

华东-上海一

dws-demo-cn-east-3

华东-上海二

dws-demo-cn-east-2

华南-广州

dws-demo-cn-south-1

华南-广州友好

dws-demo-cn-south-4

中国-香港

dws-demo-ap-southeast-1

亚太-新加坡

dws-demo-ap-southeast-3

亚太-曼谷

dws-demo-ap-southeast-2

拉美-圣地亚哥

dws-demo-la-south-2

非洲-约翰内斯堡

dws-demo-af-south-1

拉美-墨西哥城一

dws-demo-na-mexico-1

拉美-墨西哥城二

dws-demo-la-north-2

莫斯科二

dws-demo-ru-northwest-2

拉美-圣保罗一

dws-demo-sa-brazil-1

创建一组不设置存储方式,无分布键、分布方式和压缩方式的表。然后,为这些表加载样例数据。

  1. (可选)创建集群。

    如果已经有可供使用的集群,则可跳过这一步。创建集群的操作,请按创建DWS 2.0集群中的步骤操作。

    同时请参考连接集群的方式中的方法连接到集群并测试连接。

    本实践所使用的是8节点集群。也可以使用4节点集群进行测试。

  2. 使用最少的属性创建SS(Store_Sales)测试表。

    如果SS表在当前数据库中已存在,需要先删除这些表。删除表使用DROP TABLE命令。如下示例表示删除表store_sales。

    1
    DROP TABLE store_sales
    

    考虑到本实践的目的,首次创建表时,没有设置存储方式、分布键、分布方式和压缩方式。

    执行CREATE TABLE命令创建图3中的11张表。限于篇幅,这里仅附store_sales的创建语法。请从附录初始表创建中拷贝所有建表语法进行创建。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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存储桶中提供了本次实践的样例数据。该存储桶向所有经过身份验证的云用户提供了读取权限。请按照下面的步骤加载这些样例数据:

    1. 为每个表创建对应的外表。

      GaussDB(DWS)应用Postgres提供的外部数据封装器FDW(Foreign Data Wrapper)进行数据并行导入。因此需要先创建FDW表,又称外表。限于篇幅,此处仅给出“store_sales”表对应的外表“obs_from_store_sales_001”的创建语法。请从附录外表创建拷贝其他外表的语法进行创建。

      • 注意,以下语句中的<obs_bucket_name>代表OBS桶名,仅支持部分区域,当前支持的区域和对应的OBS桶名请参见表1。GaussDB(DWS) 集群不支持跨区域访问OBS桶数据。
      • 外表字段需与即将注入数据的普通表字段保持一致。例如此处store_sales表及其对应的外表obs_from_store_sales_001,他们的字段是一致的。
      • 这些外表语法能够帮助您获取OBS存储桶中为本次实践所提供的样例数据。如果您需要加载其他样例数据,需进行SERVER gsmpp_server OPTIONS的调整。具体可参考关于OBS并行导入
      • 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      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 'obs://<obs_bucket_name>/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;
      
    2. 将创建外表语句中的参数ACCESS_KEY和SECRET_ACCESS_KEY替换为实际值,然后在客户端工具中执行替换后的语句创建外表。

      ACCESS_KEY和SECRET_ACCESS_KEY的值,请参见的创建访问密钥(AK和SK)章节进行获取,然后将获取到的值替换到创建外表语句中。

    3. 执行数据导入。
      创建包含如下语句的insert.sql脚本文件,并执行.sql脚本文件。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      \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
      

      结果应该类似如下:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      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
      
    4. 计算所有11张表的总执行时间。该数字将作为加载时间记录在下一小节步骤1中的基准表内。
    5. 执行以下命令,验证每个表是否都已正确加载并将行数记录到表中。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      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更新统计信息。

    1
    ANALYZE
    

    返回ANALYZE后,表示执行成功。

    1
    ANALYZE
    

    ANALYZE语句可收集数据库中与表内容相关的统计信息,统计结果存储在系统表PG_STATISTIC中。查询优化器会使用这些统计数据,以生成最有效的执行计划。

    建议在执行了大批量插入/删除操作后,例行对表或全库执行ANALYZE语句更新统计信息。