Задавайте вопросы, мы ответим
Вы не зашли.
Можно ли каким либо образом узнать занимаемой таблицей размер? Или подскажете системную таблицу, где лежат текущие размеры данных? В общем хоть чтото есть?
Заранее благодарен за ответ
Скажем по аналогии с ms sql server:
DECLARE @pageSizeKB int, @name varchar(128);
set @name=null;
SELECT @pagesizeKB = low / 1024
FROM [master].[dbo].[spt_values] WITH(NOLOCK)
WHERE [number] = 1 AND [type] = 'E'
SELECT
OBJECT_NAME(o.id) [table_name]
,i1.rowcnt [rows]
,(ISNULL(SUM(i1.reserved), 0) + ISNULL(SUM(i2.reserved), 0)) * @pagesizeKB [reservedKB]
,(ISNULL(SUM(i1.dpages), 0) + ISNULL(SUM(i2.used), 0)) * @pagesizeKB [dataKB]
,((ISNULL(SUM(i1.used), 0) + ISNULL(SUM(i2.used), 0)) - (ISNULL(SUM(i1.dpages), 0) + ISNULL(SUM(i2.used), 0))) * @pagesizeKB [index_sizeKB]
,((ISNULL(SUM(i1.reserved), 0) + ISNULL(SUM(i2.reserved), 0)) - (ISNULL(SUM(i1.used), 0) + ISNULL(SUM(i2.used), 0))) * @pagesizeKB [unusedKB]
FROM [dbo].[sysobjects] o WITH(NOLOCK)
LEFT JOIN [dbo].[sysindexes] i1 WITH(NOLOCK) ON (i1.id = o.id AND i1.indid < 2)
LEFT JOIN [dbo].[sysindexes] i2 WITH(NOLOCK) ON (i2.id = o.id AND i2.indid = 255)
WHERE o.[name] = ISNULL(@Name, o.[name]) AND ((OBJECTPROPERTY(o.id, N'IsUserTable') = 1)
OR ((OBJECTPROPERTY(o.id, N'IsView') = 1) AND (OBJECTPROPERTY(o.id, N'IsIndexed') = 1)))
GROUP BY o.id, i1.rowcnt
ORDER BY [reservedKB] DESC
Неактивен
Да, я кое-что нашел, но эта команда выдает резалт сет при исполнении.
SHOW TABLE STATUS FROM `test`; -- LIKE 'tbl_name';
Вопрос второй могу ли я сразу этот резалт сет записать в таблицу? Ну типа select * into dest from src;? Или другой способ?
Неактивен
Ух, какая жуть микрософтовская... между прочим, в MS тоже есть INFORMATION_SCHEMA.
Негоже копаться в системных табличках
Неактивен
Спасибо, попробую. Я думаю и в MySql можно найти такое же. Кстати большинство сложных предложений ms проходит на mysql без вопросов. Так что были бы одинаковые таблицы и эта жуть прошла бы.
Неактивен
SELECT `TABLE_NAME` As `table_name`,
`TABLE_ROWS` AS `rows`,
`DATA_LENGTH`/1024. AS `reserved`,
`INDEX_LENGTH`/1024. as `index_size`,
`DATA_FREE`/1024. AS `unused`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='test'
AND `TABLE_TYPE`='BASE TABLE'
AND `TABLE_NAME` = 'test'
ORDER BY `DATA_LENGTH` DESC,`TABLE_ROWS` DESC, `INDEX_LENGTH` DESC;
И все таки я сомневаюсь, что это реальные размеры данных. А как это связано с размерами файла на диске?
Одну зависимость я нашел
`TABLE_ROWS`*`AVG_ROW_LENGTH` примерно равно `DATA_LENGTH` (видимо берется целое без остатка)
Неактивен
И все таки я сомневаюсь, что это реальные размеры данных. А как это связано с размерами файла на диске?
Так Вы посмотрите файл table.MYD (если MyISAM).
Неактивен
InnoDB. А других способов нет? Понятно, что можно запустить в командной строке dir, отпарсить размер и все сложить.
И потом все равно это должно биться с информацией, которая уже есть в БД в таблице tables. Я и спрашиваю про эту связь. Может кто знает?
Неактивен
В InnoDB - только SHOW TABLE STATUS или INFORMATION_SCHEMA. Точных данных в случае InnoDB
Вы в любом случае не получите (да и они будут бесполезны), т.к. у всех таблиц InnoDB общее пространство
на диске (или несколько), в этом пространстве всегда есть свободное место (которое показывает SHOW
TABLE STATUS, но только для пространства, в котором живет текущая табличка).
Неактивен
Так все-таки SHOW TABLE STATUS для InnoDB показывает реальный размер данных или что?
(как это будет отличаться, например, от размера, который будет получен, если таблицу перевести на MyISAM?)
Неактивен
MyISAM и Innodb-таблицы хранятся по разному и, естественно, та же самая таблица будет занимать разный объем. InnoDB дает оценку объема, занимаемого таблицей в хранилище.
Неактивен
LazY написал:
Так все-таки SHOW TABLE STATUS для InnoDB показывает реальный размер данных или что?
(как это будет отличаться, например, от размера, который будет получен, если таблицу перевести на MyISAM?)
Опыт показывает, что размер .ibd (в режиме file_per_table) непосредственно после ALTER TABLE ENGINE=InnoDB
в полтора раза больше суммы размеров .MYD + .MYI непосредственно после ALTER TABLE ENGINE=MyISAM (для
таблиц ~3G).
Неактивен