mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
f549f495f7
Renamed the system variable optimizer_use_stat_tables to use_stat_tables. This variable now has only 3 possible values: 'never', 'complementary', 'preferably'. If the server has been launched with --use-stat-tables='complementary'|'preferably' then the statictics tables can be employed by the optimizer and by the ANALYZE command.
328 lines
No EOL
10 KiB
Text
328 lines
No EOL
10 KiB
Text
--source include/have_stat_tables.inc
|
|
--source include/have_innodb.inc
|
|
--disable_warnings
|
|
drop table if exists t1,t2;
|
|
--enable_warnings
|
|
|
|
set @save_use_stat_tables=@@use_stat_tables;
|
|
|
|
CREATE VIEW table_stat AS
|
|
SELECT * FROM mysql.table_stat;
|
|
|
|
CREATE VIEW column_stat AS
|
|
SELECT db_name, table_name, column_name,
|
|
min_value, max_value,
|
|
CAST(nulls_ratio AS decimal(12,4)) AS 'nulls_ratio',
|
|
CAST(avg_length AS decimal(12,4)) AS 'avg_length',
|
|
CAST(avg_frequency AS decimal(12,4)) AS 'avg_frequency'
|
|
FROM mysql.column_stat;
|
|
|
|
CREATE VIEW index_stat AS
|
|
SELECT db_name, table_name, index_name, prefix_arity,
|
|
CAST(avg_frequency AS decimal(12,4)) AS 'avg_frequency'
|
|
FROM mysql.index_stat;
|
|
|
|
DELETE FROM mysql.table_stat;
|
|
DELETE FROM mysql.column_stat;
|
|
DELETE FROM mysql.index_stat;
|
|
|
|
set use_stat_tables='preferably';
|
|
|
|
CREATE TABLE t1 (
|
|
a int NOT NULL PRIMARY KEY,
|
|
b varchar(32),
|
|
c char(16),
|
|
d date,
|
|
e double,
|
|
f bit(3),
|
|
INDEX idx1 (b, e),
|
|
INDEX idx2(c, d),
|
|
INDEX idx3 (d),
|
|
INDEX idx4 (e, b, d)
|
|
);
|
|
|
|
INSERT INTO t1 VALUES
|
|
(0, NULL, NULL, NULL, NULL, NULL),
|
|
(7, 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 'dddddddd', '1990-05-15', 0.1, b'100'),
|
|
(17, 'vvvvvvvvvvvvv', 'aaaa', '1989-03-12', 0.01, b'101'),
|
|
(1, 'vvvvvvvvvvvvv', NULL, '1989-03-12', 0.01, b'100'),
|
|
(12, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'dddddddd', '1999-07-23', 0.112, b'001'),
|
|
(23, 'vvvvvvvvvvvvv', 'dddddddd', '1999-07-23', 0.1, b'100'),
|
|
(8, 'vvvvvvvvvvvvv', 'aaaa', '1999-07-23', 0.1, b'100'),
|
|
(22, 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 'aaaa', '1989-03-12', 0.112, b'001'),
|
|
(31, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'aaaa', '1999-07-23', 0.01, b'001'),
|
|
(10, NULL, 'aaaa', NULL, 0.01, b'010'),
|
|
(5, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'dddddddd', '1999-07-23', 0.1, b'100'),
|
|
(15, 'vvvvvvvvvvvvv', 'ccccccccc', '1990-05-15', 0.1, b'010'),
|
|
(30, NULL, 'bbbbbb', NULL, NULL, b'100'),
|
|
(38, 'zzzzzzzzzzzzzzzzzz', 'bbbbbb', NULL, NULL, NULL),
|
|
(18, 'zzzzzzzzzzzzzzzzzz', 'ccccccccc', '1990-05-15', 0.01, b'010'),
|
|
(9, 'yyy', 'bbbbbb', '1998-08-28', 0.01, NULL),
|
|
(29, 'vvvvvvvvvvvvv', 'dddddddd', '1999-07-23', 0.012, b'010'),
|
|
(3, 'yyy', 'dddddddd', '1990-05-15', 0.112, b'010'),
|
|
(39, 'zzzzzzzzzzzzzzzzzz', 'bbbbbb', NULL, 0.01, b'100'),
|
|
(14, 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 'ccccccccc', '1990-05-15', 0.1, b'100'),
|
|
(40, 'zzzzzzzzzzzzzzzzzz', 'bbbbbb', '1989-03-12', NULL, NULL),
|
|
(44, NULL, 'aaaa', '1989-03-12', NULL, b'010'),
|
|
(19, 'vvvvvvvvvvvvv', 'ccccccccc', '1990-05-15', 0.012, b'011'),
|
|
(21, 'zzzzzzzzzzzzzzzzzz', 'dddddddd', '1989-03-12', 0.112, b'100'),
|
|
(45, NULL, NULL, '1989-03-12', NULL, b'011'),
|
|
(2, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'ccccccccc', '1990-05-15', 0.1, b'001'),
|
|
(35, 'yyy', 'aaaa', '1990-05-15', 0.05, b'011'),
|
|
(4, 'vvvvvvvvvvvvv', 'dddddddd', '1999-07-23', 0.01, b'101'),
|
|
(47, NULL, 'aaaa', '1990-05-15', 0.05, b'010'),
|
|
(42, NULL, 'ccccccccc', '1989-03-12', 0.01, b'010'),
|
|
(32, NULL, 'bbbbbb', '1990-05-15', 0.01, b'011'),
|
|
(49, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww' , 'aaaa', '1990-05-15', NULL, NULL),
|
|
(43, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww' , 'bbbbbb', '1990-05-15', NULL, b'100'),
|
|
(37, 'yyy', NULL, '1989-03-12', 0.05, b'011'),
|
|
(41, 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 'ccccccccc', '1990-05-15', 0.05, NULL),
|
|
(34, 'yyy', NULL, NULL, NULL, NULL),
|
|
(33, 'zzzzzzzzzzzzzzzzzz', 'dddddddd', '1989-03-12', 0.05, b'011'),
|
|
(24, 'wwwwwwwwwwwwwwwwwwwwwwwwwwww', 'dddddddd', '1990-05-15', 0.01, b'101'),
|
|
(11, 'yyy', 'ccccccccc', '1999-07-23', 0.1, NULL),
|
|
(25, 'zzzzzzzzzzzzzzzzzz', 'bbb', '1989-03-12', 0.01, b'101');
|
|
|
|
ANALYZE TABLE t1;
|
|
|
|
SELECT * FROM table_stat;
|
|
SELECT * FROM column_stat;
|
|
SELECT * FROM index_stat;
|
|
|
|
SELECT COUNT(*) FROM t1;
|
|
|
|
SELECT * FROM column_stat
|
|
WHERE db_name='test' AND table_name='t1' AND column_name='a';
|
|
SELECT MIN(t1.a), MAX(t1.a),
|
|
(SELECT COUNT(*) FROM t1 WHERE t1.b IS NULL) /
|
|
(SELECT COUNT(*) FROM t1) AS "NULLS_RATIO(t1.a)",
|
|
(SELECT COUNT(t1.a) FROM t1) /
|
|
(SELECT COUNT(DISTINCT t1.a) FROM t1) AS "AVG_FREQUENCY(t1.a)"
|
|
FROM t1;
|
|
|
|
SELECT * FROM column_stat
|
|
WHERE db_name='test' AND table_name='t1' AND column_name='b';
|
|
SELECT MIN(t1.b), MAX(t1.b),
|
|
(SELECT COUNT(*) FROM t1 WHERE t1.b IS NULL) /
|
|
(SELECT COUNT(*) FROM t1) AS "NULLS_RATIO(t1.b)",
|
|
(SELECT COUNT(t1.b) FROM t1) /
|
|
(SELECT COUNT(DISTINCT t1.b) FROM t1) AS "AVG_FREQUENCY(t1.b)"
|
|
FROM t1;
|
|
|
|
SELECT * FROM column_stat
|
|
WHERE db_name='test' AND table_name='t1' AND column_name='c';
|
|
SELECT MIN(t1.c), MAX(t1.c),
|
|
(SELECT COUNT(*) FROM t1 WHERE t1.c IS NULL) /
|
|
(SELECT COUNT(*) FROM t1) AS "NULLS_RATIO(t1.c)",
|
|
(SELECT COUNT(t1.c) FROM t1) /
|
|
(SELECT COUNT(DISTINCT t1.c) FROM t1) AS "AVG_FREQUENCY(t1.c)"
|
|
FROM t1;
|
|
|
|
SELECT * FROM column_stat
|
|
WHERE db_name='test' AND table_name='t1' AND column_name='d';
|
|
SELECT MIN(t1.d), MAX(t1.d),
|
|
(SELECT COUNT(*) FROM t1 WHERE t1.d IS NULL) /
|
|
(SELECT COUNT(*) FROM t1) AS "NULLS_RATIO(t1.d)",
|
|
(SELECT COUNT(t1.d) FROM t1) /
|
|
(SELECT COUNT(DISTINCT t1.d) FROM t1) AS "AVG_FREQUENCY(t1.d)"
|
|
FROM t1;
|
|
|
|
SELECT * FROM column_stat
|
|
WHERE db_name='test' AND table_name='t1' AND column_name='e';
|
|
SELECT MIN(t1.e), MAX(t1.e),
|
|
(SELECT COUNT(*) FROM t1 WHERE t1.e IS NULL) /
|
|
(SELECT COUNT(*) FROM t1) AS "NULLS_RATIO(t1.e)",
|
|
(SELECT COUNT(t1.e) FROM t1) /
|
|
(SELECT COUNT(DISTINCT t1.e) FROM t1) AS "AVG_FREQUENCY(t1.e)"
|
|
FROM t1;
|
|
|
|
SELECT * FROM index_stat
|
|
WHERE db_name='test' AND table_name='t1' AND index_name='idx1';
|
|
SELECT
|
|
(SELECT COUNT(*) FROM t1 WHERE t1.b IS NOT NULL) /
|
|
(SELECT COUNT(DISTINCT t1.b) FROM t1 WHERE t1.b IS NOT NULL)
|
|
AS 'ARITY 1',
|
|
(SELECT COUNT(*) FROM t1 WHERE t1.b IS NOT NULL AND t1.e IS NOT NULL) /
|
|
(SELECT COUNT(DISTINCT t1.b, t1.e) FROM t1
|
|
WHERE t1.b IS NOT NULL AND t1.e IS NOT NULL)
|
|
AS 'ARITY 2';
|
|
|
|
SELECT * FROM index_stat
|
|
WHERE db_name='test' AND table_name='t1' AND index_name='idx2';
|
|
SELECT
|
|
(SELECT COUNT(*) FROM t1 WHERE t1.c IS NOT NULL) /
|
|
(SELECT COUNT(DISTINCT t1.c) FROM t1 WHERE t1.c IS NOT NULL)
|
|
AS 'ARITY 1',
|
|
(SELECT COUNT(*) FROM t1 WHERE t1.c IS NOT NULL AND t1.d IS NOT NULL) /
|
|
(SELECT COUNT(DISTINCT t1.c, t1.d) FROM t1
|
|
WHERE t1.c IS NOT NULL AND t1.d IS NOT NULL)
|
|
AS 'ARITY 2';
|
|
|
|
SELECT * FROM index_stat
|
|
WHERE db_name='test' AND table_name='t1' AND index_name='idx3';
|
|
SELECT
|
|
(SELECT COUNT(*) FROM t1 WHERE t1.d IS NOT NULL) /
|
|
(SELECT COUNT(DISTINCT t1.d) FROM t1 WHERE t1.d IS NOT NULL)
|
|
AS 'ARITY 1';
|
|
|
|
SELECT * FROM index_stat
|
|
WHERE db_name='test' AND table_name='t1' AND index_name='idx4';
|
|
SELECT
|
|
(SELECT COUNT(*) FROM t1 WHERE t1.e IS NOT NULL) /
|
|
(SELECT COUNT(DISTINCT t1.e) FROM t1 WHERE t1.e IS NOT NULL)
|
|
AS 'ARITY 1',
|
|
(SELECT COUNT(*) FROM t1 WHERE t1.e IS NOT NULL AND t1.b IS NOT NULL) /
|
|
(SELECT COUNT(DISTINCT t1.e, t1.b) FROM t1
|
|
WHERE t1.e IS NOT NULL AND t1.b IS NOT NULL)
|
|
AS 'ARITY 2',
|
|
(SELECT COUNT(*) FROM t1
|
|
WHERE t1.e IS NOT NULL AND t1.b IS NOT NULL AND t1.d IS NOT NULL) /
|
|
(SELECT COUNT(DISTINCT t1.e, t1.b, t1.d) FROM t1
|
|
WHERE t1.e IS NOT NULL AND t1.b IS NOT NULL AND t1.d IS NOT NULL)
|
|
AS 'ARITY 3';
|
|
|
|
DELETE FROM mysql.table_stat;
|
|
DELETE FROM mysql.column_stat;
|
|
DELETE FROM mysql.index_stat;
|
|
|
|
ANALYZE TABLE t1 PERSISTENT FOR COLUMNS() INDEXES();
|
|
SELECT * FROM table_stat;
|
|
SELECT * FROM column_stat;
|
|
SELECT * FROM index_stat;
|
|
|
|
ANALYZE TABLE t1 PERSISTENT FOR COLUMNS(c,e,b) INDEXES(idx2,idx4);
|
|
SELECT * FROM table_stat;
|
|
SELECT * FROM column_stat;
|
|
SELECT * FROM index_stat;
|
|
|
|
DELETE FROM mysql.table_stat;
|
|
DELETE FROM mysql.column_stat;
|
|
DELETE FROM mysql.index_stat;
|
|
|
|
ANALYZE TABLE t1 PERSISTENT FOR COLUMNS ALL INDEXES ALL;
|
|
|
|
SELECT * FROM table_stat;
|
|
SELECT * FROM column_stat;
|
|
SELECT * FROM index_stat;
|
|
|
|
|
|
CREATE TABLE t2 LIKE t1;
|
|
ALTER TABLE t2 ENGINE=InnoDB;
|
|
INSERT INTO t2 SELECT * FROM t1;
|
|
|
|
ANALYZE TABLE t2;
|
|
|
|
SELECT * FROM table_stat;
|
|
SELECT * FROM column_stat ORDER BY column_name;
|
|
SELECT * FROM index_stat ORDER BY index_name, prefix_arity, table_name;
|
|
|
|
|
|
DELETE FROM mysql.table_stat;
|
|
DELETE FROM mysql.column_stat;
|
|
DELETE FROM mysql.index_stat;
|
|
|
|
ALTER TABLE t1
|
|
DROP INDEX idx1,
|
|
DROP INDEX idx4;
|
|
ALTER TABLE t1
|
|
MODIFY COLUMN b text,
|
|
ADD INDEX idx1 (b(4), e),
|
|
ADD INDEX idx4 (e, b(4), d);
|
|
|
|
ANALYZE TABLE t1;
|
|
|
|
SELECT * FROM column_stat;
|
|
SELECT * FROM index_stat;
|
|
|
|
DROP TABLE t1,t2;
|
|
|
|
DELETE FROM mysql.table_stat;
|
|
DELETE FROM mysql.column_stat;
|
|
DELETE FROM mysql.index_stat;
|
|
|
|
set use_stat_tables='never';
|
|
|
|
set names utf8;
|
|
|
|
CREATE DATABASE world;
|
|
|
|
use world;
|
|
|
|
--source include/world_schema_utf8.inc
|
|
|
|
--disable_query_log
|
|
--disable_result_log
|
|
--disable_warnings
|
|
--source include/world.inc
|
|
--enable_warnings
|
|
--enable_result_log
|
|
--enable_query_log
|
|
|
|
set use_stat_tables='preferably';
|
|
|
|
--disable_result_log
|
|
ANALYZE TABLE Country, City, CountryLanguage;
|
|
--enable_result_log
|
|
|
|
SELECT UPPER(db_name), UPPER(table_name), cardinality
|
|
FROM test.table_stat;
|
|
SELECT UPPER(db_name), UPPER(table_name),
|
|
column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency
|
|
FROM test.column_stat;
|
|
SELECT UPPER(db_name), UPPER(table_name),
|
|
index_name, prefix_arity, avg_frequency
|
|
FROM test.index_stat;
|
|
|
|
use test;
|
|
|
|
set use_stat_tables='never';
|
|
|
|
CREATE DATABASE world_innodb;
|
|
|
|
use world_innodb;
|
|
|
|
--source include/world_schema_utf8.inc
|
|
|
|
ALTER TABLE Country ENGINE=InnoDB;
|
|
ALTER TABLE City ENGINE=InnoDB;
|
|
ALTER TABLE CountryLanguage ENGINE=InnoDB;
|
|
|
|
--disable_query_log
|
|
--disable_result_log
|
|
--disable_warnings
|
|
--source include/world.inc
|
|
--enable_warnings
|
|
--enable_result_log
|
|
--enable_query_log
|
|
|
|
set use_stat_tables='preferably';
|
|
|
|
--disable_result_log
|
|
ANALYZE TABLE Country, City, CountryLanguage;
|
|
--enable_result_log
|
|
|
|
SELECT UPPER(db_name), UPPER(table_name), cardinality
|
|
FROM test.table_stat;
|
|
SELECT UPPER(db_name), UPPER(table_name),
|
|
column_name, min_value, max_value, nulls_ratio, avg_length, avg_frequency
|
|
FROM test.column_stat;
|
|
SELECT UPPER(db_name), UPPER(table_name),
|
|
index_name, prefix_arity, avg_frequency
|
|
FROM test.index_stat;
|
|
|
|
use test;
|
|
|
|
DROP DATABASE world;
|
|
DROP DATABASE world_innodb;
|
|
|
|
DELETE FROM mysql.table_stat;
|
|
DELETE FROM mysql.column_stat;
|
|
DELETE FROM mysql.index_stat;
|
|
|
|
DROP VIEW test.table_stat;
|
|
DROP VIEW test.column_stat;
|
|
DROP VIEW test.index_stat;
|
|
|
|
set use_stat_tables=@save_use_stat_tables;
|
|
|
|
|