SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.12.2008 13:51:10

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

размер занимаемый таблицей

Можно ли каким либо образом узнать занимаемой таблицей размер? Или подскажете системную таблицу, где лежат текущие размеры данных? В общем хоть чтото есть?


Заранее благодарен за ответ

Скажем по аналогии с 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

Неактивен

 

#2 01.12.2008 14:08:39

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Re: размер занимаемый таблицей

Да, я кое-что нашел, но эта команда выдает резалт сет при исполнении.

SHOW TABLE STATUS FROM `test`; -- LIKE 'tbl_name';

Вопрос второй могу ли я сразу этот резалт сет записать в таблицу? Ну типа select * into dest from src;? Или другой способ?

Неактивен

 

#3 01.12.2008 18:36:48

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: размер занимаемый таблицей

Ух, какая жуть микрософтовская... между прочим, в MS тоже есть INFORMATION_SCHEMA.
Негоже копаться в системных табличках wink

SELECT TABLE_NAME,DATA_LENGTH,INDEX_LENGTH
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='dbname';

Неактивен

 

#4 02.12.2008 09:35:51

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Re: размер занимаемый таблицей

Спасибо, попробую. Я думаю и в MySql можно найти такое же. Кстати большинство сложных предложений ms проходит на mysql без вопросов. Так что были бы одинаковые таблицы и эта жуть прошла бы.

Неактивен

 

#5 02.12.2008 15:56:46

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Re: размер занимаемый таблицей

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` (видимо берется целое без остатка)

Неактивен

 

#6 03.12.2008 00:36:56

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: размер занимаемый таблицей

И все таки я сомневаюсь, что это реальные размеры данных. А как это связано с размерами файла на диске?

Так Вы посмотрите файл table.MYD (если MyISAM).

Неактивен

 

#7 03.12.2008 13:26:11

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Re: размер занимаемый таблицей

InnoDB. А других способов нет? Понятно, что можно запустить в командной строке dir, отпарсить размер и все сложить.
И потом все равно это должно биться с информацией, которая уже есть в БД в таблице tables. Я и спрашиваю про эту связь. Может кто знает?

Неактивен

 

#8 03.12.2008 13:40:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: размер занимаемый таблицей

В InnoDB - только SHOW TABLE STATUS или INFORMATION_SCHEMA. Точных данных в случае InnoDB
Вы в любом случае не получите (да и они будут бесполезны), т.к. у всех таблиц InnoDB общее пространство
на диске (или несколько), в этом пространстве всегда есть свободное место (которое показывает SHOW
TABLE STATUS, но только для пространства, в котором живет текущая табличка).

Неактивен

 

#9 03.12.2008 21:10:00

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: размер занимаемый таблицей

Так все-таки SHOW TABLE STATUS для InnoDB показывает реальный размер данных или что?
(как это будет отличаться, например, от размера, который будет получен, если таблицу перевести на MyISAM?)

Неактивен

 

#10 03.12.2008 21:11:58

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: размер занимаемый таблицей

MyISAM и Innodb-таблицы хранятся по разному и, естественно, та же самая таблица будет занимать разный объем. InnoDB дает оценку объема, занимаемого таблицей в хранилище.

Неактивен

 

#11 04.12.2008 20:28:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: размер занимаемый таблицей

LazY написал:

Так все-таки SHOW TABLE STATUS для InnoDB показывает реальный размер данных или что?
(как это будет отличаться, например, от размера, который будет получен, если таблицу перевести на MyISAM?)

Опыт показывает, что размер .ibd (в режиме file_per_table) непосредственно после ALTER TABLE ENGINE=InnoDB
в полтора раза больше суммы размеров .MYD + .MYI непосредственно после ALTER TABLE ENGINE=MyISAM (для
таблиц ~3G).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson