Bug #24864 | Functions with a known result are NOT 'resolved' | ||
---|---|---|---|
Submitted: | 6 Dec 2006 19:13 | Modified: | 13 Mar 2007 19:03 |
Reporter: | Andre Timmer | Email Updates: | |
Status: | Not a Bug | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S5 (Performance) |
Version: | 5.0.32-BK, 5.0.18 | OS: | Linux (Linux) |
Assigned to: | Igor Babaev | CPU Architecture: | Any |
[6 Dec 2006 19:13]
Andre Timmer
[6 Dec 2006 19:14]
Andre Timmer
substring(f_attribute_path(id), 1, length('/root/ClientSuwi') could be resolved to substring(f_attribute_path(id), 1, 16)
[7 Dec 2006 6:39]
Valeriy Kravchuk
Thank you for a problem report. Please, send the results of SHOW CREATE TABLE and SHOW TABLE STATUS for that attribute table. Complete CREATE statement for that f_attribute_path function will be also useful. We need a complete test case that demonstrates the problem on latest (5.0.27) version of MySQL server.
[11 Dec 2006 12:56]
Andre Timmer
Example isn't worth that much without testdata. This is much work. A simpeler testcase: SELECT BENCHMARK(1000000,substring('hello and goodbye', length('hello and'), length('goodbye'))) test1; SELECT BENCHMARK(1000000,substring('hello and goodbye', 9, 7)) test2; Both statements do the same, but the second statement is always faster. Your SQL compiler builders should be able to conform wheather intermediate results which will not changed are 'resolved/reused'.
[14 Dec 2006 21:21]
Valeriy Kravchuk
Verified just as described in the last comment, with 5.0.32-BK on Linux: mysql> explain extended SELECT BENCHMARK(1000000,substring('hello and goodbye', length('hello and'), length('goodbye'))) test1; +----+-------------+-------+------+---------------+------+---------+------+----- -+----------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+----- -+----------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used | +----+-------------+-------+------+---------------+------+---------+------+----- -+----------------+ 1 row in set, 1 warning (0.01 sec) mysql> show warnings\G *************************** 1. row *************************** Level: Note Code: 1003 Message: select benchmark(1000000,substr(_latin1'hello and goodbye',length(_lati n1'hello and'),length(_latin1'goodbye'))) AS `test1` 1 row in set (0.00 sec) So, as you can see above, functions are not "resolved" really. And it makes differtence for wall-clock run time: mysql> SELECT BENCHMARK(100000000,substring('hello and goodbye', 9, 7)) test2; +-------+ | test2 | +-------+ | 0 | +-------+ 1 row in set (9.82 sec) mysql> SELECT BENCHMARK(100000000,substring('hello and goodbye', length('hello and'), length('goodbye'))) test1; +-------+ | test1 | +-------+ | 0 | +-------+ 1 row in set (11.25 sec)
[13 Mar 2007 19:03]
Igor Babaev
We do not not resolve constant expressions neither when using BENCHMARK (which would have devaluated BENCHMARK to a great extent) nor when using prepared statements. We resolve constant expressions only before execution (which can be easily checked in the debugger) of the query.