Use dynamic row format when creating temporary tables without sumary fields.
The reason for this is that BLOCK_RECORD format is not good when there is a lot of duplicated keys as it first writes the data (to get the row position) and then writes the key (and thus checks for duplicates).
This commit is contained in:
parent
3600e6b81c
commit
97e834e151
@ -11009,10 +11009,21 @@ static bool create_internal_tmp_table(TABLE *table,TMP_TABLE_PARAM *param,
|
|||||||
OPTION_BIG_TABLES)
|
OPTION_BIG_TABLES)
|
||||||
create_info.data_file_length= ~(ulonglong) 0;
|
create_info.data_file_length= ~(ulonglong) 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
The logic for choosing the record format:
|
||||||
|
The STATIC_RECORD format is the fastest one, because it's so simple,
|
||||||
|
so we use this by default for short rows.
|
||||||
|
BLOCK_RECORD caches both row and data, so this is generally faster than
|
||||||
|
DYNAMIC_RECORD. The one exception is when we write to tmp table
|
||||||
|
(no updates == no sum fields) in which case BLOCK RECORD is slower as
|
||||||
|
we first write the row, then check for key conflicts and then we have to
|
||||||
|
delete the row.
|
||||||
|
*/
|
||||||
if ((error= maria_create(share->table_name.str,
|
if ((error= maria_create(share->table_name.str,
|
||||||
share->reclength < 64 &&
|
(share->reclength < 64 &&
|
||||||
!share->blob_fields ? STATIC_RECORD :
|
!share->blob_fields ? STATIC_RECORD :
|
||||||
BLOCK_RECORD,
|
!param->sum_func_count ? DYNAMIC_RECORD :
|
||||||
|
BLOCK_RECORD),
|
||||||
share->keys, &keydef,
|
share->keys, &keydef,
|
||||||
(uint) (param->recinfo-param->start_recinfo),
|
(uint) (param->recinfo-param->start_recinfo),
|
||||||
param->start_recinfo,
|
param->start_recinfo,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user