From: Jorgen Loland Date: November 22 2010 1:22pm Subject: bzr commit into mysql-next-mr-bugfixing branch (jorgen.loland:3235) WL#5594 List-Archive: http://lists.mysql.com/commits/124625 Message-Id: <20101122132207.5B4D24A6@atum21.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2982739352998419930==" --===============2982739352998419930== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/jl208045/mysql/wl4800/mysql-next-mr-opt-backporting-wl4800-patchcleanup/ based on revid:jorgen.loland@stripped 3235 Jorgen Loland 2010-11-22 WL#5594 - Add optimizer traces to the range optimizer Minor changes as requested by reviewer. @ sql/opt_range.cc * print_key2 renamed to print_key_value. Function will now only print the range for a single key part, and length parameter is no longer needed. * Create new scope for trace object and move object creation outside if() in get_best_ror_intersect() modified: sql/opt_range.cc === modified file 'sql/opt_range.cc' --- a/sql/opt_range.cc 2010-11-22 09:59:17 +0000 +++ b/sql/opt_range.cc 2010-11-22 13:22:03 +0000 @@ -809,8 +809,7 @@ static void print_quick(QUICK_SELECT_I * #endif static void append_range(String *out, const KEY_PART_INFO *key_parts, - const uchar *min_key, const uint16 min_length, - const uchar *max_key, const uint16 max_length, + const uchar *min_key, const uchar *max_key, const uint flag); #endif @@ -1977,10 +1976,8 @@ public: @param[in] used_length Key tuple length */ static void -print_key2(String *out, const KEY_PART_INFO *key_part, const uchar *key, - uint used_length) +print_key_value(String *out, const KEY_PART_INFO *key_part, const uchar *key) { - const uchar *key_end= key + used_length; String tmp; uint store_length; TABLE *table= key_part->field->table; @@ -1988,35 +1985,32 @@ print_key2(String *out, const KEY_PART_I dbug_tmp_use_all_columns(table, old_sets, table->read_set, table->write_set); - for (; key < key_end; key+= store_length, key_part++) - { - Field *field= key_part->field; - store_length= key_part->store_length; + Field *field= key_part->field; + store_length= key_part->store_length; - if (field->real_maybe_null()) + if (field->real_maybe_null()) + { + /* + Byte 0 of key is the null-byte. If set, key is NULL. + Otherwise, print the key value starting immediately after the + null-byte + */ + if (*key) { - /* - Byte 0 of key is the null-byte. If set, key is NULL. - Otherwise, print the key value starting immediately after the - null-byte - */ - if (*key) - { - out->append(STRING_WITH_LEN("NULL")); - continue; - } - key++; // Skip null byte - store_length--; + out->append(STRING_WITH_LEN("NULL")); + goto restore_col_map; } - field->set_key_image(key, key_part->length); - if (field->type() == MYSQL_TYPE_BIT) - (void) field->val_int_as_str(&tmp, 1); // may change tmp's charset - else - field->val_str(&tmp); // may change tmp's charset - out->append(tmp.ptr(), tmp.length(), tmp.charset()); - if (key + store_length < key_end) - out->append('\''); + key++; // Skip null byte + store_length--; } + field->set_key_image(key, key_part->length); + if (field->type() == MYSQL_TYPE_BIT) + (void) field->val_int_as_str(&tmp, 1); // may change tmp's charset + else + field->val_str(&tmp); // may change tmp's charset + out->append(tmp.ptr(), tmp.length(), tmp.charset()); + +restore_col_map: dbug_tmp_restore_column_maps(table->read_set, table->write_set, old_sets); } @@ -2081,8 +2075,7 @@ public: { const KEY_PART_INFO *cur_key_part= key_part + part->part; append_range(&range_info, cur_key_part, - part->min_value, cur_key_part->length, - part->max_value, cur_key_part->length, + part->min_value, part->max_value, part->min_flag | part->max_flag); } trace_range.add_str(range_info.ptr(), range_info.length()); @@ -2168,8 +2161,7 @@ public: { const KEY_PART_INFO *cur_key_part= key_part + part->part; append_range(&range_info, cur_key_part, - part->min_value, cur_key_part->length, - part->max_value, cur_key_part->length, + part->min_value, part->max_value, part->min_flag | part->max_flag); } trace_range.add_str(range_info.ptr(), range_info.length()); @@ -2324,8 +2316,7 @@ public: { const KEY_PART_INFO *cur_key_part= key_part + part->part; append_range(&range_info, cur_key_part, - part->min_value, cur_key_part->length, - part->max_value, cur_key_part->length, + part->min_value, part->max_value, part->min_flag | part->max_flag); } trace_range.add_str(range_info.ptr(), range_info.length()); @@ -5084,29 +5075,29 @@ TRP_ROR_INTERSECT *get_best_ror_intersec Check if we should add a CPK scan. If the obtained ROR-intersection is covering, it doesn't make sense to add CPK scan. */ - if (cpk_scan && !intersect->is_covering) - { - if (ror_intersect_add(intersect, cpk_scan, TRUE) && - (intersect->total_cost < min_cost)) + { // Scope for trace object + Opt_trace_object trace_cpk(param->thd->opt_trace, "clustered_pk"); + if (cpk_scan && !intersect->is_covering) { - Opt_trace_object (param->thd->opt_trace, "clustered_pk"). - add("clustered_pk_scan_added_to_intersect", true). - add("cumulated_cost", intersect->total_cost); - cpk_scan_used= TRUE; - intersect_best= intersect; //just set pointer here + if (ror_intersect_add(intersect, cpk_scan, TRUE) && + (intersect->total_cost < min_cost)) + { + trace_cpk.add("clustered_pk_scan_added_to_intersect", true). + add("cumulated_cost", intersect->total_cost); + cpk_scan_used= TRUE; + intersect_best= intersect; //just set pointer here + } + else + trace_cpk.add("clustered_pk_added_to_intersect", false). + add_str("cause", "cost"); } else - Opt_trace_object (param->thd->opt_trace, "clustered_pk"). - add("clustered_pk_added_to_intersect", false).add_str("cause", "cost"); - } - else - { - Opt_trace_object trace_cpk(param->thd->opt_trace, "clustered_pk"); - trace_cpk.add("clustered_pk_added_to_intersect", false). - add_str("cause", cpk_scan ? - "roworder_is_covering" : "no_clustered_pk_index"); + { + trace_cpk.add("clustered_pk_added_to_intersect", false). + add_str("cause", cpk_scan ? + "roworder_is_covering" : "no_clustered_pk_index"); + } } - /* Ok, return ROR-intersect plan if we have found one */ TRP_ROR_INTERSECT *trp= NULL; if (min_cost < read_time && (cpk_scan_used || best_num > 1)) @@ -8031,10 +8022,8 @@ static void step_down_to(String *s, SEL_ const KEY_PART_INFO *key_part= arg->param->table->key_info[arg->real_keyno].key_part + key_tree->part; - uint16 length= key_part->length; append_range(s, key_part, - key_tree->min_value, length, - key_tree->max_value, length, + key_tree->min_value, key_tree->max_value, key_tree->min_flag | key_tree->max_flag); } #endif @@ -8184,10 +8173,8 @@ walk_right_n_up: seq->param->table->key_info[seq->real_keyno].key_part + store_key_part->part; - uint16 length= kpi->length; append_range(&key_range_trace, kpi, - store_key_part->min_value, length, - store_key_part->max_value, length, + store_key_part->min_value, store_key_part->max_value, store_key_part->min_flag | store_key_part->max_flag); } #endif @@ -12340,21 +12327,18 @@ static void print_ror_scans_arr(TABLE *t #if !defined(DBUG_OFF) || defined(OPTIMIZER_TRACE) /** - Append range info to a string + Append range info for a key part to a string @param[in,out] out String the range info is appended to - @param[in] key_parts Index components description + @param[in] key_part Indexed column used in a range select @param[in] min_key Key tuple describing lower bound of range - @param[in] min_length Length of min_key @param[in] max_key Key tuple describing upper bound of range - @param[in] max_length Length of max_key @param[in] flag Key range flags defining what min_key and max_key represent @see my_base.h */ static void append_range(String *out, - const KEY_PART_INFO *key_parts, - const uchar *min_key, const uint16 min_length, - const uchar *max_key, const uint16 max_length, + const KEY_PART_INFO *key_part, + const uchar *min_key, const uchar *max_key, const uint flag) { if (out->length() > 0) @@ -12362,14 +12346,14 @@ static void append_range(String *out, if (!(flag & NO_MIN_RANGE)) { - print_key2(out, key_parts, min_key, min_length); + print_key_value(out, key_part, min_key); if (flag & NEAR_MIN) out->append(STRING_WITH_LEN(" < ")); else out->append(STRING_WITH_LEN(" <= ")); } - out->append(key_parts->field->field_name); + out->append(key_part->field->field_name); if (!(flag & NO_MAX_RANGE)) { @@ -12377,7 +12361,7 @@ static void append_range(String *out, out->append(STRING_WITH_LEN(" < ")); else out->append(STRING_WITH_LEN(" <= ")); - print_key2(out, key_parts, max_key, max_length); + print_key_value(out, key_part, max_key); } } @@ -12429,9 +12413,8 @@ void QUICK_RANGE_SELECT::dbug_dump(int i range_info.set_charset(system_charset_info); range= *pr; append_range(&range_info, head->key_info[index].key_part, - range->min_key, range->min_length, - range->max_key, range->max_length, - range->flag); + range->min_key, range->max_key, + range->flag); trace_range.add_str(range_info.ptr(), range_info.length()); } } --===============2982739352998419930== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jorgen.loland@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jorgen.loland@stripped\ # qvrxzu56p4qtczhd # target_branch: file:///export/home/jl208045/mysql/wl4800/mysql-next-\ # mr-opt-backporting-wl4800-patchcleanup/ # testament_sha1: a8d64db0fe7c57a174ea401fd1756c23c2a64d38 # timestamp: 2010-11-22 14:22:07 +0100 # base_revision_id: jorgen.loland@stripped\ # 72wbo7qtkh12ry8w # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWe1X/KcABAP/gHUUqgB5//// +//+qr////pgCK3e7nj1x33TbQ973tfWneO6Nrbns7bwukJEoGqntDVNlNk0xGalP1PSbSm8lPaU 9T1M1HqA9Q0AAaANEANCaCFPSP1Q9TagABoAAAAAANAxJiTRNJpNNPU9QGmjNQANNNAAAAAAAJTR EEGibU0anqbU8oaeptTQyANAAPUAAAGg2oqn6U9TNI8k0NANDQADQAyGmgAAAACSImgTTBTyE1PR op6anqep6j1GmnohoZAAADQ/SmlYHiwS1W8/1/vloDImc8yn/6qZfp7P4fRruV2T3I1eerWT1K4f fa5d7/6bNdSYDPtOOphvrMAmY8/X6Oxkh2ayE49Dj3BMQyQwlNHAmKYzE3OBywyWFTyahUoiJQoV EkCTgS9ToCaA4Kld1KXt4JUGxcPjTJVaOFdSnp/HSxCbXLf/MS5bnIPPgzDmp4658eXPXnuVUNVu lorcta5wyD4AMsl9GQsrJ0HURfZXzJlotfCQia0MpkbZsc+jNv91clbAqI3tvbGenFhaf7F12X7Q KuHkGZqB3cKRl95TR4bsQRXKsYGvd+jgsOMzhRV47imaUhhj+Vga/6qGIyj+ExFC1GrXgiHk7bg6 EhdBNMlyst4uehpAQC6NcTGELUNBt1w4/G0T2evfpYGBmTvACqawo+yYh0yRMzHu2isEXcue/nm9 yml2fieIQ79rLur55Y1a8VSJnsMTI5KOMWg3Xc/Llb29fgKmRU8h3AGZzqm1ZMDFGmoogYQ7CeVl q9ojJuDdWjFXA2m2MIGmutRSX4oc1zNnWrULBXlt8ymldJS3KZGJpDsSHtzhl4hUWVUYL22pbGi1 gX2KayFPNCMbWmiIoq40zrkBgRAJRUBMCi1ye59zANNRNMDQDRFQIMtoBDMRZEKXqeUDllJC574Q Wly4t7NEhEqiaWh1AQucCAnG06PzAbGIJnSL0BNyujJihCCNsAxAu+zx4zbo4w51pAjYYW31Gbqa dGTyOOIVCGV4mGCxhOOKSQ4wBhY5nSQiTEnlDO+CLtlMAYGW2vrZJFWByyxpSYBaEBlZ5ciQ7HZM a1B1a6qoHz1CQxmWNYU0xauaOmp4PgxyMLi/FcF6HCknNercqJ4b3OakiTF2vhtF0LbZa9N7RLME tTw732Fx9WynIJpwS8P5KIgRZWEw1rNQ3ykBYQCNk917o1EZuwMMXr1JTB1CBh9BFgK9Uyi5t73U aA4q2FnNQZ5gTm0xAGqhMoJsrd11FhmTaAVJExSin1WqzWvAUZEZ3NEBRV2ISI2AHNJQBskS3tGh gC+Jt3VstIigcIgLMloMhg5V96Czfnblsqul1Kt1XRaqExgkOTohpvSnKKZBKT1WhdzQja+L3YNf BtHvpndyMWHZRMyrNsvraxBeCQvoEK4oJL+avgj8idz6i3YEhb14/HK/U+jmMMHVcT/Ji+/0rVH+ TipOHDD+hiHnoGqJQJ+IMh8aeFp4OR4n+3zF7bfAlC7dB120R8JOE1MdsqZLuVXiDUiQwaVKqelI cIoq63rQxEnmdSKGVKHQ+sKQq68/h9XvTIrQcFXObEbzcktViW9qXykSpqzOblnpwIqY1ojshCvQ MkOGsYBq7D91BHz5pOmSCqnCcjRVdCMbpALsr+bvMCq4Xk0cthItX2ho4Fhrb3iSwB8+dHYaUegy RjyUQ5bLFMhijwSmYFurOJmJ50i/0wBjxXSnYDxyOhr0ldK0VhzRmBjazxIBBmL5hdUpfQa9TjSH F2cK833FmvTmhIpRAYBGvXzgivkEScmWdN0o0mZrmiVtqVyt4w67hY8UzVpuzgWdFZXEIhLnuwOo LyVyLkmIBlzVo1NvyPOQLaubB0rIoLz2lrWDlgJsl62Jo5FKjjbZZi7wURZhedYQ1k1BGfPmnXrx PqolT6Xi3RoEeXV9nfhygsOkOIUFqYclJS483BE0ZnCygdIqjRnbsOQbn0laJ2jUoo1UWDxWsEEp kc3fGdaOpmc3Ztfo5DzrEaTXeMtvTJvmm9j/DZzume/lUwp7HMiHnTFDAYoBQTuzXAsecLeQIUaA YLUKZF25FiSGsl7TvUXtO/qC/HhhQV+jjLDhd8pR0XagmHHvDG2E9mdmIqQsPhgpTGJwz/tVkdiN GW/eNAaaVTvw1BhOx29K0B9p3DPa/N0pmAo0o6S05GRsptciZJEhHxcMYIOK7sN8EI0htYwlDWam zCLYBb6EsbXTvd5Iac2D18mBXbkmtDpSKpKksaSsrCPXBIjVWdCp2GkTkZLbeUQaYnJxSiYNVd7V KtoJbAY6a0eyzML8idOSEHomQDIjUwh7kWAgBiQt2Kq9yBAJdNILvGzDZ8YJcVSRACKYik0HnxFG Zrxx5slKECMoNlVb9WcEE4igjUto4BcMNlky6Zi40sSO9ItDnZL1eZIkryKsQxs49/Ucdq2BQXXZ xA8Idwt+4pybmZlyuzMJk3DvZzbNWcR2YwjowqSabr20+Fi8tdK2dJF+8B08WJXe0XcGzhE5RThx 2dNjCldKuQTwQ4ES0ZUvxmpiijYNX+2RCooqQ2bGTuewqgU9dA5ilFZeaaUzeHsoSLBMJVlMcI0N WHd0z4x6lEhyqW4XmMNPC2gRVqZiCeOB0skZlXenUEQ1/FwqmrS9hbtmBMOENfUgmDkb27hjACo3 CkxY8bSJPfJuNISknILyiUECZEIYRlo8mhpVVvNVuJBSxOkwjlO8NiZ1OUE9HbrmCKRyq829oUsQ Rw9uNuORgORxxCk/sY9ZjyPiXAkcCyEBdoN3rIqKO6U9maZc1c3vi2LVJGQPI0jHsrDdHPzxu1lW HdQGpLcyxJSEt6jUmHRx3ChDrD0A9GPVLUviUr0DI8SnFfEeIQ6nQoDMDCCfWtfHSeLo5QyilIXW th7mGCP/F3JFOFCQ7Vf8pw== --===============2982739352998419930==--