mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
HEAP: Copies the key count to a backup variable and sets the key count to zero. That way, no HEAP function will ever try to touch any index. Re-enabling is done by copying back the backup variable. To avoid memory leak at table close, disable deletes all index trees. Re-enabling must be done with empty indexes and data anyway. Otherwise, the indexes would need to be repaired, wich HEAP is not capable of. MyISAM: Only the key_map is cleared and set. Re-enabling must be done with empty indexes and data. Otherwise, repair needs to be done which will enable all keys persistently. The former implementation disabled only non-unique keys and maked this persistent. The new implementation additionally can disable all keys, but only without making this persistent. Re-enabling all keys can be done without repair, if data file and indexes are empty.
This commit is contained in:
145
heap/hp_clear.c
145
heap/hp_clear.c
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||
/* Copyright (C) 2000,2004 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -29,13 +29,60 @@ void heap_clear(HP_INFO *info)
|
||||
|
||||
void hp_clear(HP_SHARE *info)
|
||||
{
|
||||
uint key;
|
||||
DBUG_ENTER("hp_clear");
|
||||
|
||||
if (info->block.levels)
|
||||
VOID(hp_free_level(&info->block,info->block.levels,info->block.root,
|
||||
(byte*) 0));
|
||||
info->block.levels=0;
|
||||
hp_clear_keys(info);
|
||||
info->records=info->deleted=info->data_length=0;
|
||||
info->blength=1;
|
||||
info->changed=0;
|
||||
info->del_link=0;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Clear all keys.
|
||||
|
||||
SYNOPSIS
|
||||
heap_clear_keys()
|
||||
info A pointer to the heap storage engine HP_INFO struct.
|
||||
|
||||
DESCRIPTION
|
||||
Delete all trees of all indexes and leave them empty.
|
||||
|
||||
RETURN
|
||||
void
|
||||
*/
|
||||
|
||||
void heap_clear_keys(HP_INFO *info)
|
||||
{
|
||||
hp_clear(info->s);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Clear all keys.
|
||||
|
||||
SYNOPSIS
|
||||
hp_clear_keys()
|
||||
info A pointer to the heap storage engine HP_SHARE struct.
|
||||
|
||||
DESCRIPTION
|
||||
Delete all trees of all indexes and leave them empty.
|
||||
|
||||
RETURN
|
||||
void
|
||||
*/
|
||||
|
||||
void hp_clear_keys(HP_SHARE *info)
|
||||
{
|
||||
uint key;
|
||||
DBUG_ENTER("hp_clear_keys");
|
||||
|
||||
for (key=0 ; key < info->keys ; key++)
|
||||
{
|
||||
HP_KEYDEF *keyinfo = info->keydef + key;
|
||||
@ -52,9 +99,95 @@ void hp_clear(HP_SHARE *info)
|
||||
block->last_allocated=0;
|
||||
}
|
||||
}
|
||||
info->records=info->deleted=info->data_length=info->index_length=0;
|
||||
info->blength=1;
|
||||
info->changed=0;
|
||||
info->del_link=0;
|
||||
info->index_length=0;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Disable all indexes.
|
||||
|
||||
SYNOPSIS
|
||||
heap_disable_indexes()
|
||||
info A pointer to the heap storage engine HP_INFO struct.
|
||||
|
||||
DESCRIPTION
|
||||
Disable and clear (remove contents of) all indexes.
|
||||
|
||||
RETURN
|
||||
0 ok
|
||||
*/
|
||||
|
||||
int heap_disable_indexes(HP_INFO *info)
|
||||
{
|
||||
HP_SHARE *share= info->s;
|
||||
|
||||
if (share->keys)
|
||||
{
|
||||
hp_clear_keys(share);
|
||||
share->currently_disabled_keys= share->keys;
|
||||
share->keys= 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Enable all indexes
|
||||
|
||||
SYNOPSIS
|
||||
heap_enable_indexes()
|
||||
info A pointer to the heap storage engine HP_INFO struct.
|
||||
|
||||
DESCRIPTION
|
||||
Enable all indexes. The indexes might have been disabled
|
||||
by heap_disable_index() before.
|
||||
The function works only if both data and indexes are empty,
|
||||
since the heap storage engine cannot repair the indexes.
|
||||
To be sure, call handler::delete_all_rows() before.
|
||||
|
||||
RETURN
|
||||
0 ok
|
||||
HA_ERR_CRASHED data or index is non-empty.
|
||||
*/
|
||||
|
||||
int heap_enable_indexes(HP_INFO *info)
|
||||
{
|
||||
int error= 0;
|
||||
HP_SHARE *share= info->s;
|
||||
|
||||
if (share->data_length || share->index_length)
|
||||
error= HA_ERR_CRASHED;
|
||||
else
|
||||
if (share->currently_disabled_keys)
|
||||
{
|
||||
share->keys= share->currently_disabled_keys;
|
||||
share->currently_disabled_keys= 0;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Test if indexes are disabled.
|
||||
|
||||
SYNOPSIS
|
||||
heap_indexes_are_disabled()
|
||||
info A pointer to the heap storage engine HP_INFO struct.
|
||||
|
||||
DESCRIPTION
|
||||
Test if indexes are disabled.
|
||||
|
||||
RETURN
|
||||
0 indexes are not disabled
|
||||
1 all indexes are disabled
|
||||
[2 non-unique indexes are disabled - NOT YET IMPLEMENTED]
|
||||
*/
|
||||
|
||||
int heap_indexes_are_disabled(HP_INFO *info)
|
||||
{
|
||||
HP_SHARE *share= info->s;
|
||||
|
||||
return (! share->keys && share->currently_disabled_keys);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user