phoenix 有时候不走二级索引 会 更快 /*+ NO_INDEX*/

本文探讨了在Phoenix数据库中,如何通过禁用二级索引优化特定SQL查询效率的案例。通过对查询计划的分析,展示了在结果集较小的情况下,直接使用row key进行查询比使用二级索引更为高效。
0: jdbc:phoenix:192.168.199.154> select t1.seq_id as seq_id from (select seq_id,toy from T_EXTENSION_SHOW where show_date='2018-11-24' and email='wjc@45555.com') t1 where t1.toy='ambi' and t1.cam_site='cam4' order by t1.seq_id desc limit 1;
+---------+
| SEQ_ID  |
+---------+
| 45555   |
+---------+
1 row selected (0.663 seconds)


0: jdbc:phoenix:192.168.199.154> explain select t1.seq_id as seq_id from (select seq_id,toy from T_EXTENSION_SHOW where show_date='2018-11-24' and email='wjc@45555.com') t1 where t1.toy='ambi' and t1.cam_site='cam4' order by t1.seq_id desc limit 1;
+--------------------------------------------------------------------------------------------------------------------------------------------+-----------------+----------------+----------------+
|                                                                    PLAN                                                                    | EST_BYTES_READ  | EST_ROWS_READ  |  EST_INFO_TS   |
+--------------------------------------------------------------------------------------------------------------------------------------------+-----------------+----------------+----------------+
| CLIENT 1-CHUNK 4309216 ROWS 314572800 BYTES PARALLEL 1-WAY RANGE SCAN OVER IDX_T_EXTENSION_SHOW_CAM_SITE_TOY ['2018-11-24','cam4','ambi']  | 314572800       | 4309216        | 1543840687850  |
|     SERVER FILTER BY FIRST KEY ONLY AND "EMAIL" = 'wjc@45555.com'                                                                          | 314572800       | 4309216        | 1543840687850  |
|     SERVER 1 ROW LIMIT                                                                                                                     | 314572800       | 4309216        | 1543840687850  |
| CLIENT 1 ROW LIMIT                                                                                                                         | 314572800       | 4309216        | 1543840687850  |
+--------------------------------------------------------------------------------------------------------------------------------------------+-----------------+----------------+----------------+
4 rows selected (0.082 seconds)

分析上面的sql,查询条件中email是最细粒度,查出来就1条数据。row key是由show_date + email + seq_id组成的。

phoenix自动优化,使用了二级索引IDX_T_EXTENSION_SHOW_CAM_SITE_TOY ,反而降低了查询效率。

 

实际上我不希望sql走二级索引,希望SQL走自带的row key,进行查询。可以这样做。

0: jdbc:phoenix:192.168.199.154> select /*+ NO_INDEX*/ t1.seq_id as seq_id from (select seq_id,toy from T_EXTENSION_SHOW where show_date='2018-11-24' and email='wjc@45555.com') t1 where t1.toy='ambi' and t1.cam_site='cam4' order by t1.seq_id desc limit 1;
+---------+
| SEQ_ID  |
+---------+
| 45555   |
+---------+
1 row selected (0.046 seconds)


0: jdbc:phoenix:192.168.199.154> explain select /*+ NO_INDEX*/ t1.seq_id as seq_id from (select seq_id,toy from T_EXTENSION_SHOW where show_date='2018-11-24' and email='wjc@45555.com') t1 where t1.toy='ambi' and t1.cam_site='cam4' order by t1.seq_id desc limit 1;
+-----------------------------------------------------------------------------------------------------------------------+-----------------+----------------+--------------+
|                                                         PLAN                                                          | EST_BYTES_READ  | EST_ROWS_READ  | EST_INFO_TS  |
+-----------------------------------------------------------------------------------------------------------------------+-----------------+----------------+--------------+
| CLIENT 1-CHUNK 0 ROWS 0 BYTES PARALLEL 1-WAY REVERSE RANGE SCAN OVER T_EXTENSION_SHOW ['2018-11-24','wjc@45555.com']  | 0               | 0              | null         |
|     SERVER FILTER BY (TOY = 'ambi' AND CAM_SITE = 'cam4')                                                             | 0               | 0              | null         |
|     SERVER 1 ROW LIMIT                                                                                                | 0               | 0              | null         |
| CLIENT 1 ROW LIMIT                                                                                                    | 0               | 0              | null         |
+-----------------------------------------------------------------------------------------------------------------------+-----------------+----------------+--------------+
4 rows selected (0.126 seconds)

结果集够小的情况,FILTER BY很快。

0.663s VS 0.046s

 

END

 

 

 

namespace phoenix { namespace ad_msg { /** * @brief target trajectory status */ enum class TarTrajectoryStatus { INVALID = 0, CRUISING, BYPASSING }; /** * @brief 规划状态字 */ enum class PlanStatus : uint8_t { PLANNING_OK = 0, /** <规划成功 */ INIT_FAILED = 1, /** <初始化失败 */ PLANNING_FAILED = 2, /** <规划失败 */ PLANNING_FINISH = 3, /** <规划完成 */ PLANNING_NOT_UPDATE = 4, /** <规划轨迹更新 */ PLANNING_BLOCKING = 5, /** <规划阻塞状态 */ }; /** * @brief紧急制动状态 */ enum class EmergencyStatesStop : uint8_t { IDLE = 0, ///**<IdleNo Braking */ COMFORTABLE = 1, ///**<Comfortable */ EMERGENCY = 2, ///**<Emergency */ RESERVED = 3, ///**<Reserved */ }; /** * @brief巡航规划算法输出 */ struct PlanningOutPut { uint32_t point_num; /**< 轨迹点个数 */ uint32_t seg_num; /**< 轨迹段数 */ uint32_t seg_start_pos[20]; /**< 每段轨迹起点在总轨迹的索引 */ uint32_t seg_end_pos[20]; /**< 每段轨迹终点在总轨迹的索引 */ float x[MAX_CRUISE_PLANNING_POINT]; /**< 轨迹点坐标x值,单位为米 */ float y[MAX_CRUISE_PLANNING_POINT]; /**< 轨迹点坐标x值,单位为米 */ float z[MAX_CRUISE_PLANNING_POINT]; /**< 轨迹点坐标z值,单位为米 */ float pitch[MAX_CRUISE_PLANNING_POINT]; /**< 轨迹点俯仰角的值,单位为弧度 */ float roll[MAX_CRUISE_PLANNING_POINT]; /**< 轨迹点横滚角的值,单位为弧度 */ float yaw[MAX_CRUISE_PLANNING_POINT]; /**< 轨迹点航向角的值,单位为弧度 */ float kappa[MAX_CRUISE_PLANNING_POINT]; /**< 轨迹点曲率的值 */ float dir[MAX_CRUISE_PLANNING_POINT]; /**< 轨迹点方向的值 */ float speed[MAX_CRUISE_PLANNING_POINT]; /**< 轨迹点速度 */ float a[MAX_CRUISE_PLANNING_POINT]; /**<轨迹点加速度 */ float s[MAX_CRUISE_PLANNING_POINT]; /**<轨迹点累计位移 */ PlanStatus planning_status; /**< 规划状态 */ TarTrajectoryStatus tar_trajectory_status; /**< target trajectory status */ EmergencyStatesStop emergency_states; ///< 紧急制动状态 }; } } syntax = "proto2"; package phoenix.msg.planning; // 目标轨迹状态 enum TarTrajectoryStatus { INVALID = 0; CRUISING = 1; // 自动分配的连续值需显式声明 BYPASSING = 2; } // 紧急状态信息 enum EmergencyStatesStop { IDLE = 0; ///< 空闲(无制动) COMFORTABLE = 1; ///< 舒适制动 EMERGENCY = 2; ///< 紧急制动 RESERVED = 3; ///< 保留状态 } // 规划状态字 enum PlanStatus { PLANNING_OK = 0; ///< 规划成功 INIT_FAILED = 1; ///< 初始化失败 PLANNING_FAILED = 2; ///< 规划失败 PLANNING_FINISH = 3; ///< 规划完成 PLANNING_NOT_UPDATE = 4; ///< 规划轨迹更新 PLANNING_BLOCKING = 5; ///< 规划阻塞状态 } // 巡航规划算法输出 message OutDataCruiseTrajPlanning { required uint32 point_num = 1; ///< 轨迹点个数 required uint32 seg_num = 2; ///< 轨迹段数 // 段索引数组(固定长度20) repeated uint32 seg_start_pos = 3 ; //max_size = 20 repeated uint32 seg_end_pos = 4 ; //max_size = 20 // 轨迹点数据数组 (proto2中需显式声明packed) repeated float x = 5 [packed = true]; ///< x坐标(米) repeated float y = 6 [packed = true]; ///< y坐标(米) repeated float z = 7 [packed = true]; ///< z坐标(米) repeated float pitch = 8 [packed = true]; ///< 俯仰角(弧度) repeated float roll = 9 [packed = true]; ///< 横滚角(弧度) repeated float yaw = 10 [packed = true]; ///< 航向角(弧度) repeated float kappa = 11 [packed = true]; ///< 曲率 repeated float dir = 12 [packed = true]; ///< 方向 repeated float speed = 13 [packed = true]; ///< 速度 // 状态字段(必需字段) required PlanStatus planning_status = 14; ///< 规划状态 required TarTrajectoryStatus tar_trajectory_status = 15; ///< 绕障状态 required EmergencyStatesStop emergency_states = 16; ///< 紧急停车状态 } 实现bool ParseProtoMsg::EncodePlanningResultMessage( const phoenix::ad_msg::PlanningOutPut &msg, phoenix::msg::planning::OutDataCruiseTrajPlanning *const data_out) 其中msg为输入,data_out为输出
最新发布
11-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值