From e46d120e8ef7de8660d10a96f8cfee47e8836b53 Mon Sep 17 00:00:00 2001
From: Mattias Jonsson <mattias.jonsson@sun.com>
Date: Thu, 4 Mar 2010 12:09:09 +0100
Subject: [PATCH] Bug#48229: group by performance issue of partitioned table

Problem was block_size on partitioned tables was not set,
resulting in keys_per_block was not correct which affects
the cost calculation for read time of indexes (including
cost for group min/max).Which resulted in a bad optimizer
decision.

Fixed by setting stats.block_size correctly.

mysql-test/r/partition_range.result:
  Bug#48229: group by performance issue of partitioned table

  Added result
mysql-test/t/partition_range.test:
  Bug#48229: group by performance issue of partitioned table

  Added test
sql/ha_partition.cc:
  Bug#48229: group by performance issue of partitioned table

  Added missing assignment of stats.block_size.
---
 mysql-test/r/partition_range.result | 14 ++++++++++++++
 mysql-test/t/partition_range.test   | 18 ++++++++++++++++++
 sql/ha_partition.cc                 |  1 +
 3 files changed, 33 insertions(+)

diff --git a/mysql-test/r/partition_range.result b/mysql-test/r/partition_range.result
index 02d2f6359c..731f2478cc 100644
--- a/mysql-test/r/partition_range.result
+++ b/mysql-test/r/partition_range.result
@@ -1,4 +1,18 @@
 drop table if exists t1, t2;
+#
+# Bug#48229: group by performance issue of partitioned table
+#
+CREATE TABLE t1 (
+a INT,
+b INT,
+KEY a (a,b)
+)
+PARTITION BY HASH (a) PARTITIONS 1;
+INSERT INTO t1 VALUES (0, 580092), (3, 894076), (4, 805483), (4, 913540), (6, 611137), (8, 171602), (9, 599495), (9, 746305), (10, 272829), (10, 847519), (12, 258869), (12, 929028), (13, 288970), (15, 20971), (15, 105839), (16, 788272), (17, 76914), (18, 827274), (19, 802258), (20, 123677), (20, 587729), (22, 701449), (25, 31565), (25, 230782), (25, 442887), (25, 733139), (25, 851020);
+EXPLAIN SELECT a, MAX(b) FROM t1 WHERE a IN (10, 100, 3) GROUP BY a;
+id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
+1	SIMPLE	t1	range	a	a	5	NULL	4	Using where; Using index
+DROP TABLE t1;
 create table t1 (a int)
 partition by range (a)
 ( partition p0 values less than (maxvalue));
diff --git a/mysql-test/t/partition_range.test b/mysql-test/t/partition_range.test
index c02d9049f2..4d011ddc46 100644
--- a/mysql-test/t/partition_range.test
+++ b/mysql-test/t/partition_range.test
@@ -9,6 +9,24 @@
 drop table if exists t1, t2;
 --enable_warnings
 
+--echo #
+--echo # Bug#48229: group by performance issue of partitioned table
+--echo #
+CREATE TABLE t1 (
+ a INT,
+ b INT,
+ KEY a (a,b)
+)
+PARTITION BY HASH (a) PARTITIONS 1;
+
+# insert some rows (i.e. so that rows/blocks > 1)
+INSERT INTO t1 VALUES (0, 580092), (3, 894076), (4, 805483), (4, 913540), (6, 611137), (8, 171602), (9, 599495), (9, 746305), (10, 272829), (10, 847519), (12, 258869), (12, 929028), (13, 288970), (15, 20971), (15, 105839), (16, 788272), (17, 76914), (18, 827274), (19, 802258), (20, 123677), (20, 587729), (22, 701449), (25, 31565), (25, 230782), (25, 442887), (25, 733139), (25, 851020);
+
+# Before the fix the 'Extra' column showed 'Using index for group-by'
+EXPLAIN SELECT a, MAX(b) FROM t1 WHERE a IN (10, 100, 3) GROUP BY a;
+
+DROP TABLE t1;
+
 #
 # BUG 33429: Succeeds in  adding partition when maxvalue on last partition
 #
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index b854e27002..36bd90e323 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -5053,6 +5053,7 @@ int ha_partition::info(uint flag)
 
     file= m_file[handler_instance];
     file->info(HA_STATUS_CONST);
+    stats.block_size= file->stats.block_size;
     stats.create_time= file->stats.create_time;
     ref_length= m_ref_length;
   }
-- 
2.30.9