Commit a656ff83 authored by Dmitry Lenev's avatar Dmitry Lenev

Fix for bug #13116518 - "OPEN_TABLES() SHOULD NOT ALLOCATE AND FREE

NEW_FRM_MEM WITHOUT NEEDING TO".

During the process of opening tables for a statement, we allocated
memory which was used only during view loading even in cases when the
statement didn't use any views. Such an unnecessary allocation (and
corresponding freeing) might have caused significant performance
overhead in some workloads. For example, it caused up to 15% slowdown
in a simple stored routine calculating Fibonacci's numbers.

This memory was pre-allocated as part of "new_frm_mem" MEM_ROOT
initialization at the beginning of open_tables(). 

This patch addresses this issue by turning off memory pre-allocation
during initialization for this MEM_ROOT. Now, memory on this root
will be allocated only at the point when the first .FRM for a view is 
opened.

The patch doesn't contain a test case since it is hard to test the
performance improvements or the absence of memory allocation in our
test framework.
parent 3d24c28a
...@@ -4810,10 +4810,11 @@ bool open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags, ...@@ -4810,10 +4810,11 @@ bool open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags,
} }
/* /*
temporary mem_root for new .frm parsing. Initialize temporary MEM_ROOT for new .FRM parsing. Do not allocate
TODO: variables for size anything yet, to avoid penalty for statements which don't use views
and thus new .FRM format.
*/ */
init_sql_alloc(&new_frm_mem, 8024, 8024); init_sql_alloc(&new_frm_mem, 8024, 0);
thd->current_tablenr= 0; thd->current_tablenr= 0;
restart: restart:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment