1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

MDEV-7951 - sql_alloc() takes 0.25% in OLTP RO

sql_alloc() has additional costs compared to direct mem_root allocation:
- function call: it is defined in a separate translation unit and can't be
  inlined
- it needs to call pthread_getspecific() to get THD::mem_root

It is called dozens of times implicitely at least by:
- List<>::push_back()
- List<>::push_front()
- new (for Sql_alloc derived classes)
- sql_memdup()

Replaced lots of implicit sql_alloc() calls with direct mem_root allocation,
passing through THD pointer whenever it is needed.

Number of sql_alloc() calls reduced 345 -> 41 per OLTP RO transaction.
pthread_getspecific() overhead dropped 0.76 -> 0.59
sql_alloc() overhed dropped 0.25 -> 0.06
This commit is contained in:
Sergey Vojtovich
2015-04-17 14:30:15 +04:00
parent c4d2c4e844
commit 4d1ccc4289
20 changed files with 173 additions and 157 deletions

View File

@ -69,13 +69,13 @@ class QUICK_RANGE :public Sql_alloc {
uint16 dummy; /* Avoid warnings on 'flag' */
#endif
QUICK_RANGE(); /* Full range */
QUICK_RANGE(const uchar *min_key_arg, uint min_length_arg,
QUICK_RANGE(THD *thd, const uchar *min_key_arg, uint min_length_arg,
key_part_map min_keypart_map_arg,
const uchar *max_key_arg, uint max_length_arg,
key_part_map max_keypart_map_arg,
uint flag_arg)
: min_key((uchar*) sql_memdup(min_key_arg,min_length_arg+1)),
max_key((uchar*) sql_memdup(max_key_arg,max_length_arg+1)),
: min_key((uchar*) thd->memdup(min_key_arg, min_length_arg + 1)),
max_key((uchar*) thd->memdup(max_key_arg, max_length_arg + 1)),
min_length((uint16) min_length_arg),
max_length((uint16) max_length_arg),
flag((uint16) flag_arg),