
# 使用DWS秒级查询交通卡口通行车辆行驶路线
本实践将演示交通卡口车辆通行分析，将加载8.9亿条交通卡口车辆通行模拟数据到数据仓库单个数据库表中，并进行车辆精确查询和车辆模糊查询，展示DWS对于历史详单数据的高性能查询能力。
![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
DWS已预先将样例数据上传到OBS桶的"traffic-data"文件夹中，并给所有华为云用户赋予了该OBS桶的只读访问权限。
#### 视频介绍
<video controls="controls" preload="none" id="object663011275415" class="idp-external-video" src="https://res-video.hc-cdn.com/cloudbu-site/china/zh-cn/support/dws-video/1627736970168002355.mp4" title="交通卡口数据查询分析" poster="https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002369042480.png" height="310.0000" width="600.0000"></video>
#### 操作流程
本实践预计时长40分钟，基本流程如下：
1. [准备工作]
2. [步骤一：创建集群]
3. [步骤二：导入交通卡口样例数据]
4. [步骤三：车辆分析]
 
 #### 支持区域
当前已上传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    |
   
 #### 准备工作
- 已注册账号，且在使用DWS 前检查账号状态，账号不能处于欠费或冻结状态。
- 参见[新增访问密钥](https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html#section1)获取此账号的"AK/SK"。
 
 #### 步骤一：创建集群
参见[创建集群](https://support.huaweicloud.com/mgtg-dws/dws_01_0019.html)完成DWS集群创建。注意区域选择"华北-北京四"。版本选择"**存算一体** "。**本实践为业务调测，公网访问** 、**弹性负载均衡** ，可以均不使用。
![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
本指导以"华北-北京四"为例进行介绍，如果您需要选择其他区域进行操作，请确保所有操作均在同一区域进行。
 #### 步骤二：导入交通卡口样例数据
使用SQL客户端工具连接到集群后，在SQL客户端工具中，执行以下步骤导入交通卡口车辆通行的样例数据并执行查询。
1. 如果是业务调测场景，推荐通过**SQL编辑器** 进行连接，参见[使用SQL编辑器连接集群](https://support.huaweicloud.com/mgtg-dws/dws_01_0803.html#section1)完成连接。
   
   也可以通过其他方式连接（例如命令行gsql工具），参见[连接DWS集群](https://support.huaweicloud.com/mgtg-dws/dws_01_0131.html)。
   
   
2. 在SQL编辑器的SQL窗口中执行以下语句，创建traffic数据库。 
   ```
   CREATE DATABASE traffic encoding 'utf8' template template0;
   ```
   
   
3. 在SQL编辑器页面，上方切换到新的数据库traffic。 
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002659098383.png "点击放大")
   
   
   
4. 在新的数据库中，执行以下语句，创建表。 
   ```
   DROP TABLE if exists GCJL;
   CREATE TABLE GCJL
   (
           kkbh   VARCHAR(20), 
           hphm   VARCHAR(20),
           gcsj   DATE ,
           cplx   VARCHAR(8),
           cllx   VARCHAR(8),
           csys   VARCHAR(8)
   )
   with (orientation = column, COMPRESSION=MIDDLE)
   distribute by hash(hphm);
   ```
   
   
5. 创建外表。外表用于识别和关联OBS上的源数据。 
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/caution_3.0-zh-cn.png)
   - *\<obs_bucket_name\>* 表示OBS桶名，当前系统已预置了OBS桶和样例数据，用户无需创建，请替换为DWS所在的实际区域对应的桶名，参见[支持区域]，本实践以"华北-北京四"地区为例，请替换为dws-demo-cn-north-4。不支持跨区域访问OBS桶数据，例如集群在"华北-北京四"，不能将\<obs_bucket_name\>替换成其他区域所对应的桶名。
   
   
   
   - \<Access_Key_Id\>和\<Secret_Access_Key\>替换为实际值，在[准备工作]获取。
   
   - 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全。
    
   ```
   DROP FOREIGN table if exists GCJL_OBS;
   CREATE FOREIGN TABLE GCJL_OBS
   (
           like GCJL
   )
   SERVER gsmpp_server 
   OPTIONS (
           encoding 'utf8',
           location 'obs://<obs_bucket_name>/traffic-data/gcxx',
           format 'text',
           delimiter ',',
           access_key '<Access_Key_Id>',
           secret_access_key '<Secret_Access_Key>',
           chunksize '64',
           IGNORE_EXTRA_DATA 'on'
   );
   ```
   
   
6. 将数据从外表导入到数据库表中。 
   ```
   INSERT INTO GCJL SELECT * FROM GCJL_OBS;
   ```
   导入数据需要一些时间，请耐心等待。
   
   
 
 #### 步骤三：车辆分析
1. **执行ANALYZE** 。
   用于收集与数据库中普通表内容相关的统计信息，统计结果存储在系统表PG_STATISTIC中。执行计划生成器会使用这些统计数据，以生成最有效的查询执行计划。
   执行以下语句生成表统计信息：
   ```
   ANALYZE;
   ```
   

2. **查询数据表中的数据量** 。
   执行如下语句，可以查看已加载的数据条数。
   ```
   SELECT count(*) FROM gcjl;
   ```
   

3. **车辆精确查询** 。
   执行以下语句，指定车牌号码和时间段查询车辆行驶路线。DWS在应对点查时秒级响应。
   ```
   SELECT hphm, kkbh, gcsj
   FROM gcjl
   where hphm =  'YD38641'
   and gcsj between '2016-01-06' and '2016-01-07'
   order by gcsj desc;
   ```
   

4. **车辆模糊查询** 。
   执行以下语句，指定车牌号码和时间段查询车辆行驶路线，DWS 在应对模糊查询时秒级响应。
   ```
   SELECT hphm, kkbh, gcsj 
   FROM gcjl
   where hphm like  'YA23F%'
   and kkbh in('508', '1125', '2120') 
   and gcsj between '2016-01-01' and '2016-01-07'  
   order by hphm,gcsj desc;
   ```
   
 
