Окинем взглядом SQLite 3

Какой движок базы данных является самым популярным в настоящий момент? Ответить на этот вопрос довольно сложно, поскольку в каждой области применения баз данных ответ будет своим. В интернете, например, большинство сайтов работает на MySQL. В банковской же сфере наиболее распространённым, если судить по опросам, является Microsoft SQL Server.

Однако мы сейчас будем говорить совсем не о них. Давайте рассмотрим движки баз данных не по рейтингу их популярности, а по их компактности. Тогда на первом месте будет стоять, как вы сами понимаете, не монструозный Oracle и даже не MySQL, который позиционируется как довольно "легковесная" СУБД. Пальму первенства получит СУБД, название которой вы можете увидеть в заголовке этой статьи. Это SQLite. Само название говорит о том, что это весьма облегчённый вариант SQL-движка (SQLite = SQL + Lite, от английского "light" - лёгкий). Использование SQLite будет разумным во многих случаях. Например, если требуется написать очень компактную и не требовательную к ресурсам компьютера программу для работы с простыми базами данных. Кроме того, иногда имеет смысл использовать SQLite и в качестве движка для базы данных какого-либо сайта, если сервер не заказывается у хостинг-провайдера, а создаётся компанией самостоятельно.

Найти SQLite можно на официальном сайте проекта, расположенном по адресу www.sqlite.org. Дистрибутив для Windows занимает всего чуть больше 130 Кб в архиве или около 250 Кб в распакованном виде и содержит минимум необходимого - sqlite3.dll и файл с перечнем функций, экспортируемых динамической библиотекой. Причём больше для работы SQLite ничего и не потребуется. К тому же, стоит отметить, что Windows - не единственная операционная система, которую поддерживает SQLite, и это не может не радовать.

Глядя на размер SQLite, совершенно логично можно задаться вопросом о его функциональности. Конечно, сами понимаете, до Oracle или даже до PostgreSQL нашему сегодняшнему "герою дня" далеко. Но всё не так уж и плохо, как может показаться вначале. Движок SQLite почти полностью поддерживает стандарт SQL92, хотя и с некоторыми оговорками. Нет возможности производить вложенные транзакции, не полностью реализована поддержка триггеров, а также некоторые мелкие нюансы поддержки конструкций ALTER TABLE, FOREIGN KEY и некоторых других. Подробнее об этом можно прочитать на сайте проекта.

SQLite - однопользовательский движок, идеально подходящий для встраивания в различные программы, не требующие распределённой работы с базой данных. В связи с этим полностью отсутствует встроенная поддержка технологии клиент-сервер (именно поэтому я использую термин SQL-движок, а не SQL-сервер). И, соответственно, нет возможности использовать стандартные для SQL92 операции для работы с правами пользователей - GRANT и REVOKE. Как говорят сами разработчики, отсутствие поддержки многопользовательской работы - достаточно важная часть идеологии проекта. Зато, как встроенный в приложение движок, SQLite не требует кропотливой начальной настройки, зачастую необходимой для подавляющего большинства серверных движков.

 

База данных SQLite физически размещается в одном-единственном файле, так же, как это делается, скажем, в Interbase/Firebird. При этом максимальный размер файла ограничивается двумя терабайтами, но нужно помнить, что не все файловые системы поддерживают размещение файлов такого размера. Хотя на практике вряд ли удастся "раскормить" базу до таких гигантских габаритов. Кстати, вот ещё некоторые данные об ограничениях в SQLite: данные типа VARCHAR и BLOB ограничены только размером доступной на диске памяти. При этом SQLite запишет строку любой длины в поле типа VARCHAR(Х), где в скобках задана максимальная длина строки. После такой операции символы не будут обрезаны и, по заверениям разработчиков, будут доступны для чтения. А данные типа BLOB могут храниться в поле любого типа. Вообще говоря, подобные вольности относятся не только к BLOB-данным, но и к другим типам, и пользователи не раз обращали внимание разработчиков на этот "баг". Однако те решили оставить данную особенность своего детища безо всяких изменений. Лично я не знаю, хорошо это или плохо - думаю, каждый решит этот вопрос по-своему, но, очевидно, в определённых задачах эти возможности имеют шанс быть небесполезными.

Кстати, строки в базе данных хранятся в кодировке Unicode-16 (UTF-16), т.е. для каждого символа отводится два байта. Это удобно тем, что можно использовать различные специальные символы и символ национальных алфавитов, не заботясь о правильности выбранной кодировки текста.

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

SQLite поддерживает одновременный доступ нескольких процессов (т.е. и нескольких приложений) к одной и той же базе данных. Правда, одновременно может производиться только чтение данных, а любое их изменение или запись новых может осуществляться единовременно только одним процессом. Правда, используемые SQLite механизмы блокировки записи не работают на NFS (Network File System), а также могут не совсем корректно работать на компьютерах с файловой системой FAT, особенно для файлов, доступных для совместного сетевого доступа. Так что все эти особенности нужно учитывать при создании приложений, использующих SQLite. Правда, обычно базу данных SQLite одновременно несколько приложений используют довольно редко.

Что касается подключения движка SQLite к прикладным программам, то его разработчики предлагают для программистов на C/C++ API-интерфейс в виде различных функций. Конечно, никто и ничто не мешает использовать возможности SQLite и в программах, написанных на других языках, но разработчики SQLite предлагают документацию, описания и заголовочные файлы именно для этих языков. API-интерфейс представляет собой 83 отдельных функции, однако самым простым программам, по заверениям авторов SQLite, достаточно будет трёх из них. Первая - это sqlite3_open, открывающая базу данных для использования в приложении; вторая - sqlite3_exec для выполнения SQL-запроса, а третья - sqlite3_close, завершающая сеанс работы с данными и записывающая изменения. Как видно, применять их нужно в том же порядке, в каком я их упомянул. Отрадно, что многие функции имеются в двух вариантах - для UTF-8 и UTF-16. А ещё SQLite поддерживает определяемые пользователем функции (UDF - User-Defined Functions), что тоже весьма и весьма полезно.

Подробную информацию на английском языке по всем 83 функциям, а также структурам и константам, использующимся при работе с движком SQLite, можно найти на официальном сайте проекта. Кстати, немного поискав на нём, я нашёл "обёртки" API SQLite не только для C/C++, но и для других языков, среди которых с удивлением обнаружил даже TCL. Их существование, судя по всему, свидетельствует о популярности этого движка среди разработчиков на соответствующих языках.

Не последним пунктом в пользу выбора того или иного движка для работы с базами данных является его скорость. Вопрос о скорости, видимо, волновал не только пользователей SQLite, но и его разработчиков, потому что на их сайте можно найти сравнительные характеристики быстродействия SQLite, MySQL и PostgreSQL. Версии там, правда, сравниваются не самые свежие, но более новых тестов в Сети отыскать не удалось. По результатам практически всех тестов SQLite делает своих клиент-серверных соперников "одной левой", причём разбежки в скорости иногда впечатляют: некоторые операции SQLite выполняет в 2-3 раза быстрее, чем MySQL, а для PostgreSQL эта цифра доходит до 20 раз. Впрочем, это и не удивительно, так как клиент-серверные движки просто даже по определению более медлительны. Проигрывает же конкурентам SQLite только в двух "номинациях": при выполнении операций CREATE INDEX и DROP TABLE. Впрочем, разрыв в этих тестах не настолько значителен, а операции эти выполняются не так часто, чтобы говорить о критичности этих отличий в скоростях. В целом, SQLite показывает более высокую скорость, и это совсем не плохо.

Таким образом, как видите, использование SQLite в качестве встроенного SQL-движка куда более предпочтительно, чем использование в аналогичных целях MySQL или особенно PostgreSQL. Последний, к тому же, очень-очень сильно отличается от SQLite по своим размерам, хотя, конечно, значительно выигрывает по возможностям.

Последнее время, когда появились бесплатные версии даже гигантов рынка СУБД вроде Oracle, DB2 или Microsoft SQL Server, всё меньше коммерческих СУБД выдерживает борьбу с ними. Поэтому SQL-движки с открытым исходным кодом завоёвывают всё большую популярность среди разработчиков и пользователей. SQLite в этом смысле не исключение - его исходный код открыт, и не просто открыт. Дело в том, что SQLite распространяется по лицензии public domain. Для тех, кто не знаком с этим термином, поясню, что это значит. Обычно программное обеспечение с открытым исходным кодом распространяется свободно, однако авторские права на сам продукт и на его исходный код сохраняются за его разработчиками. Для public domain-продуктов это правило не действует: и исходный код, и продукт не защищены авторскими правами и могут быть использованы кем угодно в каких угодно целях.

Помимо открытости (и отчасти вследствие её), достоинством SQLite является надёжность: разработчики утверждают, что протестировано на работоспособность и устойчивость более 95% кода SQLite. Очень хотелось бы этому верить.

Однако, пожалуй, это всё, что я мог и хотел рассказать вам об этом замечательном SQL-движке. А уж выбор "за" или "против" SQLite остаётся за вами, уважаемые читатели.

Вадим СТАНКЕВИЧ

Версия для печатиВерсия для печати

Номер: 

27 за 2006 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!
 

Комментарии

Аватар пользователя абыфацель
Вот навскидку, этот SQLite, например, по умолчанию является фишкой юниксового аудиоплеера AmaroK ( аналог iTunes) - как основа менеджера аудиозаписей.

Наверное хорошо подойдёт для аналогов графических вьверов типа Picassa.

Аватар пользователя абыфацель
Повозился сейчас вот с этой "скулит" - хорошая вещь. Не знаю как для предприятий, но для дома, для семьи то что надо. :) Потому что минимум возни с этой СУБД. И удобно - таблички в одном файле - ничто не теряется, легко бэкапить на всякий пожарный.

Никогда не любил эти БД вообще, а тут даже сделал себе незатейливую свою личную базу для личного пользования.

Аватар пользователя Патологоанатом
а Firebird Embedded всё-таки покруче :)
Аватар пользователя mike
>удобно - таблички в одном файле...

Тоже мне отличие. В "аксессе" завсегда так было.

Аватар пользователя Инкогнито
К MS Access обращатся надо тока через ODBC (ну если не считать офисного клиента)

А SQLite, как я понимаю, предоставляет интерфейсы напрямую на уровне DLL - т.е. пиши хош на С с плюсиками, хош на Делфи, хош на ассемблере

И не надо замарачиваццо с ODBC

Аватар пользователя mike
> SQLite ... предоставляет интерфейсы напрямую на уровне DLL

Поюзаем, узнаем.

Аватар пользователя Настоящий полковник
Sybase Adaptive Server Anywhere. Например, версия 9.x. Занимает 1.5Mb для локального варианта. 5.5 - сетевой вариант. Все с ODBC драйверами.

Если полная поставка, то ~130Мб инсталляции.

Скорость - очень высокая. Функциональность - почти полный Transact-SQL. И даже немного больше. Плюс Watcom-SQL. Практически промышленная СУБД.