更新时间:2024-11-05 GMT+08:00
案例:改建分区表
逻辑上的一张表根据某种策略分成多个物理块进行存储,这张逻辑上的表称之为分区表,每个物理块则称为一个分区。一般对数据和查询都有明显区间段特征的表使用分区策略可通过较小不必要的数据扫描,从而提升查询性能
在查询时,可通过分区剪枝技术尽可能减少底层数据扫描,即缩小表的扫描范围。分区剪枝是指对于分区表或分区索引来说,优化器可以自动从FROM和WHERE子句里根据分区键提取出需要扫描的分区,从而避免全表扫描,减少扫描的数据块,提高性能。
优化前
创建一个非分区表orders_no_part,表定义如下:
执行以下SQL语句查询非分区表的执行计划:
1 2 3 |
EXPLAIN PERFORMANCE SELECT count(*) FROM orders_no_part WHERE o_orderdate >= '1996-01-01 00:00:00'::timestamp(0); |
由下图可知执行时间为73毫秒,其中全表扫描的时间为44~45毫秒。
优化后
创建一个分区表orders。表定义如下:
再次执行SQL语句,查询分区表的执行计划。执行时间为40毫秒,其中表扫描时间仅为13毫秒,另Iterations越小,分区剪枝效果越好。
1 2 3 |
EXPLAIN PERFORMANCE SELECT count(*) FROM orders_no_part WHERE o_orderdate >= '1996-01-01 00:00:00'::timestamp(0); |
由下图可知执行时间为40毫秒,其中表扫描时间仅为13毫秒。另外Iterations越小,分区剪枝效果越好。
父主题: SQL调优案例