Commit 57c2f22a authored by unknown's avatar unknown

Small cleanup in code handling stored routines/table prelocking.

Use lazy initialization for Query_tables_list::sroutines hash.
This step should significantly decrease amount of memory consumed
by stored routines as we no longer will allocate chunk of memory
required for this HASH for each statement in routine.


include/hash.h:
  Introduced auxillary hash_init_opt() macro which simplifies
  lazy initialization of HASH objects.
sql/sp.cc:
  Use lazy initialization for Query_tables_list::sroutines hash.
  This step should significantly decrease amount of memory consumed
  by stored routines as we no longer will allocate chunk of memory
  required for this HASH for each statement in routine.
sql/sql_lex.cc:
  Use lazy initialization for Query_tables_list::sroutines hash.
  This step should significantly decrease amount of memory consumed
  by stored routines as we no longer will allocate chunk of memory
  required for this HASH for each statement in routine.
sql/sql_lex.h:
  Updated comment describing Query_tables_list::sroutines to
  reflect that now we are use lazy initialization for this hash.
  Added constant for initial size of this hash.
parent b372ebc5
...@@ -65,6 +65,8 @@ my_bool hash_check(HASH *hash); /* Only in debug library */ ...@@ -65,6 +65,8 @@ my_bool hash_check(HASH *hash); /* Only in debug library */
#define hash_clear(H) bzero((char*) (H),sizeof(*(H))) #define hash_clear(H) bzero((char*) (H),sizeof(*(H)))
#define hash_inited(H) ((H)->array.buffer != 0) #define hash_inited(H) ((H)->array.buffer != 0)
#define hash_init_opt(A,B,C,D,E,F,G,H) \
(!hash_inited(A) && _hash_init(A,B,C,D,E,F,G, H CALLER_INFO))
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -1369,6 +1369,10 @@ static bool add_used_routine(LEX *lex, Query_arena *arena, ...@@ -1369,6 +1369,10 @@ static bool add_used_routine(LEX *lex, Query_arena *arena,
const LEX_STRING *key, const LEX_STRING *key,
TABLE_LIST *belong_to_view) TABLE_LIST *belong_to_view)
{ {
hash_init_opt(&lex->sroutines, system_charset_info,
Query_tables_list::START_SROUTINES_HASH_SIZE,
0, 0, sp_sroutine_key, 0, 0);
if (!hash_search(&lex->sroutines, (byte *)key->str, key->length)) if (!hash_search(&lex->sroutines, (byte *)key->str, key->length))
{ {
Sroutine_hash_entry *rn= Sroutine_hash_entry *rn=
......
...@@ -1634,9 +1634,18 @@ void Query_tables_list::reset_query_tables_list(bool init) ...@@ -1634,9 +1634,18 @@ void Query_tables_list::reset_query_tables_list(bool init)
query_tables_last= &query_tables; query_tables_last= &query_tables;
query_tables_own_last= 0; query_tables_own_last= 0;
if (init) if (init)
hash_init(&sroutines, system_charset_info, 0, 0, 0, sp_sroutine_key, 0, 0); {
/*
We delay real initialization of hash (and therefore related
memory allocation) until first insertion into this hash.
*/
hash_clear(&sroutines);
}
else if (sroutines.records) else if (sroutines.records)
{
/* Non-zero sroutines.records means that hash was initialized. */
my_hash_reset(&sroutines); my_hash_reset(&sroutines);
}
sroutines_list.empty(); sroutines_list.empty();
sroutines_list_own_last= sroutines_list.next; sroutines_list_own_last= sroutines_list.next;
sroutines_list_own_elements= 0; sroutines_list_own_elements= 0;
......
...@@ -742,7 +742,11 @@ public: ...@@ -742,7 +742,11 @@ public:
0 - indicates that this query does not need prelocking. 0 - indicates that this query does not need prelocking.
*/ */
TABLE_LIST **query_tables_own_last; TABLE_LIST **query_tables_own_last;
/* Set of stored routines called by statement. */ /*
Set of stored routines called by statement.
(Note that we use lazy-initialization for this hash).
*/
enum { START_SROUTINES_HASH_SIZE= 16 };
HASH sroutines; HASH sroutines;
/* /*
List linking elements of 'sroutines' set. Allows you to add new elements List linking elements of 'sroutines' set. Allows you to add new elements
......
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