diff options
author | unknown <ingo@mysql.com> | 2004-05-06 15:53:01 +0200 |
---|---|---|
committer | unknown <ingo@mysql.com> | 2004-05-06 15:53:01 +0200 |
commit | 0bc9c4ae8d2471fc95e6da87ca62c5c062e5df08 (patch) | |
tree | 7facff5ed1695a7cdb0e0ab674137605074739d9 /heap | |
parent | 30be794283ce245ba8ac4bc4c38f561764335cb8 (diff) | |
download | mariadb-git-0bc9c4ae8d2471fc95e6da87ca62c5c062e5df08.tar.gz |
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.
heap/heapdef.h:
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
Pulled hp_clear_keys() out of hp_clear().
heap/hp_clear.c:
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
Pulled hp_clear_keys() out of hp_clear().
Added the new functions for disabling and enabling keys and to ask for the key state.
include/heap.h:
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
Added a new HP_SHARE element to save the key count while keys are disabled.
Added declarations for the new functions.
myisam/mi_open.c:
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
Added the new functions for disabling and enabling keys and to ask for the key state.
myisam/myisamdef.h:
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
Added declarations for the new functions.
sql/ha_heap.cc:
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
Pulled set_keys_for_scanning() out of open().
Added the new functions for disabling and enabling keys and to ask for the key state.
sql/ha_heap.h:
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
Added declarations for the new functions.
sql/ha_myisam.cc:
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
Extended disable_indexes() for all keys and no save.
The argument is now 'mode' as it must handle different cases.
Extended enable_indexes() for no save.
The new feature needs the new argument 'mode' with the same semantics as in disable_indexes().
Added indexes_are_disabled() to ask for the key state.
Extended the existing call to enable_indexes() by the new argument.
sql/ha_myisam.h:
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
Modified the declarations of dis-/enable_indexes() for the new argument.
Added the declaration of the new function to ask for the key state.
sql/handler.h:
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
Added declarations for the operation modes for the key switching functions.
Modified the declarations of dis-/enable_indexes() for the new argument.
Added the declaration of the new function to ask for the key state.
sql/sql_select.cc:
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
In create_myisam_from_heap() take notice of disabled keys
and disable them in the new table before copying the data.
sql/sql_table.cc:
WL#1687 - Optimize UNION DISTINCT ... UNION ALL (again).
Modified the calls of dis-/enable_indexes() for the new argument.
Diffstat (limited to 'heap')
-rw-r--r-- | heap/heapdef.h | 3 | ||||
-rw-r--r-- | heap/hp_clear.c | 145 |
2 files changed, 141 insertions, 7 deletions
diff --git a/heap/heapdef.h b/heap/heapdef.h index 63109badb05..083765334ab 100644 --- a/heap/heapdef.h +++ b/heap/heapdef.h @@ -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 @@ -97,6 +97,7 @@ extern uint hp_rb_null_key_length(HP_KEYDEF *keydef, const byte *key); extern my_bool hp_if_null_in_key(HP_KEYDEF *keyinfo, const byte *record); extern int hp_close(register HP_INFO *info); extern void hp_clear(HP_SHARE *info); +extern void hp_clear_keys(HP_SHARE *info); extern uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old, uint k_len); #ifdef THREAD diff --git a/heap/hp_clear.c b/heap/hp_clear.c index e65d3a172c3..4440344f990 100644 --- a/heap/hp_clear.c +++ b/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); +} + |