Как определить размер базы данных программно?

«Как определить размер базы данных программно?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Размер БД можно определить через системные запросы СУБД или проверку файлов на диске. Способ зависит от типа базы данных.

1. Через SQL-запросы (JDBC):

PostgreSQL:

String sql = "SELECT pg_database_size(current_database());"; // Размер текущей БД в байтах
// Или для конкретной БД:
// SELECT pg_database_size('my_database_name');
try (Statement stmt = connection.createStatement();
     ResultSet rs = stmt.executeQuery(sql)) {
    if (rs.next()) {
        long sizeInBytes = rs.getLong(1);
        System.out.println("Database size: " + sizeInBytes + " bytes");
    }
}

MySQL / MariaDB:

-- Суммарный размер всех таблиц в БД
SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size_MB"
FROM information_schema.tables
WHERE table_schema = DATABASE();

2. Для встраиваемых/файловых БД (H2, SQLite): Можно измерить размер файла(ов) БД средствами Java NIO:

import java.nio.file.*;

Path dbPath = Paths.get("./database.mv.db"); // Файл H2
long fileSize = Files.size(dbPath); // Размер в байтах
System.out.println("DB file size: " + fileSize + " bytes");
// Для SQLite обычно один файл .db или .sqlite

3. Практическое замечание: Размер БД в запросе (pg_database_size) обычно включает данные, индексы, но может не включать служебные файлы (WAL, временные файлы). Полный размер на диске может быть больше. Для точной оценки в production-среде также стоит учитывать:

  • Размер логов транзакций.
  • Пространство, зарезервированное для авторасширения (autoextend).
  • Сжатие данных, если оно используется.