@@ -2735,100 +2735,100 @@ CREATE TABLE btg AS SELECT
2735
2735
'abc' || i % 10 AS z,
2736
2736
i AS w
2737
2737
FROM generate_series(1,10000) AS i;
2738
- CREATE INDEX abc ON btg(x,y);
2738
+ CREATE INDEX btg_x_y_idx ON btg(x,y);
2739
2739
ANALYZE btg;
2740
2740
-- GROUP BY optimization by reorder columns by frequency
2741
2741
SET enable_hashagg=off;
2742
2742
SET max_parallel_workers= 0;
2743
2743
SET max_parallel_workers_per_gather = 0;
2744
2744
-- Utilize index scan ordering to avoid a Sort operation
2745
2745
EXPLAIN (COSTS OFF) SELECT count(*) FROM btg GROUP BY x,y;
2746
- QUERY PLAN
2747
- ----------------------------------------
2746
+ QUERY PLAN
2747
+ ------------------------------------------------
2748
2748
GroupAggregate
2749
2749
Group Key: x, y
2750
- -> Index Only Scan using abc on btg
2750
+ -> Index Only Scan using btg_x_y_idx on btg
2751
2751
(3 rows)
2752
2752
2753
2753
EXPLAIN (COSTS OFF) SELECT count(*) FROM btg GROUP BY y,x;
2754
- QUERY PLAN
2755
- ----------------------------------------
2754
+ QUERY PLAN
2755
+ ------------------------------------------------
2756
2756
GroupAggregate
2757
2757
Group Key: x, y
2758
- -> Index Only Scan using abc on btg
2758
+ -> Index Only Scan using btg_x_y_idx on btg
2759
2759
(3 rows)
2760
2760
2761
2761
-- Engage incremental sort
2762
2762
explain (COSTS OFF) SELECT x,y FROM btg GROUP BY x,y,z,w;
2763
- QUERY PLAN
2764
- -----------------------------------------
2763
+ QUERY PLAN
2764
+ -------------------------------------------------
2765
2765
Group
2766
2766
Group Key: x, y, z, w
2767
2767
-> Incremental Sort
2768
2768
Sort Key: x, y, z, w
2769
2769
Presorted Key: x, y
2770
- -> Index Scan using abc on btg
2770
+ -> Index Scan using btg_x_y_idx on btg
2771
2771
(6 rows)
2772
2772
2773
2773
explain (COSTS OFF) SELECT x,y FROM btg GROUP BY z,y,w,x;
2774
- QUERY PLAN
2775
- -----------------------------------------
2774
+ QUERY PLAN
2775
+ -------------------------------------------------
2776
2776
Group
2777
2777
Group Key: x, y, z, w
2778
2778
-> Incremental Sort
2779
2779
Sort Key: x, y, z, w
2780
2780
Presorted Key: x, y
2781
- -> Index Scan using abc on btg
2781
+ -> Index Scan using btg_x_y_idx on btg
2782
2782
(6 rows)
2783
2783
2784
2784
explain (COSTS OFF) SELECT x,y FROM btg GROUP BY w,z,x,y;
2785
- QUERY PLAN
2786
- -----------------------------------------
2785
+ QUERY PLAN
2786
+ -------------------------------------------------
2787
2787
Group
2788
2788
Group Key: x, y, w, z
2789
2789
-> Incremental Sort
2790
2790
Sort Key: x, y, w, z
2791
2791
Presorted Key: x, y
2792
- -> Index Scan using abc on btg
2792
+ -> Index Scan using btg_x_y_idx on btg
2793
2793
(6 rows)
2794
2794
2795
2795
explain (COSTS OFF) SELECT x,y FROM btg GROUP BY w,x,z,y;
2796
- QUERY PLAN
2797
- -----------------------------------------
2796
+ QUERY PLAN
2797
+ -------------------------------------------------
2798
2798
Group
2799
2799
Group Key: x, y, w, z
2800
2800
-> Incremental Sort
2801
2801
Sort Key: x, y, w, z
2802
2802
Presorted Key: x, y
2803
- -> Index Scan using abc on btg
2803
+ -> Index Scan using btg_x_y_idx on btg
2804
2804
(6 rows)
2805
2805
2806
2806
-- Subqueries
2807
2807
explain (COSTS OFF) SELECT x,y
2808
2808
FROM (SELECT * FROM btg ORDER BY x,y,w,z) AS q1
2809
2809
GROUP BY (w,x,z,y);
2810
- QUERY PLAN
2811
- ----------------------------------------------
2810
+ QUERY PLAN
2811
+ -------------------------------------------------
2812
2812
Group
2813
2813
Group Key: btg.x, btg.y, btg.w, btg.z
2814
2814
-> Incremental Sort
2815
2815
Sort Key: btg.x, btg.y, btg.w, btg.z
2816
2816
Presorted Key: btg.x, btg.y
2817
- -> Index Scan using abc on btg
2817
+ -> Index Scan using btg_x_y_idx on btg
2818
2818
(6 rows)
2819
2819
2820
2820
explain (COSTS OFF) SELECT x,y
2821
2821
FROM (SELECT * FROM btg ORDER BY x,y,w,z LIMIT 100) AS q1
2822
2822
GROUP BY (w,x,z,y);
2823
- QUERY PLAN
2824
- ----------------------------------------------------
2823
+ QUERY PLAN
2824
+ -------------------------------------------------------
2825
2825
Group
2826
2826
Group Key: btg.x, btg.y, btg.w, btg.z
2827
2827
-> Limit
2828
2828
-> Incremental Sort
2829
2829
Sort Key: btg.x, btg.y, btg.w, btg.z
2830
2830
Presorted Key: btg.x, btg.y
2831
- -> Index Scan using abc on btg
2831
+ -> Index Scan using btg_x_y_idx on btg
2832
2832
(7 rows)
2833
2833
2834
2834
-- Should work with and without GROUP-BY optimization
@@ -2844,16 +2844,16 @@ explain (COSTS OFF) SELECT x,y FROM btg GROUP BY w,x,z,y ORDER BY y,x,z,w;
2844
2844
2845
2845
-- Utilize incremental sort to make the ORDER BY rule a bit cheaper
2846
2846
explain (COSTS OFF) SELECT x,w FROM btg GROUP BY w,x,y,z ORDER BY x*x,z;
2847
- QUERY PLAN
2848
- -----------------------------------------------
2847
+ QUERY PLAN
2848
+ -------------------------------------------------------
2849
2849
Sort
2850
2850
Sort Key: ((x * x)), z
2851
2851
-> Group
2852
2852
Group Key: x, y, w, z
2853
2853
-> Incremental Sort
2854
2854
Sort Key: x, y, w, z
2855
2855
Presorted Key: x, y
2856
- -> Index Scan using abc on btg
2856
+ -> Index Scan using btg_x_y_idx on btg
2857
2857
(8 rows)
2858
2858
2859
2859
SET enable_incremental_sort = off;
0 commit comments