mirror of
https://github.com/MariaDB/server.git
synced 2025-02-19 03:45:35 +01:00
![]() This commits enables reloading of engine-independent statistics without flushing the table from table definition cache. This is achieved by allowing multiple version of the TABLE_STATISTICS_CB object and having independent pointers to it in TABLE and TABLE_SHARE. The TABLE_STATISTICS_CB object have reference pointers and are freed when no one is pointing to it anymore. TABLE's TABLE_STATISTICS_CB pointer is updated to use the TABLE_SHARE's pointer when read_statistics_for_tables() is called at the beginning of a query. Main changes: - read_statistics_for_table() will allocate an new TABLE_STATISTICS_CB object. - All get_stat_values() functions has a new parameter that tells where collected data should be stored. get_stat_values() are not using the table_field object anymore to store data. - All get_stat_values() functions returns 1 if they found any data in the statistics tables. Other things: - Fixed INSERT DELAYED to not read statistics tables. - Removed Statistics_state from TABLE_STATISTICS_CB as this is not needed anymore as wer are not changing TABLE_SHARE->stats_cb while calculating or loading statistics. - Store values used with store_from_statistical_minmax_field() in TABLE_STATISTICS_CB::mem_root. This allowed me to remove the function delete_stat_values_for_table_share(). - Field_blob::store_from_statistical_minmax_field() is implemented but is not normally used as we do not yet support EIS statistics for blobs. For example Field_blob::update_min() and Field_blob::update_max() are not implemented. Note that the function can be called if there is an concurrent "ALTER TABLE MODIFY field BLOB" running because of a bug in ALTER TABLE where it deletes entries from column_stats before it has an exclusive lock on the table. - Use result of field->val_str(&val) as a pointer to the result instead of val (safetly fix). - Allocate memory for collected statistics in THD::mem_root, not in in TABLE::mem_root. This could cause the TABLE object to grow if a ANALYZE TABLE was run many times on the same table. This was done in allocate_statistics_for_table(), create_min_max_statistical_fields_for_table() and create_min_max_statistical_fields_for_table_share(). - Store in TABLE_STATISTICS_CB::stats_available which statistics was found in the statistics tables. - Removed index_table from class Index_prefix_calc as it was not used. - Added TABLE_SHARE::LOCK_statistics to ensure we don't load EITS in parallel. First thread will load it, others will reuse the loaded data. - Eliminate read_histograms_for_table(). The loading happens within read_statistics_for_tables() if histograms are needed. One downside is that if we have read statistics without histograms before and someone requires histograms, we have to read all statistics again (once) from the statistics tables. A smaller downside is the need to call alloc_root() for each individual histogram. Before we could allocate all the space for histograms with a single alloc_root. - Fixed bug in MyISAM and Aria where they did not properly notice that table had changed after analyze table. This was not a problem before this patch as then the MyISAM and Aria tables where flushed as part of ANALYZE table which did hide this issue. - Fixed a bug in ANALYZE table where table->records could be seen as 0 in collect_statistics_for_table(). The effect of this unlikely bug was that a full table scan could be done even if analyze_sample_percentage was not set to 1. - Changed multiple mallocs in a row to use multi_alloc_root(). - Added a mutex protection in update_statistics_for_table() to ensure that several tables are not updating the statistics at the same time. Some of the changes in sql_statistics.cc are based on a patch from Oleg Smirnov <olernov@gmail.com> Co-authored-by: Oleg Smirnov <olernov@gmail.com> Co-authored-by: Vicentiu Ciorbaru <cvicentiu@gmail.com> Reviewer: Sergei Petrunia <sergey@mariadb.com> |
||
---|---|---|
.. | ||
ftbench | ||
mysql-test | ||
ChangeLog | ||
CMakeLists.txt | ||
ft_boolean_search.c | ||
ft_myisam.c | ||
ft_nlq_search.c | ||
ft_parser.c | ||
ft_static.c | ||
ft_stopwords.c | ||
ft_update.c | ||
ftdefs.h | ||
fulltext.h | ||
ha_myisam.cc | ||
ha_myisam.h | ||
mi_cache.c | ||
mi_changed.c | ||
mi_check.c | ||
mi_checksum.c | ||
mi_close.c | ||
mi_create.c | ||
mi_dbug.c | ||
mi_delete.c | ||
mi_delete_all.c | ||
mi_delete_table.c | ||
mi_dynrec.c | ||
mi_extra.c | ||
mi_extrafunc.h | ||
mi_info.c | ||
mi_key.c | ||
mi_keycache.c | ||
mi_locking.c | ||
mi_log.c | ||
mi_open.c | ||
mi_packrec.c | ||
mi_page.c | ||
mi_panic.c | ||
mi_preload.c | ||
mi_range.c | ||
mi_rename.c | ||
mi_rfirst.c | ||
mi_rkey.c | ||
mi_rlast.c | ||
mi_rnext.c | ||
mi_rnext_same.c | ||
mi_rprev.c | ||
mi_rrnd.c | ||
mi_rsame.c | ||
mi_rsamepos.c | ||
mi_scan.c | ||
mi_search.c | ||
mi_static.c | ||
mi_statrec.c | ||
mi_test1.c | ||
mi_test2.c | ||
mi_test3.c | ||
mi_test_all.res | ||
mi_test_all.sh | ||
mi_unique.c | ||
mi_update.c | ||
mi_write.c | ||
myisam_ftdump.c | ||
myisamchk.c | ||
myisamdef.h | ||
myisamlog.c | ||
myisampack.c | ||
NEWS | ||
rt_index.c | ||
rt_index.h | ||
rt_key.c | ||
rt_key.h | ||
rt_mbr.c | ||
rt_mbr.h | ||
rt_split.c | ||
rt_test.c | ||
sort.c | ||
sp_defs.h | ||
sp_key.c | ||
sp_test.c | ||
test_pack |