Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Ontico
«Одноклассники» состоят из тысяч серверов, большая часть которых участвует в онлайн-обработке запросов пользователей. Каждый из этих серверов владеет только частью данных или логики. Эти части в социальной сети изолировать друг от друга невозможно, поэтому между серверами происходит много сетевого взаимодействия — разнообразного и большого по объему. Таким образом, Одноклассники — это одна из самых больших, сложных и нагруженных распределенных систем в мире.
В этом докладе Олег расскажет об опыте построения отказоустойчивых распределенных систем на Java, основных ошибках и отказах, приемах их тестирования и диагностики. Также речь пойдет об авариях в распределенных системах и методах их предупреждения.
Сегодня многие фреймворки, такие как Prism или Autofac, позволяют разработчику организовать модульную структуру приложения. При этом часто бывает непонятно, для чего ещё нужны модули, кроме как для пресловутой "красоты архитектуры".
В рамках доклада я расскажу о том, какие существуют подходы к организации модульной структуры, в каких фреймворках они реализованы и для решения каких задач дает преимущество каждый подход.
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETDev2Dev
ASP.NET MVC простой и распространённый инструмент. Но строить на его основе большое веб-приложение не так просто. Туториалы не раскрывают проблем возникающих при росте проекта. Зачастую, изначально стройная архитектура размазывается с каждой следующей итерацией.
Я хочу поделиться своим опытом. Рассказать об основных проблемах и предложить выбранные мной решения.
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Ontico
«Одноклассники» состоят из тысяч серверов, большая часть которых участвует в онлайн-обработке запросов пользователей. Каждый из этих серверов владеет только частью данных или логики. Эти части в социальной сети изолировать друг от друга невозможно, поэтому между серверами происходит много сетевого взаимодействия — разнообразного и большого по объему. Таким образом, Одноклассники — это одна из самых больших, сложных и нагруженных распределенных систем в мире.
В этом докладе Олег расскажет об опыте построения отказоустойчивых распределенных систем на Java, основных ошибках и отказах, приемах их тестирования и диагностики. Также речь пойдет об авариях в распределенных системах и методах их предупреждения.
Сегодня многие фреймворки, такие как Prism или Autofac, позволяют разработчику организовать модульную структуру приложения. При этом часто бывает непонятно, для чего ещё нужны модули, кроме как для пресловутой "красоты архитектуры".
В рамках доклада я расскажу о том, какие существуют подходы к организации модульной структуры, в каких фреймворках они реализованы и для решения каких задач дает преимущество каждый подход.
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETDev2Dev
ASP.NET MVC простой и распространённый инструмент. Но строить на его основе большое веб-приложение не так просто. Туториалы не раскрывают проблем возникающих при росте проекта. Зачастую, изначально стройная архитектура размазывается с каждой следующей итерацией.
Я хочу поделиться своим опытом. Рассказать об основных проблемах и предложить выбранные мной решения.
Артём Кошелев: Прочная основа для автоматизации тестированияYandex
Каждый раз, начиная проект по автоматизации тестирования, вы делаете выбор. Вы выбираете технологии, инструменты, подходы к разработке и поддержке тестов. Я расскажу о том, какой выбор сделали мы и что из этого получилось.
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyDmytro Zharii
Мой доклад про создание читабельных отчетов для автоматизации тестирования на .NET/C# + Webdriver + Gallio Icarus/MbUnit + BDDfy
Доклад был сделан специально для онлайн конференции Auto ConfeT&QA, прошедшей в октябре 2012 года.
http://confetqa.ru/
======================================
См. также:
Gallio Icarus:
http://gallio.org
BDDfy – фреймворк для БыДиДификации кода :)
Страница проекта на Github:
http://teststack.github.com/TestStack.BDDfy/
Описание на английском:
http://www.mehdi-khalili.com/bddify-in-action/introduction
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
Работа с данными - это ключевая функция большинства приложений. Но работать с данными не так просто как кажется. С одной стороны, нам нужна производительность, с другой все best practices диктуют нам принцип persistence ignorance, с третьей еще и хочется писать красивый и понятный код. Как найти баланс между всем этим? Чем хороший IRepository отличается от плохого? Что такое CQRS и причем тут функциональное программирование? Об этом и пойдет речь, а так же немного граблей и личного опыта.
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014Dmytro Zharii
Демонстрация работы инструмента записи веб-элементов PageObject для Selenium WebDriver при помощи SWD Page Recorder. Демонстрация работы фреймворка SWD Starter Kit
Контроль качества высоконагруженных систем / Андрей Дроздов (Avito)Ontico
HighLoad++ 2017
Зал «Конгресс-Холл», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/2972.html
Разработка любого высоконагруженного сервиса не обходится без нагрузочных тестов. Во многих проектах процесс анализа работы системы под большой нагрузкой слабо структурирован или выполняется непосредственно в бою. Есть масса статьей и рецептов использования тех или иных инструментов, но самые важные вопросы не раскрыты до конца: что именно мы должны измерять, правильно ли мы интерпретируем результаты и как ловить баги, которые проявляются только под высокой нагрузкой.
...
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)Ontico
- WatchDog. Что это такое? Схема реализации с таймером и схема реализации на RunLoop'e.
- Как собирать результат работы WatchDog. Примеры того, что можно таким образом найти, и что мы нашли на проекте ICQ.
- Как работать с полученными результатами. Анализ стеков потоков. Профилирование с учетом расходов на синхронизацию.
- Проблемы при работе с WatchDog. Системные механизмы и популярные библиотеки, вызывающие проблемы. Методы обхода этих проблем. Итоговые параметры, применяемые на проекте ICQ.
Видео: https://www.youtube.com/watch?v=IUtbbN9aevU
Веб-приложения становятся все больше и сложнее, так что многое остается вне нашего поля зрения. Поэтому фреймворки и приложения должны предоставлять дополнительные инструменты, упрощающие разработку и понимание того, что же происходит у них там — «под капотом». В ходе доклада я расскажу о таких инструментах: какими они могут быть, какие задачи решать, что необходимо для их создания.
SPA Meetup, 28 февраля 2015, Москва, Авито
Микросервисы, кто-то только слышал о них, кто-то пытался делать, кто-то уже использует в продакшене. Идеи, заложенные в концепцию микросервисов, не новы и основные постулаты уже звучали раньше. Так почему же в последнее время мы всё чаще слышим о микросервисах? Что такое микросервисы для нас и чем они отличаются от старого доброго подхода SOA? Как теперь разрабатывать enterprise-приложения с микросервисным подходом на нашем любимом языке программирования Java?
На эти и некоторые другие вопросы постараемся ответить во время встречи. Наши гости, Кирилл Толкачёв и Александр Тарасов, в режиме live coding попытаются создать небольшой стартап, попутно использовав новомодные подходы и инструменты.
На пути к релизу стартапа будут затронуты основные проблемы выбранных подходов в целом и технологий в частности:
Микросервис — что это, для чего и как с этим дальше жить. Где теория брат? ;)
На чём писать API: REST или RPC, и почему Thrift имеет право на жизнь в эпоху тотального распространения JSON-а. Упрощай и превозмогай с помощью Spring boot starter;
Какой стек выбрать для разработки, что выбрали мы и почему. Небольшое сравнение легковесных и не очень java фреймворков а так же сопутствующих инструментов;
Способы упаковки, дистрибуции и разворачивания микросервисов, как Spring Boot и Docker помогают нам в решении этих непростых для разработчика проблемах;
Как микросервисам найти друг друга, как готовить Spring Cloud и как обойти существующие проблемы и ограничения. Не доверяйте технологиям, доверяйте только себе;
API Gateway. Предохраняй и сохраняй свои микросервисы.
Так же речь пойдет о других распространенных проблемах распределенных систем и их решениях.
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Я.Субботник в Челябинске в рамках конференции UWDC
О докладе:
О чем нужно подумать во время проектирования архитектуры. Какую архитектуру нужно заложить, чтобы приложение могло безболезненно развиваться.
Deployment to production with an unexpected loadGrid Dynamics
In his talk, Max Mazur a DevOps Engineer at Grid Dynamics, shares his experience deploying to production despite unexpected loads using the example of the web application (RTB). There you can find specific cases of using MySQL and resolving solutions. Technology stack: Linux, MySQL, PHP, Nginx, Kafka, Redis, Gearman
Артём Кошелев: Прочная основа для автоматизации тестированияYandex
Каждый раз, начиная проект по автоматизации тестирования, вы делаете выбор. Вы выбираете технологии, инструменты, подходы к разработке и поддержке тестов. Я расскажу о том, какой выбор сделали мы и что из этого получилось.
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyDmytro Zharii
Мой доклад про создание читабельных отчетов для автоматизации тестирования на .NET/C# + Webdriver + Gallio Icarus/MbUnit + BDDfy
Доклад был сделан специально для онлайн конференции Auto ConfeT&QA, прошедшей в октябре 2012 года.
http://confetqa.ru/
======================================
См. также:
Gallio Icarus:
http://gallio.org
BDDfy – фреймворк для БыДиДификации кода :)
Страница проекта на Github:
http://teststack.github.com/TestStack.BDDfy/
Описание на английском:
http://www.mehdi-khalili.com/bddify-in-action/introduction
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
Работа с данными - это ключевая функция большинства приложений. Но работать с данными не так просто как кажется. С одной стороны, нам нужна производительность, с другой все best practices диктуют нам принцип persistence ignorance, с третьей еще и хочется писать красивый и понятный код. Как найти баланс между всем этим? Чем хороший IRepository отличается от плохого? Что такое CQRS и причем тут функциональное программирование? Об этом и пойдет речь, а так же немного граблей и личного опыта.
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014Dmytro Zharii
Демонстрация работы инструмента записи веб-элементов PageObject для Selenium WebDriver при помощи SWD Page Recorder. Демонстрация работы фреймворка SWD Starter Kit
Контроль качества высоконагруженных систем / Андрей Дроздов (Avito)Ontico
HighLoad++ 2017
Зал «Конгресс-Холл», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/2972.html
Разработка любого высоконагруженного сервиса не обходится без нагрузочных тестов. Во многих проектах процесс анализа работы системы под большой нагрузкой слабо структурирован или выполняется непосредственно в бою. Есть масса статьей и рецептов использования тех или иных инструментов, но самые важные вопросы не раскрыты до конца: что именно мы должны измерять, правильно ли мы интерпретируем результаты и как ловить баги, которые проявляются только под высокой нагрузкой.
...
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)Ontico
- WatchDog. Что это такое? Схема реализации с таймером и схема реализации на RunLoop'e.
- Как собирать результат работы WatchDog. Примеры того, что можно таким образом найти, и что мы нашли на проекте ICQ.
- Как работать с полученными результатами. Анализ стеков потоков. Профилирование с учетом расходов на синхронизацию.
- Проблемы при работе с WatchDog. Системные механизмы и популярные библиотеки, вызывающие проблемы. Методы обхода этих проблем. Итоговые параметры, применяемые на проекте ICQ.
Видео: https://www.youtube.com/watch?v=IUtbbN9aevU
Веб-приложения становятся все больше и сложнее, так что многое остается вне нашего поля зрения. Поэтому фреймворки и приложения должны предоставлять дополнительные инструменты, упрощающие разработку и понимание того, что же происходит у них там — «под капотом». В ходе доклада я расскажу о таких инструментах: какими они могут быть, какие задачи решать, что необходимо для их создания.
SPA Meetup, 28 февраля 2015, Москва, Авито
Микросервисы, кто-то только слышал о них, кто-то пытался делать, кто-то уже использует в продакшене. Идеи, заложенные в концепцию микросервисов, не новы и основные постулаты уже звучали раньше. Так почему же в последнее время мы всё чаще слышим о микросервисах? Что такое микросервисы для нас и чем они отличаются от старого доброго подхода SOA? Как теперь разрабатывать enterprise-приложения с микросервисным подходом на нашем любимом языке программирования Java?
На эти и некоторые другие вопросы постараемся ответить во время встречи. Наши гости, Кирилл Толкачёв и Александр Тарасов, в режиме live coding попытаются создать небольшой стартап, попутно использовав новомодные подходы и инструменты.
На пути к релизу стартапа будут затронуты основные проблемы выбранных подходов в целом и технологий в частности:
Микросервис — что это, для чего и как с этим дальше жить. Где теория брат? ;)
На чём писать API: REST или RPC, и почему Thrift имеет право на жизнь в эпоху тотального распространения JSON-а. Упрощай и превозмогай с помощью Spring boot starter;
Какой стек выбрать для разработки, что выбрали мы и почему. Небольшое сравнение легковесных и не очень java фреймворков а так же сопутствующих инструментов;
Способы упаковки, дистрибуции и разворачивания микросервисов, как Spring Boot и Docker помогают нам в решении этих непростых для разработчика проблемах;
Как микросервисам найти друг друга, как готовить Spring Cloud и как обойти существующие проблемы и ограничения. Не доверяйте технологиям, доверяйте только себе;
API Gateway. Предохраняй и сохраняй свои микросервисы.
Так же речь пойдет о других распространенных проблемах распределенных систем и их решениях.
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Я.Субботник в Челябинске в рамках конференции UWDC
О докладе:
О чем нужно подумать во время проектирования архитектуры. Какую архитектуру нужно заложить, чтобы приложение могло безболезненно развиваться.
Deployment to production with an unexpected loadGrid Dynamics
In his talk, Max Mazur a DevOps Engineer at Grid Dynamics, shares his experience deploying to production despite unexpected loads using the example of the web application (RTB). There you can find specific cases of using MySQL and resolving solutions. Technology stack: Linux, MySQL, PHP, Nginx, Kafka, Redis, Gearman
Одноклассники состоят из тысяч серверов, большая часть которых участвует в онлайн обработке запросов пользователей. Каждый из этих серверов владеет только частью данных или логики. Эти части в социальной сети изолировать друг от друга невозможно, поэтому между серверами происходит много сетевого взаимодействия, разнообразного и большого по объему. Таким образом, Одноклассники - это одна из самых больших, сложных и нагруженных распределенных систем в мире.
В этом докладе я расскажу об опыте построения отказоустойчивых распределенных систем на Java, основных ошибках и отказах, приемах их тестирования и диагностики. Также поговорим об авариях в распределенных системах и методах их предупреждения.
Любите ли вы велосипеды? Все разработчики любят свои ненаколеночныерешения велосипеды! И мы не исключение. В нашем докладе мы покажем как собирать, сколачивать, вылепливать собственный велосипед так, чтобы на нем потом могла ездить без слёз вся команда, компания, или может весь мир.
Что в докладе будет:
- много Spring Boot-а;
- live coding;
- создание собственного Spring Boot Starter-а;
- Apache Thrift в качестве подопытного кролика.
Чего не будет:
- бенчмарков и сравнений Thrift vs REST vs gRPC vs XXX.
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Badoo Development
Мы уже около 3-х лет используем HandlerSocket в нашей инфраструктуре сайта badoo.com. За это время мы накопили опыт решения характерных для Handlersocket проблем, появляющихся при использовании.
Несколько команд внутри Баду активно используют HS для решения разноплановых задач мобильных и настольных приложений Баду. Где-то мы используем HS как замену Memcached, где-то как простой поисковый механизм, где-то как хранилище типа ключ-значение. Наш HS-кластер содержит более 30 серверов, обрабатывая порядка 8000 запросов/сек.
Спикер также предоставляет написанный им код библиотеки-клиента для Handlersocket на PHP.
Про что доклад:
• что это вообще такое;
• чем является HS и чем не является;
• внутреннее устройство и работа HS;
• протокол;
• примеры использования в Баду, с цифрами и графиками;
• особенности: шардирование, Percona Server, постоянные соединения (бенефиты, проблемы и их решения), tips & tricks;
• полезные сслыки, ответы на FAQ.
Доклад рассчитан на highload-разработчиков, работающих с реляционными БД.
React со скоростью света: не совсем обычный серверный рендерингTimophy Chaptykov
Расскажу о небольшом исследовании, в котором мы думали о том, можем ли мы себе позволить использовать React для отдельных элементов на сайте, как устроен серверный рендеринг в VK; и получилось ли связать одно с другим. Упомяну о строковых шаблонизаторах, виртуальной DOM и LR-парсерах.
Поговорим о микрооптимизациях .NET-приложенийAndrey Akinshin
Доклад для Middle и Senior .NET-программистов о микроптимизациях приложения, из которого Вы узнаете:
О том, как важно понимать IL и ASM код, соответствующий вашей C#-программе;
О различных уровнях микрооптимизаций начиная от C# и JIT компиляторов, заканчивая CPU;
Об особенностях оптимизаций под различные процессорные архитектуры;
Об отличиях разных версиях JIT-компиляторов, включая RyuJIT;
О том, как правильно замерять время выполнения приложений и оценивать эффективность оптимизаций.
Доклад будет полезен всем разработчикам, которые хотят хотят сделать свои и без того быстрые программы ещё на 5-10% быстрее.
TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.TKConf
ESLint уже стал стандартом и большинство команд линтит JS. Но что с CSS? Андрей Ситник рассмотрит все линтеры для CSS. На примере Stylelint и Stylefmt покажет как линтер может повышать качество кода и решать социальные проблемы команды.
Случалось ли, что вы видели (чужой) код и хотели все переписать? Бывало такое, что вы не могли понять, почему кем-то было принято конкретное решение, не другое? Хотели ли вы воскликнуть:«А я бы сделал еще круче!»?
Если вы задумывались об этом, вам будет интересно послушать историю о том, как эти вопросы возникали у Александра и Кирилла и как они решались в условиях большой компании.
Разработчики расскажут, как в самом начале пути вытаскивали шашки и шли в атаку на проблемную архитектуру. Но все оказалось не так просто, и по мере погружения в проект парни стали понимать, что архитектура большой системы — компромисс между различными подходами и решениями, инновациями и легаси (наследованным кодом), централизацией и децентрализацией компонентов. Докладчики наработали очень много опыта в решении архитектурных задач и поделятся опытом и выработанными принципами, которых придерживаются в настоящее время.
Во время доклада будут обсуждаться непростые вопросы, возникающие при принятии решений о том, как будет жить и эволюционировать система.
Вместе со слушателями Александр и Кирилл проделают упражнение по созданию «таблицы технологий» и её эволюции. Также они покажут, насколько важно инженерное решение на любой из стадий развития системы.
Доклад от Parallels:
Методики тестировния производительности database-centric приложений
Описание: При работе над сложными продуктами в database-centric приложениях изменения в коде и тем более в SQL запросах к базе данных могут приводить к неожиданным падениям производительности или же деградации производительности приложения с ростом размера базы данных. Поэтому важно уметь как можно быстрее отлавливать и исправлять причины таких деградаций.
Доклад о том, как устроен процесс мониторинга производительности продукта автоматизации хостинга и облачных сервисов Parallels Automation, для которого определяющим фактором является производительность базы данных.
Компания покажет, как анализирует планы исполнения SQL запросов внутри PostgreSQL, как проверяет насколько быстро и эффективно в целом работают SQL запросы, как определяет стратегию дальнейшей оптимизации.
4. Как это бывает…
• используете SQLite
• протестировали и видите
проблемы
• заказчик видит проблемы и
просит улучшить
• не видит проблем и просит
улучшить
4
10. Что мы знаем о SQLite
«Классическая ошибка, которую совершают проектировщики абсолютно надежных
систем, - недооценка изобретательности клинических идиотов» Д.Адамс
9
16. SQLite API - Жизненный цикл
sqlite3_open
Создает конекшн к новой или существующей базе. Возвращает объект sqlite3.
(Конструктор).
14
17. SQLite API - Жизненный цикл
sqlite3_open
Создает конекшн к новой или существующей базе. Возвращает объект sqlite3.
(Конструктор).
sqlite3_prepare
Преобразовывает(компилирует) стринговый SQL запрос в бинарный объект -
sqlite3_stmt. (Конструктор).
14
18. SQLite API - Жизненный цикл
sqlite3_open
Создает конекшн к новой или существующей базе. Возвращает объект sqlite3.
(Конструктор).
sqlite3_prepare
Преобразовывает(компилирует) стринговый SQL запрос в бинарный объект -
sqlite3_stmt. (Конструктор).
sqlite3_bind Сохраняет данные в параметры выражения (Биндинг)
14
19. SQLite API - Жизненный цикл
sqlite3_open
Создает конекшн к новой или существующей базе. Возвращает объект sqlite3.
(Конструктор).
sqlite3_prepare
Преобразовывает(компилирует) стринговый SQL запрос в бинарный объект -
sqlite3_stmt. (Конструктор).
sqlite3_bind Сохраняет данные в параметры выражения (Биндинг)
sqlite3_step
Выполняет созданное выражение (sqlite3_stmt),
возвращает указатель на первую (и последующие при вызове) строки результата
14
20. SQLite API - Жизненный цикл
sqlite3_open
Создает конекшн к новой или существующей базе. Возвращает объект sqlite3.
(Конструктор).
sqlite3_prepare
Преобразовывает(компилирует) стринговый SQL запрос в бинарный объект -
sqlite3_stmt. (Конструктор).
sqlite3_bind Сохраняет данные в параметры выражения (Биндинг)
sqlite3_step
Выполняет созданное выражение (sqlite3_stmt),
возвращает указатель на первую (и последующие при вызове) строки результата
sqlite3_column
Возвращает значение столбца в выполненном выражении. «Абстрактный».
Используются - sqlite3_column_text(), sqlite3_column_int() …
14
21. SQLite API - Жизненный цикл
sqlite3_open
Создает конекшн к новой или существующей базе. Возвращает объект sqlite3.
(Конструктор).
sqlite3_prepare
Преобразовывает(компилирует) стринговый SQL запрос в бинарный объект -
sqlite3_stmt. (Конструктор).
sqlite3_bind Сохраняет данные в параметры выражения (Биндинг)
sqlite3_step
Выполняет созданное выражение (sqlite3_stmt),
возвращает указатель на первую (и последующие при вызове) строки результата
sqlite3_column
Возвращает значение столбца в выполненном выражении. «Абстрактный».
Используются - sqlite3_column_text(), sqlite3_column_int() …
sqlite3_finalize Деструктор выражения (sqlite3_stmt)
14
22. SQLite API - Жизненный цикл
sqlite3_open
Создает конекшн к новой или существующей базе. Возвращает объект sqlite3.
(Конструктор).
sqlite3_prepare
Преобразовывает(компилирует) стринговый SQL запрос в бинарный объект -
sqlite3_stmt. (Конструктор).
sqlite3_bind Сохраняет данные в параметры выражения (Биндинг)
sqlite3_step
Выполняет созданное выражение (sqlite3_stmt),
возвращает указатель на первую (и последующие при вызове) строки результата
sqlite3_column
Возвращает значение столбца в выполненном выражении. «Абстрактный».
Используются - sqlite3_column_text(), sqlite3_column_int() …
sqlite3_finalize Деструктор выражения (sqlite3_stmt)
sqlite3_close Закрывает соединение. Деструктор (sqlite3).
14
23. SQLite API - Настройки
sqlite3_config
• настройка выделения памяти
• логирования
• кеш
• threading model
• sqlite3_db_config - для конкретного соединения
15
24. SQLite API - Настройки
sqlite3_config
• настройка выделения памяти
• логирования
• кеш
• threading model
• sqlite3_db_config - для конкретного соединения
pragma
• изменение самой библиотеки или запросов к не табличным
данным
• нет обратной совместимости
• нет ошибок
• разный эффект на разных стадиях жизненного цикла
• можно применять к конкретному соединению
15
26. Amalgamation
• SQLite проект содержит более 100 отдельных
файлов
• Amalgamation - объединение всего, что нужно в
одном .c файле
• Содержит более 180000 строк кода и весит
более 6 MB
• Предназначен для кастомной сборки SQLite
17
30. Threading mode - режимы
Single-Thread
Не защищенный режим. Не используются никакие средства
синхронизации потоков. Работать более чем в одном потоке
не безопасно!
21
31. Threading mode - режимы
Single-Thread
Не защищенный режим. Не используются никакие средства
синхронизации потоков. Работать более чем в одном потоке
не безопасно!
Multi-Thread
Нельзя использовать несколько потоков для одного
соединения, но можно использовать отдельный поток для
каждого соединения.
21
32. Threading mode - режимы
Single-Thread
Не защищенный режим. Не используются никакие средства
синхронизации потоков. Работать более чем в одном потоке
не безопасно!
Multi-Thread
Нельзя использовать несколько потоков для одного
соединения, но можно использовать отдельный поток для
каждого соединения.
Serialized (default *)
Безопасный режим, но все запросы выполняются
последовательно.
21
43. Многопоточность
Для управления режимом - просто включите его
Только на этапе инициализации SQLite можно установить любой режим
Хороший тон - принудительная инициализация и выключение SQLite
sqlite3_initialize();
sqlite3_shutdown();
27
44. Тест 1 - Единое Соединение
Single-Thread NO
Multi-Thread NO
Serialized YES
28
45. Тест 1 - Единое Соединение
Single-Thread NO
Multi-Thread NO
Serialized YES
ConnectionSQLite
Thread 1
Thread 2
28
46. Тест 2 - Отдельные соединения
Single-Thread NO
Multi-Thread YES
Serialized YES
29
47. Тест 2 - Отдельные соединения
Thread 1
Connection 1
SQLite
Thread 2
Connection 2
Single-Thread NO
Multi-Thread YES
Serialized YES
29
48. Многопоточный доступ
Connection
Read-
Write
Thread Serialized Multi-Thread Single-Thread (!)
Single
R
1 OK
Crash Crash
2 OK
R-W
1 OK-OK
Crash Crash
2 OK-OK
Multi
R
1 OK OK OK (!)
2 OK OK OK (!)
R-W
1 OK-OK (OK-BUSY) OK-OK (OK-BUSY) OK-OK (OK-BUSY) (!)
2 OK-BUSY OK-BUSY OK-BUSY (!)
30
49. SQLite File Locking (classic*)
• механизм управления блокировкой и конкурентным доступом
• является главным инструментом реализации ACID
• напрямую связан с понятием транзакции
• устанавливается с помощью pragma locking_mode
SQLITE_BUSY - это все о нем
31
50. File Locking - modes
NORMAL
(по умолчанию)
sqlite3_exec(connection, "PRAGMA locking_mode=NORMAL", NULL,
NULL, NULL);
SQLite будет будет устанавливать (lock) и сбрасывать блокировку (unlock)
для каждой транзакции.
EXCLUSIVE
sqlite3_exec(connection, "PRAGMA locking_mode=EXCLUSIVE", NULL,
NULL, NULL);
SQLite заблокирует базу на все время жизни соединения.
Для временых («») и в памяти («:memory:») баз является единственно возможным
32
51. File Locking - обработка
sqlite3_busy_timeout
(connection, 1000)
SQLite будет пытаться получить доступ к ресурсу
(после SQLITE_BUSY) в течении интервала (mc)
sqlite3_busy_handler
(connection, &sqliteCallback,
NULL)
Определяемый каллбек вызывается при получении
SQLITE_BUSY.
Если каллбек возвращает 0, клиенту перенаправляется
SQLITE_BUSY, иначе SQLite снова пытается получить
доступ
33
52. Используем locking handlers
Connection
Read-
Write
Thread Serialized Multi-Thread Single-Thread (!)
Single
R
1 OK
Crash Crash
2 OK
R-W
1 OK-OK
Crash Crash
2 OK-OK
Multi
R
1 OK OK OK (!)
2 OK OK OK (!)
R-W
1 OK-OK OK-OK OK-OK (!)
2 OK-OK OK-OK OK-OK (OK-BUSY) (!)
34
55. SQLite Shared-Cache Mode
sqlite3_enable_shared_cache() *
*кроме Mac OSX 10.7 и iOS 5
Установка режима для ВСЕХ соединений базы
Mac OSX 10.7 и iOS 5
Параметр открытия соединения
SQLITE_OPEN_SHAREDCACHE - добавляет КОНКРЕТНОЕ
соединение в шаред кеш
Позволяет существенно уменьшить потребление
памяти для I/O операций
Отключен по умолчанию
Добавляет новую модель блокировки - «shared cache
locking model»
36
56. Shared-Cache Locking Model
Transaction Level
Locking
Запись - только ОДНА транзакция в один момент времени
Чтение - не ограничено
Table Level
Locking
Запись - только ОДИН (write-lock) для таблицы в один момент времени
Чтение - (read-lock) не ограничено
Serialized mode
(по умолчанию)
Данные синхронизированы с записью в таблицу. Чтение
вернет либо данные ДО записи, либо УЖЕ ПОСЛЕ записи.
Read-Uncommitted
mode
Данные НЕ синхронизированы с записью. Возможно
получение не консистентных данных !
PRAGMA read_uncommitted = <boolean>;
Schema Level
Locking
Поддерживает Table Level Locking с ограничениями *
37
63. Атомарный комит
• Во время транзакции изменения применяются полностью, либо
совсем не происходят
41
64. Атомарный комит
• Во время транзакции изменения применяются полностью, либо
совсем не происходят
• Rollback mode - стандартный режим реализации с временным
журналом
41
65. Атомарный комит
• Во время транзакции изменения применяются полностью, либо
совсем не происходят
• Rollback mode - стандартный режим реализации с временным
журналом
• WAL (write-ahead log) mode - новый режим с постоянным
журналом
41
68. Атомарный комит
1 Исходное состояние -
2 Запрос на чтение. BEGIN Shared Lock
3 Чтение
Reserved Lock 1
2
3
42
69. Атомарный комит
1 Исходное состояние -
2 Запрос на чтение. BEGIN Shared Lock
3 Чтение
Reserved Lock4 Создание журнала и запись в него изменений 1
2
34
42
70. Атомарный комит
1 Исходное состояние -
2 Запрос на чтение. BEGIN Shared Lock
3 Чтение
Reserved Lock4 Создание журнала и запись в него изменений
5 Запись журнала на диск.
1
2
345
42
71. Атомарный комит
1 Исходное состояние -
2 Запрос на чтение. BEGIN Shared Lock
3 Чтение
Reserved Lock4 Создание журнала и запись в него изменений
5 Запись журнала на диск.
6 Запись изменений в базу(в памяти)
Exclusive lock
1
2
3456
42
72. Атомарный комит
1 Исходное состояние -
2 Запрос на чтение. BEGIN Shared Lock
3 Чтение
Reserved Lock4 Создание журнала и запись в него изменений
5 Запись журнала на диск.
6 Запись изменений в базу(в памяти)
Exclusive lock7 Запись базы на диск
1
2
3456
7
42
73. Атомарный комит
1 Исходное состояние -
2 Запрос на чтение. BEGIN Shared Lock
3 Чтение
Reserved Lock4 Создание журнала и запись в него изменений
5 Запись журнала на диск.
6 Запись изменений в базу(в памяти)
Exclusive lock7 Запись базы на диск
8 Удаление журнала. COMMIT
1
2
3456
7
8
42
74. Атомарный комит
1 Исходное состояние -
2 Запрос на чтение. BEGIN Shared Lock
3 Чтение
Reserved Lock4 Создание журнала и запись в него изменений
5 Запись журнала на диск.
6 Запись изменений в базу(в памяти)
Exclusive lock7 Запись базы на диск
8 Удаление журнала. COMMIT
9 Исходное состояние с изменениями -
1
2
3456
7
89
42
77. Rollback
7 Hot journal Shared lock
8 Запись не выполненных изменений
Exclusive lock
7
8
44
78. Rollback
7 Hot journal Shared lock
8 Запись не выполненных изменений
Exclusive lock
9 Удаление журнала
7
8
9
44
79. Rollback
7 Hot journal Shared lock
8 Запись не выполненных изменений
Exclusive lock
9 Удаление журнала
10 Исходное состояние с изменениями -
7
8
9
10
44
82. Синхронизация транзакции
OFF
SQLite считает данные записанными сразу после передачи ОС, то
есть целостность данных зависит от работы системы.
NORMAL
Компромиссный режим при котором возможна маленькая
вероятность потери данных при креше системы
46
83. Синхронизация транзакции
OFF
SQLite считает данные записанными сразу после передачи ОС, то
есть целостность данных зависит от работы системы.
NORMAL
Компромиссный режим при котором возможна маленькая
вероятность потери данных при креше системы
FULL
(по умолчанию)
Гарантия целостности данных в любых ситуациях.
46
84. Синхронизация транзакции
OFF
SQLite считает данные записанными сразу после передачи ОС, то
есть целостность данных зависит от работы системы.
NORMAL
Компромиссный режим при котором возможна маленькая
вероятность потери данных при креше системы
FULL
(по умолчанию)
Гарантия целостности данных в любых ситуациях.
EXTRA Гарантия гарантии целостности в любых любых ситуациях
46
87. Режимы журнала
DELETE
(по умолчанию)
Журнал удаляется после транзакции
TRANCATE Журнал обрезается до нуля (может работать быстрее чем создание/удаление)
PERSIST Журнал заполняется нулями, размер не изменяется
47
88. Режимы журнала
DELETE
(по умолчанию)
Журнал удаляется после транзакции
TRANCATE Журнал обрезается до нуля (может работать быстрее чем создание/удаление)
PERSIST Журнал заполняется нулями, размер не изменяется
WAL
Постоянный журнал. Работает быстрее. Предпочтительный. Запись и чтение не
блокируют друг друга*
47
89. Режимы журнала
DELETE
(по умолчанию)
Журнал удаляется после транзакции
TRANCATE Журнал обрезается до нуля (может работать быстрее чем создание/удаление)
PERSIST Журнал заполняется нулями, размер не изменяется
WAL
Постоянный журнал. Работает быстрее. Предпочтительный. Запись и чтение не
блокируют друг друга*
MEMORY Журнал в оперативной памяти. Быстро но не надежно
47
90. Режимы журнала
DELETE
(по умолчанию)
Журнал удаляется после транзакции
TRANCATE Журнал обрезается до нуля (может работать быстрее чем создание/удаление)
PERSIST Журнал заполняется нулями, размер не изменяется
WAL
Постоянный журнал. Работает быстрее. Предпочтительный. Запись и чтение не
блокируют друг друга*
MEMORY Журнал в оперативной памяти. Быстро но не надежно
OFF Без журнала - без транзакций
47
92. WAL (Write-Ahead Logging)
Преимущества
Существенно быстрее
Писатели не блокируют читателей
Операции I/O более упорядочены
Меньше обращается к диску (fsync())
Недостатки
Не работает с распределенным доступом
(по сети)
Невозможно изменить размер страницы
( page_size )
Невозможно создать соединение только для
чтения
Может быть чуть медленней (1-2%), если в
основном происходит чтение
База имеет постоянные дополнительные файлы -
«-shm», «-wal»
Дополнительная операция - чекпоинт
(checkpoint)
48
93. WAL
Commit Checkpoint
Означает что изменения сохранились в журнал
Означает перенос изменений из журнала в файл
базы
Изменения попадают в файл базы только после
чекпоинта (checkpoint)
Автоматически - по значению порога журнала -
1000 страниц (~4Mb)
SQLITE_DEFAULT_WAL_AUTOCHECKPOINT
Порог авточекпоинта может быть изменен
PRAGMA wal_autocheckpoint=N;
Авточекпоинт может быть отключен
(PRAGMA wal_autocheckpoint=0),
тогда он должен выполнятся вручную
sqlite3_wal_checkpoint_v2()
49
95. 1 Исходное состояние
2
Получение валидного комита (wem0) ,
сохранение своего (rem1)
1
db
wal
shm
Writer
w0
Reader
wem0
2
db
wal
shm
Writer
w0
rem1
Reader
wem0
wem - writer end-markrem - reader end-mark w - comit-reader -writer
WAL - R/W
50
96. 1 Исходное состояние
2
Получение валидного комита (wem0) ,
сохранение своего (rem1)
3
Чтение от rem1 журнала и по всему файлу
базы
1
db
wal
shm
Writer
w0
Reader
wem0
2
db
wal
shm
Writer
w0
rem1
Reader
wem0
3
db
wal
shm
Writer
w0
rem1
Reader
wem0
wem - writer end-markrem - reader end-mark w - comit-reader -writer
WAL - R/W
50
97. 1 Исходное состояние
2
Получение валидного комита (wem0) ,
сохранение своего (rem1)
3
Чтение от rem1 журнала и по всему файлу
базы
4 Удаление своего rem1
1
db
wal
shm
Writer
w0
Reader
wem0
2
db
wal
shm
Writer
w0
rem1
Reader
wem0
3
db
wal
shm
Writer
w0
rem1
Reader
wem0
4
db
wal
shm
Writer
w0
rem1
Reader
wem0
wem - writer end-markrem - reader end-mark w - comit-reader -writer
WAL - R/W
50
98. 1 Исходное состояние
2
Получение валидного комита (wem0) ,
сохранение своего (rem1)
3
Чтение от rem1 журнала и по всему файлу
базы
4 Удаление своего rem1
5 Получение валидного комита (wem0)
1
db
wal
shm
Writer
w0
Reader
wem0
2
db
wal
shm
Writer
w0
rem1
Reader
wem0
3
db
wal
shm
Writer
w0
rem1
Reader
wem0
4
db
wal
shm
Writer
w0
rem1
Reader
wem0
5
db
wal
shm
Writer
w0
Reader
wem0
wem - writer end-markrem - reader end-mark w - comit-reader -writer
WAL - R/W
50
99. 1 Исходное состояние
2
Получение валидного комита (wem0) ,
сохранение своего (rem1)
3
Чтение от rem1 журнала и по всему файлу
базы
4 Удаление своего rem1
5 Получение валидного комита (wem0)
6 Запись изменений в журнал после w0
1
db
wal
shm
Writer
w0
Reader
wem0
2
db
wal
shm
Writer
w0
rem1
Reader
wem0
3
db
wal
shm
Writer
w0
rem1
Reader
wem0
4
db
wal
shm
Writer
w0
rem1
Reader
wem0
5
db
wal
shm
Writer
w0
Reader
wem0
6
db
wal
shm
Writer
w0
Reader
wem0
w1
wem - writer end-markrem - reader end-mark w - comit-reader -writer
WAL - R/W
50
100. 1 Исходное состояние
2
Получение валидного комита (wem0) ,
сохранение своего (rem1)
3
Чтение от rem1 журнала и по всему файлу
базы
4 Удаление своего rem1
5 Получение валидного комита (wem0)
6 Запись изменений в журнал после w0
7 Запись журнала w1 на диск
1
db
wal
shm
Writer
w0
Reader
wem0
2
db
wal
shm
Writer
w0
rem1
Reader
wem0
3
db
wal
shm
Writer
w0
rem1
Reader
wem0
4
db
wal
shm
Writer
w0
rem1
Reader
wem0
5
db
wal
shm
Writer
w0
Reader
wem0
6
db
wal
shm
Writer
w0
Reader
wem0
w1
7
db
wal
shm
Writer
w0
Reader
wem0
w1
wal disk
w1
wem - writer end-markrem - reader end-mark w - comit-reader -writer
WAL - R/W
50
101. 1 Исходное состояние
2
Получение валидного комита (wem0) ,
сохранение своего (rem1)
3
Чтение от rem1 журнала и по всему файлу
базы
4 Удаление своего rem1
5 Получение валидного комита (wem0)
6 Запись изменений в журнал после w0
7 Запись журнала w1 на диск
8
Обновление в shm последнего комита
(wem1). COMMIT
1
db
wal
shm
Writer
w0
Reader
wem0
2
db
wal
shm
Writer
w0
rem1
Reader
wem0
3
db
wal
shm
Writer
w0
rem1
Reader
wem0
4
db
wal
shm
Writer
w0
rem1
Reader
wem0
5
db
wal
shm
Writer
w0
Reader
wem0
6
db
wal
shm
Writer
w0
Reader
wem0
w1
7
db
wal
shm
Writer
w0
Reader
wem0
w1
wal disk
w1
8
db
wal
shm
Writer
w0
Reader
wem0
w1
wem1
wem - writer end-markrem - reader end-mark w - comit-reader -writer
WAL - R/W
50
102. 1 Исходное состояние
2
Получение валидного комита (wem0) ,
сохранение своего (rem1)
3
Чтение от rem1 журнала и по всему файлу
базы
4 Удаление своего rem1
5 Получение валидного комита (wem0)
6 Запись изменений в журнал после w0
7 Запись журнала w1 на диск
8
Обновление в shm последнего комита
(wem1). COMMIT
9 Исходное состояние с изменениями
1
db
wal
shm
Writer
w0
Reader
wem0
2
db
wal
shm
Writer
w0
rem1
Reader
wem0
3
db
wal
shm
Writer
w0
rem1
Reader
wem0
4
db
wal
shm
Writer
w0
rem1
Reader
wem0
5
db
wal
shm
Writer
w0
Reader
wem0
6
db
wal
shm
Writer
w0
Reader
wem0
w1
7
db
wal
shm
Writer
w0
Reader
wem0
w1
wal disk
w1
8
db
wal
shm
Writer
w0
Reader
wem0
w1
wem1
9
db
wal
shm
Writer
w0
Reader
wem1
w1
wem - writer end-markrem - reader end-mark w - comit-reader -writer
WAL - R/W
50
103. 1
Условие чекпоинта выполнено
(сразу после COMMIT или вручную)
1
db
wal
shm
Writer
w0
Reader
wem1
w1
rem2
}CL
WAL - checkpoint
wem - writer end-markrem - reader end-mark w - comit-reader -writer -checkpoint CL - checkpoint level51
104. 1
Условие чекпоинта выполнено
(сразу после COMMIT или вручную)
2
Перенос страниц из конца журнала в базу до
первого rem
1
db
wal
shm
Writer
w0
Reader
wem1
w1
rem2
}CL
2
db
wal
shm
Check
point
w0
Reader
wem1
w1
w1
rem2
WAL - checkpoint
wem - writer end-markrem - reader end-mark w - comit-reader -writer -checkpoint CL - checkpoint level51
105. 1
Условие чекпоинта выполнено
(сразу после COMMIT или вручную)
2
Перенос страниц из конца журнала в базу до
первого rem
3 Запись файла базы на диск
1
db
wal
shm
Writer
w0
Reader
wem1
w1
rem2
}CL
2
db
wal
shm
Check
point
w0
Reader
wem1
w1
w1
rem2
3
db
wal
shm
Check
point
w0
Reader
wem1
w1
w1
rem2
db disk
w1
WAL - checkpoint
wem - writer end-markrem - reader end-mark w - comit-reader -writer -checkpoint CL - checkpoint level51
106. 1
Условие чекпоинта выполнено
(сразу после COMMIT или вручную)
2
Перенос страниц из конца журнала в базу до
первого rem
3 Запись файла базы на диск
4
Обновление в shm последнего комита (wem1).
COMMIT
1
db
wal
shm
Writer
w0
Reader
wem1
w1
rem2
}CL
2
db
wal
shm
Check
point
w0
Reader
wem1
w1
w1
rem2
3
db
wal
shm
Check
point
w0
Reader
wem1
w1
w1
rem2
db disk
w1
4
db
wal
shm
Check
point
w0
Reader
wem1
w1
w1
rem2
wem0
WAL - checkpoint
wem - writer end-markrem - reader end-mark w - comit-reader -writer -checkpoint CL - checkpoint level51
107. 1
Условие чекпоинта выполнено
(сразу после COMMIT или вручную)
2
Перенос страниц из конца журнала в базу до
первого rem
3 Запись файла базы на диск
4
Обновление в shm последнего комита (wem1).
COMMIT
5 Исходное состояние с изменениями
1
db
wal
shm
Writer
w0
Reader
wem1
w1
rem2
}CL
2
db
wal
shm
Check
point
w0
Reader
wem1
w1
w1
rem2
3
db
wal
shm
Check
point
w0
Reader
wem1
w1
w1
rem2
db disk
w1
4
db
wal
shm
Check
point
w0
Reader
wem1
w1
w1
rem2
wem0
5
db
wal
shm
Check
point
w0
Reader
wem0
w1
rem2
WAL - checkpoint
wem - writer end-markrem - reader end-mark w - comit-reader -writer -checkpoint CL - checkpoint level51
109. WAL
Для ускорения чтения
как можно меньший журнал
(поиск end-mark зависит от размера) - то есть
делать чекпоинты
как можно чаще -
в идеале каждый комит
53
110. WAL
Для ускорения чтения
как можно меньший журнал
(поиск end-mark зависит от размера) - то есть
делать чекпоинты
как можно чаще -
в идеале каждый комит
Для ускорения записи
как можно дольше
не делать чекпоинт
(из-за дополнительного времени на перенос в
базу и двойной записи на диск)
53
114. WAL
1 Создаем базу SQLite
2 Меняем режим на WAL
3 Журнал пустой
4 Вносим изменения
54
115. WAL
1 Создаем базу SQLite
2 Меняем режим на WAL
3 Журнал пустой
4 Вносим изменения
5 Журнал активен (данные в
журнале, а не в файле базы)
54
116. Индексы и
планировщик запросов
SQLite Query Planner -
ИИ, который выбирает наилучший
способ выполнить запрос, и индексы
являются его главным инструментом
55
119. Поиск (SELECT)
Полное
сканирование
(Full Table Scan)
Полный перебор
Поиск по RowID
(Lookup By Rowid)
Бинарный поиск по таблице
Поиск по индексу
(Lookup By Index)
Бинарный поиск по индексу
+ бинарный поиск по
таблице
56
120. Поиск (SELECT)
Полное
сканирование
(Full Table Scan)
Полный перебор
Поиск по RowID
(Lookup By Rowid)
Бинарный поиск по таблице
Поиск по индексу
(Lookup By Index)
Бинарный поиск по индексу
+ бинарный поиск по
таблице
Покрытие индекса
(Covering Indices)
Бинарный поиск по индексу
56
123. Сортировка (ORDER BY)
Сортировка по
значению
«Сложная» сортировка
Сортировка по
RowID
Просто вывод
Сортировка по
индексу
«Простая» сортировка
57
124. Сортировка (ORDER BY)
Сортировка по
значению
«Сложная» сортировка
Сортировка по
RowID
Просто вывод
Сортировка по
индексу
«Простая» сортировка
Сортировка по
покрытому индексу Просто вывод
57
126. Индексы
• Замедляют операции изменений за
счет переиндексации (REINDEX)
Индекс - упорядоченная таблица, связанная с оригинальной
58
127. Индексы
• Замедляют операции изменений за
счет переиндексации (REINDEX)
• Могут быть частичными (Partial) - для
определенных строк
Индекс - упорядоченная таблица, связанная с оригинальной
58
128. Индексы
• Замедляют операции изменений за
счет переиндексации (REINDEX)
• Могут быть частичными (Partial) - для
определенных строк
• Могут быть уникальными (UNIQUE)
Индекс - упорядоченная таблица, связанная с оригинальной
58
129. Индексы
• Замедляют операции изменений за
счет переиндексации (REINDEX)
• Могут быть частичными (Partial) - для
определенных строк
• Могут быть уникальными (UNIQUE)
• Индекс по умолчанию - RowID
Индекс - упорядоченная таблица, связанная с оригинальной
58
130. Индексы
Не нужны, когда
Мало данных
Изменения в таблице происходят
намного чаще чем выборки
• Замедляют операции изменений за
счет переиндексации (REINDEX)
• Могут быть частичными (Partial) - для
определенных строк
• Могут быть уникальными (UNIQUE)
• Индекс по умолчанию - RowID
Индекс - упорядоченная таблица, связанная с оригинальной
58
131. Индексы
Не нужны, когда
Мало данных
Изменения в таблице происходят
намного чаще чем выборки
Плохо в качестве индекса, когда
Значения поля часто NULL
Значения поля часто меняется
• Замедляют операции изменений за
счет переиндексации (REINDEX)
• Могут быть частичными (Partial) - для
определенных строк
• Могут быть уникальными (UNIQUE)
• Индекс по умолчанию - RowID
Индекс - упорядоченная таблица, связанная с оригинальной
58
133. Таблицы без ROWID
• Если используются составные первичные
ключи
• Если первичный ключ - Integer (просто
дупликация)
• Если не хранятся большие строки или BLOB
• В целом - если размер таблиц - небольшой
( < 1/20 страницы )
МОГУТ повысить быстродействие и уменьшить размер
59
134. Таблицы без ROWID
• Обязаны иметь первичный
ключ!
• Автоинкремент не работает
• Первичный ключ не может
быть NULL
• Если используются составные первичные
ключи
• Если первичный ключ - Integer (просто
дупликация)
• Если не хранятся большие строки или BLOB
• В целом - если размер таблиц - небольшой
( < 1/20 страницы )
sqlite3_analyzer
МОГУТ повысить быстродействие и уменьшить размер
59
135. Full Text Search
60
Расширения (модули), позволяющие выполнять эффективный
полнотекстовый поиск, путем создания спец виртуальных таблиц
136. Full Text Search
60
Расширения (модули), позволяющие выполнять эффективный
полнотекстовый поиск, путем создания спец виртуальных таблиц
FTS3, FTS4 подключены по молчанию
137. Full Text Search
60
Расширения (модули), позволяющие выполнять эффективный
полнотекстовый поиск, путем создания спец виртуальных таблиц
FTS3, FTS4 подключены по молчанию
FTS4 более оптимизирована и производительна, но занимает больше
места в памяти
138. Full Text Search
60
Расширения (модули), позволяющие выполнять эффективный
полнотекстовый поиск, путем создания спец виртуальных таблиц
FTS3, FTS4 подключены по молчанию
FTS4 более оптимизирована и производительна, но занимает больше
места в памяти
При поиске для сравнения после WHERE используется терма MATCH
140. FTS - Tokenizer
Набор правил для выборки
simple
(по умолчанию)
Добавляет регистронезависимость
porter Алгоритм стемминга Портера (упр. - поиск по корню слова)
icu Учитывает локаль (пр. - icu uk_UA)
кастомный Реализуется используя интерфейс fts3_tokenizer.h
stop-word
Популярный токенайзер для исключения слов из выборки
(FMStopWordTokenizer)
61
141. FTS - использование
// 1 столбец - «content»
CREATE VIRTUAL TABLE data USING fts4();
// 2 кастомных столбца и токенайзер porter
CREATE VIRTUAL TABLE data USING fts4(title, keywords, tokenize=porter);
// вирт таблица просто ссылается на реальную
CREATE VIRTUAL TABLE IF NOT EXISTS fdocs
USING fts4(content="docs", name, tokenize=simple)
// запрос
SELECT name, composer FROM fdocs WHERE fdocs MATCH ‘nix’»
// перестройка fts таблицы (триггеров нет)
INSERT INTO fdocs(fdocs) VALUES('rebuild');
// оптимизация*
INSERT INTO fdocs(fdocs) VALUES('optimize');
62
142. JSON1 extension
• Сохраняет JSON как обычный текст
• Предоставляет функции для работы с JSON
• По умолчанию отсутствует
• Можно собрать SQLite c DSQLITE_ENABLE_JSON1
Перенос логики JSON обработки на SQLite уровень
63
145. Внешние ключи
PRAGMA foreign_keys = ON / OFF(по умолчанию);
ON DELETE, ON UPDATE
NO ACTION По умолчанию
RESTRICT Запрещает изменять (удалять) родительский ключ
64
146. Внешние ключи
PRAGMA foreign_keys = ON / OFF(по умолчанию);
ON DELETE, ON UPDATE
NO ACTION По умолчанию
RESTRICT Запрещает изменять (удалять) родительский ключ
SET NULL Значение дочернего ключа устанавливается в SQL NULL
64
147. Внешние ключи
PRAGMA foreign_keys = ON / OFF(по умолчанию);
ON DELETE, ON UPDATE
NO ACTION По умолчанию
RESTRICT Запрещает изменять (удалять) родительский ключ
SET NULL Значение дочернего ключа устанавливается в SQL NULL
SET DEFAULT Значение дочернего ключа устанавливается в значение по умолчанию
64
148. Внешние ключи
PRAGMA foreign_keys = ON / OFF(по умолчанию);
ON DELETE, ON UPDATE
NO ACTION По умолчанию
RESTRICT Запрещает изменять (удалять) родительский ключ
SET NULL Значение дочернего ключа устанавливается в SQL NULL
SET DEFAULT Значение дочернего ключа устанавливается в значение по умолчанию
CASCADE Обновляет значение дочернего ключа или удаляет все строку
64
149. Ограничения внешних ключей
immediate При ошибке сразу генерируется исключение (по умолчанию)
deferred
Исключение не генерируется пока не вызван COMMIT (при явной
транзакции!)
DEFERRABLE INITIALLY DEFERRED - при описании ключа
CREATE TABLE devs( devId INTEGER PRIMARY KEY, devName TEXT );
CREATE TABLE projects( projectId INTEGER, projectName TEXT, projectDev INTEGER,
FOREIGN KEY (projectDev) REFERENCES devs(devId) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED);
BEGIN;
INSERT INTO projects VALUES(1, 'TestSQLite', 5);
COMMIT;
-> SQL error: foreign key constraint failed
INSERT INTO devs VALUES(5, 'Marvin’);
COMMIT;
65
150. Новый планировщик (NGQP)
GGQP (SQLite 3.8) всегда может найти такой же или
лучший план
ANALYZE собирая статистику, позволяет выбрать
лучший план
66
151. Новый планировщик (NGQP)
GGQP (SQLite 3.8) всегда может найти такой же или
лучший план
ANALYZE собирая статистику, позволяет выбрать
лучший план
SQLite гарантирует «СТАБИЛЬНОСТЬ»
Один и тот же план при неизменных условиях:
- неизменность схемы, индексов
- не использования ANALYZE
66
153. Лучший план (NGQP)
2 Используйте индексы
В большинстве случаев индексы позволяют повысить
быстродействие
68
154. Лучший план (NGQP)
2 Используйте индексы
В большинстве случаев индексы позволяют повысить
быстродействие
3
Не создавайте low-quality
индексы
Low-quality индексы - которые повторяются 10-20 и более
раз. Также, когда значение индекса - enum, bool
68
155. Лучший план (NGQP)
2 Используйте индексы
В большинстве случаев индексы позволяют повысить
быстродействие
3
Не создавайте low-quality
индексы
Low-quality индексы - которые повторяются 10-20 и более
раз. Также, когда значение индекса - enum, bool
4
Если таки используете low-
quality индексы - запускайте
ANALYZE
ANALYZE sqlite_master вначале использования позволит
собирать статистику
68
156. Лучший план (NGQP)
2 Используйте индексы
В большинстве случаев индексы позволяют повысить
быстродействие
3
Не создавайте low-quality
индексы
Low-quality индексы - которые повторяются 10-20 и более
раз. Также, когда значение индекса - enum, bool
4
Если таки используете low-
quality индексы - запускайте
ANALYZE
ANALYZE sqlite_master вначале использования позволит
собирать статистику
5 Используйте инструменты Измеряйте!
68
157. Лучший план (NGQP)
2 Используйте индексы
В большинстве случаев индексы позволяют повысить
быстродействие
3
Не создавайте low-quality
индексы
Low-quality индексы - которые повторяются 10-20 и более
раз. Также, когда значение индекса - enum, bool
4
Если таки используете low-
quality индексы - запускайте
ANALYZE
ANALYZE sqlite_master вначале использования позволит
собирать статистику
5 Используйте инструменты Измеряйте!
6
Специальные решения и
функции - последний довод
INDEXED BY, unary «+», unlikely() и др. - могут оказаться
преждевременной оптимизацией !
68
164. VACUUM
Перестраивает файл базы - аналог дефрагментации
Во время вакумирования, копирует весь контент во временную базу,
после чего перезаписывает оригинальный файл. Размер занимаемого
пространства увеличивается вдвое
74
165. VACUUM
Перестраивает файл базы - аналог дефрагментации
Во время вакумирования, копирует весь контент во временную базу,
после чего перезаписывает оригинальный файл. Размер занимаемого
пространства увеличивается вдвое
Может изменить RowID, если они нигде явно не используются
74
166. VACUUM
Перестраивает файл базы - аналог дефрагментации
Во время вакумирования, копирует весь контент во временную базу,
после чего перезаписывает оригинальный файл. Размер занимаемого
пространства увеличивается вдвое
Может изменить RowID, если они нигде явно не используются
Не выполнится, если происходит транзакция
74
167. VACUUM
Перестраивает файл базы - аналог дефрагментации
Во время вакумирования, копирует весь контент во временную базу,
после чего перезаписывает оригинальный файл. Размер занимаемого
пространства увеличивается вдвое
Может изменить RowID, если они нигде явно не используются
Не выполнится, если происходит транзакция
Для WAL ничего не произойдет (
74
168. pragma auto_vacuum
NONE (0)
(по умолчанию)
Задается на этапе компиляции
SQLITE_DEFAULT_AUTOVACUUM.
FULL (1) Выполняется при каждом комите.
INCREMENTAL (2)
Используется вместе с
pragma incremental_vacuum(N)
N - количество страниц необходимых для выполнения
Не является VACUUM в автоматическом режиме !
Пустые страницы перемещаются в конец файла и затем файл
базы обрезается.
Для смены режима по умолчанию
нужно выполнить настоящий VACUUM
75
173. Progress handling
sqlite3_progress_handler(sqlite3* D, int N, int(*X)(void*), void* P);
D Соединение
N
Скважность - количество машинных
инструкций относительно вызова
каллбека
X
Каллбек. Установка в NULL или
возврат каллбека < 1 - отключает
обработчик
P Передаваемый параметр
77
175. Trace hook
int sqlite3_trace_v2(sqlite3* D, unsigned M,
int(*X)(unsigned TC,void* CC,void* PP,void* XP), void *P);
D Соединение
M
SQLITE_TRACE_STMT Когда готово и запускается выражение (sqlite3_stmt)
SQLITE_TRACE_PROFILE На каждом шаге выполнения (sqlite3_step)
SQLITE_TRACE_ROW Когда создается строка вывода (SELECT)
SQLITE_TRACE_CLOSE Когда закрывается соединение
X Каллбек
P Передаваемый параметр
78
176. Trace hook callback
int(*X)(unsigned T,void* C,void* P,void* X)
T SQLITE_TRACE_STMT SQLITE_TRACE_PROFILE SQLITE_TRACE_ROW SQLITE_TRACE_CLOSE
C Передаваемый параметр
P sqlite3_stmt sqlite3
X «SQL» длительность, ns -
79
183. Попытка оптимизировать базу
Фактически выполняет ANALYZE для таблиц*
Вызывать перед каждым закрытием соединения
или же через каждые 2 часа для длительных
соединений
pragma OPTIMIZE
SQLite советует:
81
185. Explain query - результат
select
id
уровень вложенности запроса
order порядок сортировки
from
позиция в FROM выражении для каждого
SELECT совпадения (имеет смысл для
многотабличных запросов)
detail
SCAN • имя таблицы
• использование индексов
(автоиндексы)
• покрытие индекса
• какое выражение WHERE
используется для индекса
SEARCH
83
186. Explain query - результат
select
id
уровень вложенности запроса
order порядок сортировки
from
позиция в FROM выражении для каждого
SELECT совпадения (имеет смысл для
многотабличных запросов)
detail
SCAN • имя таблицы
• использование индексов
(автоиндексы)
• покрытие индекса
• какое выражение WHERE
используется для индекса
SEARCH
SCAN Полный перебор, медленно
83
187. Explain query - результат
select
id
уровень вложенности запроса
order порядок сортировки
from
позиция в FROM выражении для каждого
SELECT совпадения (имеет смысл для
многотабличных запросов)
detail
SCAN • имя таблицы
• использование индексов
(автоиндексы)
• покрытие индекса
• какое выражение WHERE
используется для индекса
SEARCH
SCAN Полный перебор, медленно
SEARCH
USING INDEX
Используется индекс, но
данные в оригинальной
таблице, хорошо
83
188. Explain query - результат
select
id
уровень вложенности запроса
order порядок сортировки
from
позиция в FROM выражении для каждого
SELECT совпадения (имеет смысл для
многотабличных запросов)
detail
SCAN • имя таблицы
• использование индексов
(автоиндексы)
• покрытие индекса
• какое выражение WHERE
используется для индекса
SEARCH
SCAN Полный перебор, медленно
SEARCH
USING INDEX
Используется индекс, но
данные в оригинальной
таблице, хорошо
SEARCH
USING
COVERING
INDEX
Данные уже в таблице с
индексом, максимально
быстро
83
189. Explain query - результат
select
id
уровень вложенности запроса
order порядок сортировки
from
позиция в FROM выражении для каждого
SELECT совпадения (имеет смысл для
многотабличных запросов)
detail
SCAN • имя таблицы
• использование индексов
(автоиндексы)
• покрытие индекса
• какое выражение WHERE
используется для индекса
SEARCH
SCAN Полный перебор, медленно
SEARCH
USING INDEX
Используется индекс, но
данные в оригинальной
таблице, хорошо
SEARCH
USING
COVERING
INDEX
Данные уже в таблице с
индексом, максимально
быстро
USE TEMP
B-TREE
Пост обработка (пр. - group
by), обычно медленно - лучше
сделать индекс
83
193. ДБ Профайлер
• Профайлер собирает информацию по
калбекам запрошенных данных (тип
запроса, жизненный цикл)
• Отправляются сигналы для использования
в Instruments (Points of Interests)
• Вывод данных реализован в виде
графиков
Хочется -
[FMDatabase startProfile];
[FMDatabase stopProfile];
Подключение через категорию FMDatabase,
где свайзлится на класс наследника и
переопределяются методы выполнения
86
213. Trace
Explain query
Есть явные проблемы в
конкретных запросах ?
Да
Нет, но
все плохо
Используем индексы,
запросы и транзакции, FK,
WithoutRowId, SQL, FTS …
Не помогло /
Хочу еще ?
Да
Нет,
доволен
Меняем логику
(место) работы,
архитектуру
(нормализация и де…,
запросы и транзакции …)
Нет, все
супер
2
97
214. Trace
Explain query
Есть явные проблемы в
конкретных запросах ?
Да
Нет, но
все плохо
Используем индексы,
запросы и транзакции, FK,
WithoutRowId, SQL, FTS …
Не помогло /
Хочу еще ?
Да
Нет,
доволен
Меняем логику
(место) работы,
архитектуру
(нормализация и де…,
запросы и транзакции …)
Режимы журналов
Auto/manual checkpoint
Shared Cache
Page size
Amalgamation …
Нет, все
супер
2
1
97