Spec-Zone.ru › SQLite

Ограничения реализации SQLite

Ограничения SQLite

В контексте этой статьи «ограничения» — это размеры или количества, которые нельзя превысить. Нас интересуют такие параметры, как максимальное количество байтов в BLOB или максимальное количество столбцов в таблице.

Изначально SQLite проектировалась с политикой отказа от произвольных ограничений. Разумеется, у каждой программы, работающей на машине с конечным объёмом памяти и дискового пространства, есть те или иные ограничения. Но в SQLite они не были чётко определены. Предполагалось, что всё, что помещается в память и может быть подсчитано с помощью 32-разрядного целого числа, должно работать.

К сожалению, политика отсутствия ограничений оказалась источником проблем. Поскольку верхние границы не были чётко определены, их не тестировали, и при нагрузке SQLite до предела часто обнаруживались ошибки. Поэтому начиная примерно с версии SQLite 3.5.8 (2008-04-16) ограничения определены чётко, а их соблюдение проверяется в составе набора тестов.

В этой статье описаны ограничения SQLite и способы их настройки для конкретных приложений. Значения ограничений по умолчанию обычно достаточно велики и подходят практически для любого приложения. Некоторым приложениям может потребоваться увеличить то или иное ограничение, но мы ожидаем, что такая необходимость возникает редко. Чаще приложению может понадобиться пересобрать SQLite с гораздо более низкими ограничениями, чтобы избежать чрезмерного расходования ресурсов в случае ошибок в генераторах SQL-инструкций более высокого уровня или помочь защититься от злоумышленников, внедряющих вредоносные SQL-инструкции.

Некоторые ограничения можно изменять во время выполнения отдельно для каждого соединения с помощью интерфейса sqlite3_limit(), используя одну из категорий ограничений, определённых для этого интерфейса. Ограничения времени выполнения предназначены для приложений с несколькими базами данных, часть из которых используется только внутри приложения, а на другие могут влиять потенциально враждебные внешние агенты или управлять ими. Например, веб-браузер может использовать внутреннюю базу данных для учёта просмотренных страниц, а также иметь одну или несколько отдельных баз данных, создаваемых и контролируемых JavaScript-приложениями, загруженными из интернета. Интерфейс sqlite3_limit() позволяет не ограничивать внутренние базы данных, которыми управляет доверенный код, одновременно устанавливая строгие ограничения для баз данных, созданных или контролируемых недоверенным внешним кодом, чтобы помочь предотвратить атаку типа «отказ в обслуживании».

  1. Максимальная длина строки или BLOB

    Максимальное количество байтов в строке или BLOB в SQLite задаётся макросом препроцессора SQLITE_MAX_LENGTH. Значение этого макроса по умолчанию равно 1 миллиарду (одной тысяче миллионов, или 1 000 000 000). Это значение можно увеличить или уменьшить во время компиляции с помощью параметра командной строки, например:

    -DSQLITE_MAX_LENGTH=123456789

    Текущая реализация поддерживает строки и BLOB длиной не более 231-3, то есть 2147483645 байт. Некоторые встроенные функции, например hex(), могут завершить работу с ошибкой задолго до достижения этого предела. В приложениях, где важна безопасность, лучше не пытаться увеличивать максимальную длину строк и BLOB. Более того, если это возможно, стоит уменьшить максимальную длину строк и BLOB до нескольких миллионов байтов.

    На некоторых этапах обработки INSERT и SELECT в SQLite всё содержимое каждой строки базы данных кодируется в виде одного BLOB. Поэтому параметр SQLITE_MAX_LENGTH также задаёт максимальное количество байтов в строке.

    Максимальную длину строки или BLOB можно уменьшить во время выполнения с помощью интерфейса sqlite3_limit(db,SQLITE_LIMIT_LENGTH,size).

  2. Максимальное количество столбцов

    Параметр времени компиляции SQLITE_MAX_COLUMN задаёт верхнюю границу для:

    • количества столбцов в таблице
    • количества столбцов в индексе
    • количества столбцов в представлении
    • количества элементов в предложении SET инструкции UPDATE
    • количества столбцов в результирующем наборе инструкции SELECT
    • количества элементов в предложении GROUP BY или ORDER BY
    • количества значений в инструкции INSERT

    Значение SQLITE_MAX_COLUMN по умолчанию равно 2000. Во время компиляции его можно изменить на значение вплоть до 32767. С другой стороны, многие опытные проектировщики баз данных утверждают, что в хорошо нормализованной базе данных никогда не потребуется более 100 столбцов в таблице.

    В большинстве приложений столбцов немного — несколько десятков. В генераторе кода SQLite есть участки, использующие алгоритмы со сложностью O(N²), где N — количество столбцов. Поэтому, если задать для SQLITE_MAX_COLUMN очень большое значение и генерировать SQL-код с большим количеством столбцов, вызов sqlite3_prepare_v2() может выполняться медленно.

    Максимальное количество столбцов можно уменьшить во время выполнения с помощью интерфейса sqlite3_limit(db,SQLITE_LIMIT_COLUMN,size).

  3. Максимальная длина SQL-инструкции

    Максимальное количество байтов в тексте SQL-инструкции ограничено значением SQLITE_MAX_SQL_LENGTH, которое по умолчанию равно 1 000 000 000.

    Если длина SQL-инструкции ограничена одним миллионом байтов, очевидно, что нельзя вставлять строки длиной в несколько миллионов байтов, встраивая их в виде литералов в инструкции INSERT. Но так делать в любом случае не следует. Используйте для данных параметры хоста. Подготовьте короткие SQL-инструкции, например:

    INSERT INTO tab1 VALUES(?,?,?);

    Затем используйте функции sqlite3_bind_XXXX(), чтобы привязать к SQL-инструкции большие строковые значения. Привязка избавляет от необходимости экранировать кавычки в строке и снижает риск атак с внедрением SQL-кода. Кроме того, такой способ работает быстрее, поскольку большую строку не нужно многократно разбирать или копировать.

    Максимальную длину SQL-инструкции можно уменьшить во время выполнения с помощью интерфейса sqlite3_limit(db,SQLITE_LIMIT_SQL_LENGTH,size).

  4. Максимальное количество таблиц в объединении

    SQLite не поддерживает объединения более чем из 64 таблиц. Это ограничение обусловлено тем, что генератор кода SQLite использует в оптимизаторе запросов битовые карты с одним битом для каждой таблицы в объединении.

    SQLite использует эффективный алгоритм планирования запросов, поэтому даже большое объединение можно быстро подготовить. Следовательно, механизма увеличения или уменьшения ограничения на количество таблиц в объединении нет.

  5. Максимальная глубина дерева выражения

    SQLite разбирает выражения в дерево для последующей обработки. Во время генерации кода SQLite рекурсивно обходит это дерево. Поэтому глубина дерева выражения ограничена, чтобы не использовать слишком много стековой памяти.

    Параметр SQLITE_MAX_EXPR_DEPTH задаёт максимальную глубину дерева выражения. Если его значение равно 0, ограничение не применяется. В текущей реализации значение по умолчанию равно 1000.

    Максимальную глубину дерева выражения можно уменьшить во время выполнения с помощью интерфейса sqlite3_limit(db,SQLITE_LIMIT_EXPR_DEPTH,size), если изначально SQLITE_MAX_EXPR_DEPTH имеет положительное значение. Другими словами, глубину выражений можно уменьшить во время выполнения, если она уже ограничена во время компиляции. Если во время компиляции для SQLITE_MAX_EXPR_DEPTH задано значение 0 (глубина выражений не ограничена), вызов sqlite3_limit(db,SQLITE_LIMIT_EXPR_DEPTH,size) ничего не делает.

  6. Максимальное количество аргументов функции

    Параметр SQLITE_MAX_FUNCTION_ARG задаёт максимальное количество параметров, которые можно передать SQL-функции. На протяжении многих лет значение по умолчанию составляло около 100, но начиная с SQLite версии 3.48.0 (2025-01-14) оно увеличено до 1000.

    Количество аргументов функции иногда хранится в виде знакового 16-разрядного целого числа. Поэтому для SQLITE_MAX_FUNCTION_ARG существует жёсткая верхняя граница 32767.

    Максимальное количество аргументов функции можно уменьшить во время выполнения с помощью интерфейса sqlite3_limit(db,SQLITE_LIMIT_FUNCTION_ARG,size).

  7. Максимальное количество элементов в составной инструкции SELECT

    Составная инструкция SELECT состоит из двух или более инструкций SELECT, соединённых операторами UNION, UNION ALL, EXCEPT или INTERSECT. Каждую отдельную инструкцию SELECT в составной инструкции SELECT называют «элементом».

    Генератор кода SQLite обрабатывает составные инструкции SELECT с помощью рекурсивного алгоритма. Поэтому для ограничения размера стека ограничивается количество элементов в составной инструкции SELECT. Максимальное количество элементов задаётся параметром SQLITE_MAX_COMPOUND_SELECT, значение которого по умолчанию равно 500. Мы считаем это значение достаточно большим, поскольку на практике количество элементов в составном SELECT почти никогда не превышает однозначного числа.

    Максимальное количество элементов составной инструкции SELECT можно уменьшить во время выполнения с помощью интерфейса sqlite3_limit(db,SQLITE_LIMIT_COMPOUND_SELECT,size).

  8. Максимальная длина шаблона LIKE или GLOB

    Алгоритм сопоставления с шаблоном, используемый в стандартной реализации SQLite для LIKE и GLOB, в некоторых патологических случаях может иметь производительность O(N²), где N — количество символов в шаблоне. Чтобы избежать атак типа «отказ в обслуживании» со стороны злоумышленников, способных задавать собственные шаблоны LIKE или GLOB, длина шаблона LIKE или GLOB ограничена значением SQLITE_MAX_LIKE_PATTERN_LENGTH байт. По умолчанию это ограничение равно 50000. Современная рабочая станция может сравнительно быстро обработать даже патологический шаблон LIKE или GLOB длиной 50000 байт. Проблема отказа в обслуживании возникает только тогда, когда длина шаблона достигает нескольких миллионов байт. Тем не менее, поскольку большинство полезных шаблонов LIKE или GLOB имеют длину не более нескольких десятков байт, разработчики приложений, уделяющие особое внимание безопасности, могут уменьшить это значение до нескольких сотен, если внешние пользователи могут создавать произвольные шаблоны.

    Максимальную длину шаблона LIKE или GLOB можно уменьшить во время выполнения с помощью интерфейса sqlite3_limit(db,SQLITE_LIMIT_LIKE_PATTERN_LENGTH,size).

  9. Максимальное количество параметров хоста в одной SQL-инструкции

    Параметр хоста — это заполнитель в SQL-инструкции, значение которого задаётся с помощью одного из интерфейсов sqlite3_bind_XXXX(). Многие программисты на SQL знакомы с использованием вопросительного знака ("?") в качестве параметра хоста. SQLite также поддерживает именованные параметры хоста с префиксами ":", "$" или "@", а также нумерованные параметры хоста в форме "?123".

    Каждому параметру хоста в инструкции SQLite присваивается номер. Обычно нумерация начинается с 1 и с каждым новым параметром увеличивается на единицу. Однако в форме "?123" номером параметра хоста является число после вопросительного знака.

    SQLite выделяет память для всех параметров хоста с номерами от 1 до наибольшего используемого номера. Поэтому SQL-инструкция, содержащая параметр хоста, например ?1000000000, потребовала бы гигабайты памяти. Это могло бы легко исчерпать ресурсы хост-машины. Чтобы избежать чрезмерного выделения памяти, максимальное значение номера параметра хоста ограничено параметром SQLITE_MAX_VARIABLE_NUMBER, который по умолчанию равен 999 в версиях SQLite до 3.32.0 (2020-05-22) и 32766 в версиях SQLite начиная с 3.32.0.

    Максимальный номер параметра хоста можно уменьшить во время выполнения с помощью интерфейса sqlite3_limit(db,SQLITE_LIMIT_VARIABLE_NUMBER,size).

  10. Максимальная глубина рекурсии триггеров

    SQLite ограничивает глубину рекурсии триггеров, чтобы инструкция с рекурсивными триггерами не использовала неограниченный объём памяти.

    До SQLite версии 3.6.18 (2009-09-11) триггеры не были рекурсивными, поэтому это ограничение не имело значения. Начиная с версии 3.6.18 рекурсивные триггеры поддерживаются, но для их использования необходимо явно включить их с помощью инструкции PRAGMA recursive_triggers. Параметр SQLITE_MAX_TRIGGER_DEPTH имеет значение только при включённых рекурсивных триггерах.

    Максимальная глубина рекурсии триггеров по умолчанию равна 1000.

  11. Максимальное количество подключённых баз данных

    Инструкция ATTACH — это расширение SQLite, позволяющее связать две или более баз данных с одним соединением и работать с ними так, как если бы они составляли одну базу данных. Количество одновременно подключённых баз данных ограничено параметром SQLITE_MAX_ATTACHED, значение которого по умолчанию равно 10. Максимальное количество подключённых баз данных не может превышать 125.

    Максимальное количество подключённых баз данных можно уменьшить во время выполнения с помощью интерфейса sqlite3_limit(db,SQLITE_LIMIT_ATTACHED,size).

  12. Максимальное количество страниц в файле базы данных

    SQLite может ограничивать размер файла базы данных, чтобы не допустить его чрезмерного роста и расходования слишком большого объёма дискового пространства. Параметр SQLITE_MAX_PAGE_COUNT задаёт максимальное количество страниц в одном файле базы данных. Попытка вставить данные, из-за которых файл базы данных превысит этот размер, приведёт к ошибке SQLITE_FULL.

    Наибольшее возможное значение SQLITE_MAX_PAGE_COUNT — 4294967294 (232-2). Начиная с версии 3.45.0 (2024-01-15), значение 4294967294 также используется по умолчанию. При размере страницы по умолчанию, равном 4096 байтам, это позволяет создать базу данных размером около 17,5 терабайта. Если увеличить размер страницы до максимального значения 65536 байт, размер файла базы данных может достигнуть примерно 281 терабайта.

    Для изменения этого ограничения во время выполнения можно использовать PRAGMA max_page_count.

  13. Максимальное количество строк в таблице

    Теоретически максимальное количество строк в таблице составляет 264 (18446744073709551616, или около 1.8e+19). До этого ограничения невозможно добраться, поскольку раньше будет достигнут максимальный размер базы данных — 281 терабайт. В базе данных размером 281 терабайт может храниться не более приблизительно 2e+13 строк, и то только при отсутствии индексов и если каждая строка содержит очень мало данных.

  14. Максимальный размер базы данных

    Каждая база данных состоит из одной или нескольких «страниц». В пределах одной базы данных размер всех страниц одинаков, но размеры страниц в разных базах данных могут быть степенями двойки от 512 до 65536 включительно. Максимальный размер файла базы данных составляет 4294967294 страницы. При максимальном размере страницы 65536 байт это соответствует максимальному размеру базы данных примерно 2.8e+14 байт (281 терабайт, или 256 тебибайт, или 281474 гигабайта, или 262143 гибибайта).

    Это конкретное верхнее ограничение не проверялось, поскольку у разработчиков нет оборудования, способного достичь такого предела. Однако тесты подтверждают, что SQLite работает корректно и предсказуемо, когда база данных достигает максимального размера файла, поддерживаемого файловой системой (обычно он намного меньше теоретического максимального размера базы данных), а также когда база данных не может увеличиваться из-за нехватки места на диске.

  15. Максимальное количество таблиц в схеме

    Для каждой таблицы и каждого индекса требуется как минимум одна страница в файле базы данных. Поэтому максимальное количество страниц в файле базы данных также является верхней границей количества таблиц и индексов в схеме. Под «индексом» в предыдущих предложениях подразумевается индекс, явно созданный с помощью инструкции CREATE INDEX, или неявный индекс, созданный ограничением UNIQUE или PRIMARY KEY.

    При открытии базы данных сканируется и разбирается вся схема, а её дерево разбора хранится в памяти. Это означает, что время установления соединения с базой данных и первоначальный расход памяти пропорциональны размеру схемы.

Эта страница последний раз обновлялась 2026-03-11 15:15:23Z

SQLite is in the Public Domain.
https://sqlite.org/limits.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API