PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...pgdayrussia
Доклад был представлен на официальной российской конференции PG Day'14 Russia, посвященной вопросам разработки и эксплуатации PostgreSQL.
Уникальный семинар от опытного "базиста" Ивана Фролкова призван наглядно пояснить слушателям адекватность применения реляционных СУБД на задачах веба. В рамках доклада Иван рассмотрит типичные "грабли", на которые натыкаются разработчики, и субоптимальные решения, изобретаемые с целью побороть возникшие проблемы. В качестве альтернативы, коллега Фролков наглядно пояснит, как эти же задачи решаются штатными средствами PostgreSQL.
В качестве бонуса Иван — "ветеран" промышленной разработки ПО для реляционных СУБД — проведет краткий ликбез по рекомендуемым практикам построения SQL-запросов и программирования на языке PL/PGSQL.
Презентация со встречи сообщества SPb Python Interest Group рассказывающая об устройстве словарей в Python.
В презентации рассмотрена работа словаря в CPython 2.x, словаря в CPython 3.x, а также рассмотрены изменения в CPython 3.6.
Помимо CPython рассмотрены версии словаря в альтернативных реализациях Python, таких как PyPy, IronPython и Jython.
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
Синтаксис объявления функций. Упаковка и распаковка аргументов. Ключевые аргументы и аргументы по умолчанию. Распаковка и оператор присваивания. Области видимости, правило LEGB, операторы global и nonlocal. Функциональное программирование, анонимные функции. Функции map, filter и zip. Генераторы списков, множеств и словарей. Немного о PEP 8.
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...pgdayrussia
Доклад был представлен на официальной российской конференции PG Day'14 Russia, посвященной вопросам разработки и эксплуатации PostgreSQL.
Уникальный семинар от опытного "базиста" Ивана Фролкова призван наглядно пояснить слушателям адекватность применения реляционных СУБД на задачах веба. В рамках доклада Иван рассмотрит типичные "грабли", на которые натыкаются разработчики, и субоптимальные решения, изобретаемые с целью побороть возникшие проблемы. В качестве альтернативы, коллега Фролков наглядно пояснит, как эти же задачи решаются штатными средствами PostgreSQL.
В качестве бонуса Иван — "ветеран" промышленной разработки ПО для реляционных СУБД — проведет краткий ликбез по рекомендуемым практикам построения SQL-запросов и программирования на языке PL/PGSQL.
Презентация со встречи сообщества SPb Python Interest Group рассказывающая об устройстве словарей в Python.
В презентации рассмотрена работа словаря в CPython 2.x, словаря в CPython 3.x, а также рассмотрены изменения в CPython 3.6.
Помимо CPython рассмотрены версии словаря в альтернативных реализациях Python, таких как PyPy, IronPython и Jython.
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
Синтаксис объявления функций. Упаковка и распаковка аргументов. Ключевые аргументы и аргументы по умолчанию. Распаковка и оператор присваивания. Области видимости, правило LEGB, операторы global и nonlocal. Функциональное программирование, анонимные функции. Функции map, filter и zip. Генераторы списков, множеств и словарей. Немного о PEP 8.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
Измерение времени работы кода на Python с помощью модулей timeit, cProfile и line_profiler. Немного о NumPy. JIT и AOT компиляция кода на Python на примере Numba и Cython.
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Лекция 4. Строки, байты, файлы и ввод/вывод.Roman Brovko
Строковые литералы и сырые строки. Строки и Юникод. Основные методы работы со строками. Модуль string. Байты. Кодировки. Файлы и файловые объекты. Методы работы с файлами. Модуль io
Лекция 8. Итераторы, генераторы и модуль itertools.Roman Brovko
Два протокола итераторов: __next__ + __iter__ и __getitem__. Итераторы и цикл for, а также операторы in и not in. Генераторы, оператор-выражение yield. Генераторы как: итераторы, сопрограммы, менеджеры контекста. Модуль itertools.
Модули threading, queue и concurrent.futures. Использование потоков для параллельных вычислений на Python. GIL. Параллельность и конкурентность. Модуль asyncio. Модуль multiprocessing.
Лекция 5. Встроенные коллекции и модуль collections.Roman Brovko
И снова встроенные коллекции: кортеж, список, множество, словарь - обход в глубину, обзор методов, примеры. Почти всё про модуль collections: именованные кортежи, счётчики, defaultdict, OrderedDict.
Докладчик: Данил Руденко
О докладе:
У нашего зоопарка опять проблемы, которые необходимо решить максимально технологично!
На первом докладе мы поговорили о сверточных нейронных сетях, в этот раз рассмотрим такие виды нейронных сетей как автоэнкодеры и GAN’ы( генеративные состязательные сети). Также углубимся немного в Keras, напишем кастомный загрузчик данных и немного посмотрим на Jupyter Notebook.
Видео: https://youtu.be/tu-ee_4uAGY
Зачем тестировать? Тестирование в интерпретаторе и доктесты. Модуль unittest. Пакет py.test - на порядок лучше. Тестирование свойств и пакет hypothesis.
Докладчик: Данил Руденко
О докладе:
По некоторым оценкам, больше половины профессий будет автоматизировано – это и есть максимальный объём, на который может быть увеличен рынок алгоритмов машинного обучения, ярчайшем представителем которого являются нейронные сети.
В докладе мы поговорим об общей концепции нейронных сетей, рассмотрим основные Python - фреймворки для машинного обучения, а также реализуем решение задачи классификации изображений с применением Keras.
Вводная лекция в язык C#, для тех кто знает программирование и в особенности C++. В статье будет уделено внимание наиболее важным отличиям языков, будут обсуждаться вопросы производительности и эффективного кода.
Другие интересные статьи по C# ищите тут: http://itw66.ru/blog/c_sharp/
Написание компактного и эффективного кода в C#: http://itw66.ru/blog/c_sharp/520.html
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...pgdayrussia
Доклад был представлен на официальной российской конференции PG Day'14 Russia, посвященной вопросам разработки и эксплуатации PostgreSQL.
Уникальный семинар от опытного "базиста" Ивана Фролкова призван наглядно пояснить слушателям адекватность применения реляционных СУБД на задачах веба. В рамках доклада Иван рассмотрит типичные "грабли", на которые натыкаются разработчики, и субоптимальные решения, изобретаемые с целью побороть возникшие проблемы. В качестве альтернативы, коллега Фролков наглядно пояснит, как эти же задачи решаются штатными средствами PostgreSQL.
В качестве бонуса Иван — "ветеран" промышленной разработки ПО для реляционных СУБД — проведет краткий ликбез по рекомендуемым практикам построения SQL-запросов и программирования на языке PL/PGSQL.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
Измерение времени работы кода на Python с помощью модулей timeit, cProfile и line_profiler. Немного о NumPy. JIT и AOT компиляция кода на Python на примере Numba и Cython.
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Лекция 4. Строки, байты, файлы и ввод/вывод.Roman Brovko
Строковые литералы и сырые строки. Строки и Юникод. Основные методы работы со строками. Модуль string. Байты. Кодировки. Файлы и файловые объекты. Методы работы с файлами. Модуль io
Лекция 8. Итераторы, генераторы и модуль itertools.Roman Brovko
Два протокола итераторов: __next__ + __iter__ и __getitem__. Итераторы и цикл for, а также операторы in и not in. Генераторы, оператор-выражение yield. Генераторы как: итераторы, сопрограммы, менеджеры контекста. Модуль itertools.
Модули threading, queue и concurrent.futures. Использование потоков для параллельных вычислений на Python. GIL. Параллельность и конкурентность. Модуль asyncio. Модуль multiprocessing.
Лекция 5. Встроенные коллекции и модуль collections.Roman Brovko
И снова встроенные коллекции: кортеж, список, множество, словарь - обход в глубину, обзор методов, примеры. Почти всё про модуль collections: именованные кортежи, счётчики, defaultdict, OrderedDict.
Докладчик: Данил Руденко
О докладе:
У нашего зоопарка опять проблемы, которые необходимо решить максимально технологично!
На первом докладе мы поговорили о сверточных нейронных сетях, в этот раз рассмотрим такие виды нейронных сетей как автоэнкодеры и GAN’ы( генеративные состязательные сети). Также углубимся немного в Keras, напишем кастомный загрузчик данных и немного посмотрим на Jupyter Notebook.
Видео: https://youtu.be/tu-ee_4uAGY
Зачем тестировать? Тестирование в интерпретаторе и доктесты. Модуль unittest. Пакет py.test - на порядок лучше. Тестирование свойств и пакет hypothesis.
Докладчик: Данил Руденко
О докладе:
По некоторым оценкам, больше половины профессий будет автоматизировано – это и есть максимальный объём, на который может быть увеличен рынок алгоритмов машинного обучения, ярчайшем представителем которого являются нейронные сети.
В докладе мы поговорим об общей концепции нейронных сетей, рассмотрим основные Python - фреймворки для машинного обучения, а также реализуем решение задачи классификации изображений с применением Keras.
Вводная лекция в язык C#, для тех кто знает программирование и в особенности C++. В статье будет уделено внимание наиболее важным отличиям языков, будут обсуждаться вопросы производительности и эффективного кода.
Другие интересные статьи по C# ищите тут: http://itw66.ru/blog/c_sharp/
Написание компактного и эффективного кода в C#: http://itw66.ru/blog/c_sharp/520.html
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...pgdayrussia
Доклад был представлен на официальной российской конференции PG Day'14 Russia, посвященной вопросам разработки и эксплуатации PostgreSQL.
Уникальный семинар от опытного "базиста" Ивана Фролкова призван наглядно пояснить слушателям адекватность применения реляционных СУБД на задачах веба. В рамках доклада Иван рассмотрит типичные "грабли", на которые натыкаются разработчики, и субоптимальные решения, изобретаемые с целью побороть возникшие проблемы. В качестве альтернативы, коллега Фролков наглядно пояснит, как эти же задачи решаются штатными средствами PostgreSQL.
В качестве бонуса Иван — "ветеран" промышленной разработки ПО для реляционных СУБД — проведет краткий ликбез по рекомендуемым практикам построения SQL-запросов и программирования на языке PL/PGSQL.
Презентация для JuJa вебинара о том, как писать рекурсивные программы с примером о вычислении факториала и чисел Фибоначчи. Также рассказывается о поиске линейном, бинарном, в глубину и в ширину, как работает поисковая система.
Презентация сделана для новичков в деле программистов.
Поговорим о рефлексии в C++, о том, что это такое, для чего нужно и почему это вообще важно. На практическом примере с котами рассмотрим эволюцию подходов к рефлексии в рамках разных версий языка: C++03, C++11/14, C++17. Посмотрим на то, что для нас готовят разработчики нового стандарта, узнаем где и как можно "пощупать" эти новые возможности. Поделимся полезными утилитами и подходами, которые облегчат жизнь пока эти новые возможности не придут к вам на проект.
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
2 июля 2011, Я.Субботник в Екатеринбурге
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
О докладе:
Про Python и Django: зачем нужна красота и простота перфекционистам с дедлайнами, на примере Яндекс.Погоды.
Когда число сервисов, которые делаются в Яндексе, стало возрастать, дедлайны — поджимать, а от процесса разработки требовалось стать более гибким, возникла потребность в свежих решениях. В докладе на примере Яндекс.Погоды рассказывается, как в Яндексе делают сервисы с помощью языка Python и веб-фреймворка Django.
ЛЕКЦИЯ 4. Стандарт POSIX Threads. Реентерабельность функций. Обработка сигналов. Локальные данные потоков. Принудительное завершение потоков. Шаблоны программирования с использованием потоков
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/2964.html
Одноклассники состоят из более чем восьми тысяч железных серверов, расположенных в нескольких дата-центрах. Каждая из этих машин была специализированной под конкретную задачу - как для обеспечения изоляции отказов, так и для обеспечения автоматизированного управления инфраструктурой.
...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/3032.html
Протокол DNS на семь лет старше, чем Всемирная паутина. Стандарты RFC 882 и 883, определяющие основную функциональность системы доменных имён, появились в конце 1983 года, а первая реализация последовала уже годом позже. Естественно, что у технологии столь старой и при этом по сей день активнейшим образом используемой просто не могли не накопиться особенности, неочевидные обыкновенным пользователям.
...
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/3010.html
В этом докладе я расскажу, как BigData-платформа помогает трансформировать Почту России, как мы управляем построением и развитием платформы. Расскажу про найденные удачные решения, например, как разбиение на продукты с понятными SLA и интерфейсами между ними помогло нам сохранять управляемость с ростом масштабов проекта.
...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/2914.html
Казалось бы, что нужно для организации тестового окружения? Тестовая железка и копия боевого окружения - и тестовый сервер готов. Но как быть, когда проект сложный? А когда большой? А если нужно тестировать одновременно много версий? А если все это вместе?
Организация тестирования большого развивающегося проекта, где одновременно в разработке и тестировании около полусотни фич - достаточно непростая задача. Ситуация обычно осложняется тем, что иногда есть желание потрогать еще не полностью готовый функционал. В таких ситуациях часто возникает вопрос: "А куда это можно накатить и где покликать?"
...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2854.html
Из этого доклада вы узнаете о возможностях репликации и автофейловера PostgreSQL, в том числе о возможностях, ставших доступных в PostgreSQL 10.
Среди прочих, будет затронуты следующие темы:
* Виды репликации и решаемые с ее помощью проблемы.
* Настройка потоковой репликации.
* Настройка логической репликации.
* Настройка автофейловера / HA средствами Stolon и Consul.
После прослушивания доклада вы сможете самостоятельно настраивать репликацию и автофейловер PostgreSQL.
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 17:00
Тезисы:
http://www.highload.ru/2017/abstracts/3096.html
PostgreSQL is the world’s most advanced open source database. Indeed! With around 270 configuration parameters in postgresql.conf, plus all the knobs in pg_hba.conf, it is definitely ADVANCED!
How many parameters do you tune? 1? 8? 32? Anyone ever tuned more than 64?
No tuning means below par performance. But how to start? Which parameters to tune? What are the appropriate values? Is there a tool --not just an editor like vim or emacs-- to help users manage the 700-line postgresql.conf file?
Join this talk to understand the performance advantages of appropriately tuning your postgresql.conf file, showcase a new free tool to make PostgreSQL configuration possible for HUMANS, and learn the best practices for tuning several relevant postgresql.conf parameters.
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/3115.html
During this session we will cover the last development in ProxySQL to support regular expressions (RE2 and PCRE) and how we can use this strong technique in correlation with ProxySQL's query rules to anonymize live data quickly and transparently. We will explain the mechanism and how to generate these rules quickly. We show live demo with all challenges we got from the Community and we finish the session by an interactive brainstorm testing queries from the audience.
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/2957.html
Расскажем о нашем опыте разработки модуля межсетевого экрана для MySQL с использованием генератора парсеров ANTLR и языка Kotlin.
Подробно рассмотрим следующие вопросы:
— когда и почему целесообразно использовать ANTLR;
— особенности разработки ANTLR-грамматики для MySQL;
— сравнение производительности рантаймов для ANTLR в рамках задачи синтаксического анализа MySQL (C#, Java, Kotlin, Go, Python, PyPy, C++);
— вспомогательные DSL;
— микросервисная архитектура модуля экранирования SQL;
— полученные результаты.
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/3114.html
ProxySQL aims to be the most powerful proxy in the MySQL ecosystem. It is protocol-aware and able to provide high availability (HA) and high performance with no changes in the application, using several built-in features and integration with clustering software. During this session we will quickly introduce its main features, so to better understand how it works. We will then describe multiple use case scenarios in which ProxySQL empowers large MySQL installations to provide HA with zero downtime, read/write split, query rewrite, sharding, query caching, and multiplexing using SSL across data centers.
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/2954.html
MySQL Replication is powerful and has added a lot of advanced features through the years. In this presentation we will look into replication technology in MySQL 5.7 and variants focusing on advanced features, what do they mean, when to use them and when not, Including.
When should you use STATEMENT, ROW or MIXED binary log format?
What is GTID in MySQL and MariaDB and why do you want to use them?
What is semi-sync replication and how is it different from lossless semi-sync?
...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/3120.html
Количество разработчиков мобильных приложений Сбербанк Онлайн с начала 2016 года выросло на порядок. Для того чтобы продолжать выпускать качественный продукт, мы кардинально перестраиваем процесс разработки.
Количество внутренних заказчиков тех или иных доработок в какой-то момент выросло настолько, что разработчики стали узким местом. Мы внедрили культуру разработки, которую можно условно назвать "внутренним open-source", сохранив за собой контроль над архитектурой и качеством проекта, но позволив разрабатывать новые фичи всем желающим.
...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2836.html
При использовании Eventually Consistent распределенных баз данных нет гарантий, что чтение возвращает результаты последних изменений данных, если чтение и запись производятся на разных узлах. Это ограничивает пропускную способность системы. Поддержка свойства Causal Consistency снимает это ограничение, что позволяет улучшить масштабируемость, не требуя изменений в коде приложения.
...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/2858.html
Аудитория Одноклассников превышает 73 миллиона человек в России, СНГ и странах дальнего зарубежья. При этом ОК.ru - первая социальная сеть по просмотрам видео в рунете и крупнейшая сервисная платформа.
Качественный и количественный рост DDoS-атак за последние годы превращает их в одну из первоочередных проблем для крупнейших интернет-ресурсов. В зависимости от вектора атаки “узким” местом становится та или иная часть инфраструктуры. В частности, при SYN-flood первый удар приходится на систему балансировки трафика. От ее производительности зависит успех в противостоянии атаке.
...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/3008.html
Никогда не было и вот снова случилось! Компания Google в результате перенаправления трафика сделала недостпуными в Японии несколько тысяч различных сервисов, большинство из которых никак не связано с самой компанией Google. Однако, подобные инциденты происходят с завидной регулярностью, вот только не всегда попадают в большие СМИ. У таких инцидентов могут быть разные причины, начиная от ошибок сетевых инженеров и заканчивая государственным регулированием.
...
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/2925.html
Облака и виртуализация – современные тренды развития IT-технологий. Операторы связи строят свои TelcoClouds на стандартах NFV (Network Functions Virtualization) и SDN (Software-Defined Networking). В докладе начнем с основ виртуализации, далее разберемся, для чего используются NFV и SDN, потом полетим к облакам и вернемся на землю для решения практических задач!
...
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/3045.html
Как мы заставили Druid работать в Одноклассниках.
«Druid is a high-performance, column-oriented, distributed data store» http://druid.io.
Мы расскажем о том, как, внедрив Druid, мы справились с ситуацией, когда MSSQL-based система статистики на 50 терабайт стала:
- медленной: средняя скорость ответа была в разы меньше требуемой (и увеличилась в 20 раз);
- нестабильной: в час пик статистика отставала до получаса (теперь ничего не отстает);
- дорогой: изменилась политика лицензирования Microsoft, расходы на лицензии могли составить миллионы долларов.
...
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2905.html
Прошло более года с того момента, как Microsoft выпустила первую версию своего нового фреймворка для разработки web-приложений ASP.NET Core, и с каждым днем он находит все больше поклонников. ASP.NET Core базируется на платформе .NET Core, кроссплатформенной версии платформы .NET c открытым исходным кодом. Теперь у С#-разработчиков появилась возможность использовать Mac в качестве среды разработки, и запускать приложения на Linux или внутри Docker-контейнеров.
...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/2913.html
Изначально будут раскрыты базовые причины, которые заставили появиться такой части механизма СУБД, как кэш результатов, и почему в ряде СУБД он есть или отсутствует.
Будут рассмотрены различные варианты кэширования результатов как sql-запросов, так и результатов хранимой в БД бизнес-логики. Произведено сравнение способов кэширования (программируемые вручную кэши, стандартный функционал) и даны рекомендации, когда и в каких случаях данные способы оптимальны, а порой опасны.
...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/2947.html
Apache Ignite — Open Source платформа для высокопроизводительной распределенной работы с большими данными с применением SQL или Java/.NET/C++ API. Ignite используют в самых разных отраслях. Сбербанк, ING, RingCentral, Microsoft, e-Therapeutics — все эти компании применяют решения на основе Ignite. Размеры кластеров разнятся от всего одного узла до нескольких сотен, узлы могут быть расположены в одном ЦОД-е или в нескольких геораспределенных.
...
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/3005.html
Когда мы говорим о нагруженных системах и базах данных с большим числом параллельных коннектов, особый интерес представляет практика эксплуатации и сопровождения таких проектов. В том числе инструменты и механизмы СУБД, которые могут быть использованы DBA и DevOps-инженерами для решения задач мониторинга жизнедеятельности базы данных и ранней диагностики возможных проблем.
...
3. VIEW
● Абстракция. В традиционных языках — процедуры,
функции, классы и их методы, в SQL — представления.
– get_user_by_[id,name,email] returns user_type —
не надо так
● Реальные данные — отдельно, их представление —
отдельно.
● Триггеры на view
CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER |
INSTEAD OF }
4. Пример: пользователи
● Реально активно обычно 5-15% всех пользователей.
● Обмен с диском идет постранично.
● Один пользователь — одна страница
● При сохранении в кеше тысячи пользователей они будут
занимать тысячу страниц; конкретно строка пользователя
будет занимать 1/8 — 1/200 страницы.
5. Пользователи
● Таким образом, 1000 пользователей потребует 8М RAM, из
которых будет реально использоваться только
1000*200байт ≈ 20КБ RAM.
● Кроме того, RAM будет использоваться еще и под индекс.
– Кстати, Postgres не работает мимо кеша ОС;
следовательно, надо выделять или разумное
количество памяти, или почти всю.
● Сложим всех активных в секцию usr_active, а неактивных —
в usr_dormant
6. Union all
● select * from usr_active
union all
select * from usr_dormant
● От неактивных пользователей в кеше останется только
индекс.
● Можно еще лучше — создать функцию.
7. create function usr_all(ns integer[]) returns table(n integer) as
$code$
declare
v integer;
begin
foreach v in array ns loop
select a.n into usr_all.n from usr_active a where a.n=v;
if found then
return next;
else
select d.n into usr_all.n from usr_dormant d where d.n=v;
if found then
return next;
end if;
end if;
end loop;
end;
$code$
language plpgsql
8. Сравнение
● View — удобно; накладные расходы на индекс
● Функция — неудобно (относительно); отсутствие накладных
расходов на индекс.
● Так ли уж это все надо?
– Скорее всего, нет. Но про страничный обмен
забывать все же не стоит.
9. View с параметрами
● Часто хотят view с параметрами
● Например, для пользователей показывать, кто друг
просматривающему; параметр — id просматривающего
пользователя
● Что делать?
● Декартово произведение. Да, именно декартово
произведение.
● N*1=N. Таблица параметров должна возвращать
единственную строку.
10. View с параметрами
create or replace view usr_cart as
select p.id as viewer_id,
u.*,
exists(select * from friend f
where f.usr_id=viewer_id
and f.friend_id=u.id)
as isfriend
from usr u, usr p
● Используем:
select *
from usr_cart
where id in(...)
and viewer_id=$1
11. View с параметрами
● А что делать, если надо и без viewer_id? Подставим
несуществующий:
create or replace view usr_cart as
select p.id as viewer_id,
u.*,
exists(select * from friend f
where f.usr_id=viewer_id
and f.friend_id=u.id)
as isfriend
from usr u, (select 0 as id
union all
select id from usr) as p
● Используем:
select *
from usr_cart
where id in(...)
and viewer_id=coalesce($1,0)
12. View & values или а теперь
по-маленькому
● Values:
values('FCB','Facebook'),
('VK', 'Vkontakte'),
('TW','Twitter')
...
● А если сделать view
● Ну и зачем?
● Быстро! А насколько? Почему?
13. Насколько быстро
● pgbench — уже все готово
create or replace view v_socnet(code, name) as
values('FB','Facebook'),
('VK', 'Vkontakte'),
('TW','Twitter'),
('LJ','Livejournal'),
('OK','Odnoklassniki'),
('MM','Мой мир');
create table t_socnet as select * from v_socnet;
14. Смотрим
● Скрипты:
set key 'LJ'
begin
select * from generate_series(1,25) as gs(n),
t_socnet where code=:key;
end;
set key 'LJ'
begin
select * from generate_series(1,25) as gs(n),
t_socnet where code=:key;
end;
15. Результаты
● Опции pgbench:
-M prepared -U hl -t 5000 -n -j 2 -c 10 -f hl.pgb
work
● Для t_socnet
– tps = 6779.707111
● Для v_socnet
– tps = 7275.770835
● Почему?
16. Выводы
● А оно вообще надо?
– Скорее всего нет. Но...
● А оно вообще удобно?
– Не очень. Но...
● Transactional DDL и триггеры — позволяют
эмулировать обычную таблицу.
● Foreign key — не получится. Надо делать триггер. Но
так ли уж это плохо?
● Мораль? Всегда можно переключиться с одной реализации
на другую — и обратно.
17. Массивы (Arrays)
● text — text[], integer — integer[], record_type — record_type[]...
● Конструкторы — array[1,2...] и array(<query>)
● Ожидаемый набор функций и операторов
● Массивы массивов
● Массив можно использовать во from — unnest
● Массив можно собрать агрегатом array_agg
18. Top N для M
● Например, 10 последних постов из самых популярных тем.
Или 10 последних покупок в категориях.
● Очевидный запрос
select p.* from post p, topic t
where p.id in (select p1.id
from post p1
where p1.topic_id=t.id
order by added desc
limit 10)
19. Top N для M
● К сожалению, не работает. Точнее, работает, но для
больших объемов неприемлемо медленно. Обманываем
оптимизатор
select p.*
from post p, topic t
where p.id=any(array(select p1.id
from post p1
where p1.topic_id=t.id
order by added desc
limit 10)
)
20. Top N для M
● Насколько эффективно это работает?
● Вообще говоря, вполне эффективно
● Если миллионы элементов, то все не так здорово
22. Зачем надо?
● Удобно: эдакое маленькое view в запросе
● Как и всякое view, позволяет отдельно описывать отдельные
логические понятия и не дублировать код.
● Результаты живут в work_mem (или вытесняются на диск);
по сути — временные таблицы.
● И, наконец, рекурсия.
23. Recursive CTE
with recursive tq as(
select 1 as n --1
union all
select n+1 from tq where n<10 --2
)
select * from tq
26. Способ №1 или линейная
рекурсия
with recursive id | parent_id | name | parent_name
tree(id, parent_id, name) as ----+-----------+-------+-------------
(values(1,null,'Адам'), 1 | | Адам |
(2,1,'Авель'), 3 | 1 | Каин | Адам
(3,1,'Каин'), 2 | 1 | Авель | Адам
(4,2,'Енох') 4 | 2 | Енох | Авель
), (4 строки)
with_parent as(
select *, null as parent_name
from tree
where parent_id is null
union all
select tree.*, wp.name
from tree, with_parent wp
where tree.parent_id=wp.id
)
select * from with_parent
27. Ну и в чем разница?
with recursive tree(id, id | parent_id | name | parent_name
parent_id, name) as ----+-----------+-------+-------------
1 | | Адам |
( 3 | 1 | Каин | Адам
values(1,null,'Адам'), 2 | 1 | Авель | Адам
(2,1,'Авель'), 4 | 2 | Енох | Авель
(3,1,'Каин'), (4 строки)
(4,2,'Енох')
)
select *,
(select t.name
from tree t
where tree.parent_id=t.id
) as parent_name
from tree
28. А вот в чем
with recursive tree(id, parent_id, name) id | parent_id | name | ancestors_names
as( ----+-----------+-------+-----------------
values(1,null,'Адам'), 1 | | Адам | Бог
(2,1,'Авель'), 3 | 1 | Каин | Бог,Адам
(3,1,'Каин'), 2 | 1 | Авель | Бог,Адам
(4,2,'Енох')), 4 | 2 | Енох | Бог,Адам,Авель
with_parent as( (4 строки)
select *, 'Бог' as ancestors_names
from tree
where parent_id is null
union all
select tree.*,
wp.ancestors_names||','||wp.name
from tree, with_parent wp
where tree.parent_id=wp.id)
select * from with_parent
29. Нелинейная рекурсия
with recursive
tree(id, parent_id, name) as(
values(1,null,'Адам'),
(2,1,'Авель'),(3,1,'Каин'),
(4,2,'Енох'), (5,null,'Ева'),
(6,5,'Дочь Евы'),(7,4,'Ирад')),
expand_tree as(
select id,parent_id,name from tree
union(
with expand_tree as(
select * from expand_tree
)
select e1.id, e1.parent_id, e2.name
from expand_tree e1,
expand_tree e2
where e2.parent_id=e1.id
)
)
select * from expand_tree e where id=1
31. Нелинейная рекурсия-3
Как это, собственно, работает
● ...where name='Ирад'
id | parent_id | name
----+-----------+------
7 | 4 | Ирад
4 | 2 | Ирад
2 | 1 | Ирад
1 | | Ирад
(4 строки)
32. Путь в циклическом графе
● Создаем граф.
– Создаем вершины:
create table vertex as
select n
from generate_series(1,10000) as gs(n);
alter table vertex add constraint vertex_pk
primary key (n);
– Создаем вершины:
create table edge(f,t) as select distinct
(random()*10000)::integer as from,
(random()*10000)::integer as to from
generate_series(1,100000) as gs(n);
create index edge_ft on edge(f,t);
33. Ищем путь
● Весьма просто:
with recursive tq as(
select 1 as pass, n, array[n] as path
from vertex where n=1
union all
(with t as (select * from tq)
select pass+1, v.n, t.path||v.n
from vertex v, t, edge e
where v.n=e.t and t.n=e.f
and not (e.t=any(t.path))
and pass<8
and not exists(select * from t where n=5000)
)
)
select * from tq where n=5000
35. Что дальше
● CTE как конечный автомат. Со стеком! Разбор JSON'а.
– Как?
● Сделать одним запросом? Реально, но громоздко.
● plpgsql
● C-libraries
– Уже встроенный тип
●Доступа почему-то нет
● Ждем 9.3 и lateral
● Разбираем JSON. JSONPath навыворот
– Пример: $.users.[100].id
36. Разбор JSON
with recursive
tokens as(
select s[1] as token, row_number() over() as n
from regexp_matches($JS$
{
"data": [
{"name": "User1 User1", "id": "768709679"},
{"name": "User2 User2","id": "10604454123"}
]
"paging": {
"next": "https://graph.facebook.com/10000223"
}
}
$JS$,
39. parsed as(
Разбор JSON.
select n,
token as token,
array[token] as stack,
array['$']::text[] as path,
'' as jsp,
array[0]::integer[] as poses
from tokens t where n=1
union all
select t.n,
t.token as token,
case when t.token in (']','}') then p.stack[1:array_upper(p.stack,1)-1]
when t.token in ('[','{') then p.stack || t.token
else p.stack
end,
case when t.token in ('[','{') then p.path ||
case when p.stack[array_upper(p.stack,1)]='{'
then regexp_replace(p.token,'^"|"$','','g')
else '[' || (p.poses[array_upper(p.poses,1)]+1)::text ||
']'
end
when t.token in (']','}') then p.path[1:array_upper(p.path,1)-1]
else p.path
end,
case when p.stack[array_upper(p.stack,1)]='{' then p.token
when p.stack[array_upper(p.stack,1)]='[' then '[' ||
(p.poses[array_upper(p.poses,1)]+1)::text || ']'
else ''
end,
case when t.token in ('[','{') then p.poses[1:array_upper(p.poses,1)-
1]||(p.poses[array_upper(p.poses,1)]+1)||0
when t.token in (']','}') then p.poses[1:array_upper(p.poses,1)-1]
else p.poses[1:array_upper(p.poses,1)-1]||
(p.poses[array_upper(p.poses,1)]+1)
end
from parsed p, tokens t where t.n=p.n+1),
41. Разбор JSON.
res as(
select *
from parsed
where (stack[array_upper(stack,1)]='['
or (stack[array_upper(stack,1)]='{'
and poses[array_upper(poses,1)]%2=0)
)
and token not in ('{','[','}',']')
)
select array_to_string(path,'.')||'.'||
regexp_replace(jsp,'^"|"$','','g')
as json_path,
regexp_replace(token,'^"|"$','','g')
as json_value
from res
43. А зачем это надо?
● Вообще полезно знать.
● Иногда нет возможности установить что-то дополнительно
● Не только JSON — что угодно с относительно несложным
синтаксисом.
● Можно предложить еще способ — например, строить
дерево со ссылками на родителя, рекурсивно же разбирать
аналог JSONPath и добираться до элементов.
– И не только JSON — пути в дереве вообще.
44. with recursive fs(id,pid,name) as(
values
(1,null,null),
(2,1,'usr'),
(3,2,'local'),
(4,3,'postgres'),
(5,4,'bin')
),
path as(
select p, row_number() over() as n
from regexp_split_to_table('/usr/local/postgres/bin','/')
as v(p)
),
parsed as(
select id, name,p,n
from fs, path where fs.pid is null and path.p=''
union all
select fs.id, fs.name, path.p, path.n
from fs, path, parsed
where fs.pid=parsed.id and fs.name=path.p
and path.n=parsed.n+1
)
select * from parsed order by n desc limit 1
45. Что получилось
id | name | p | n
----+------+-----+---
5 | bin | bin | 5
(1 строка)
46. Кстати: модули
● pg_trgm — триграммы.
● hstore — key-value
● dblink — доступ к другому постгресу
– Кстати: fdw — foreign data wrappers
– Транзакции в dblink
● earthdistance и PostGIS
● И другие...
47. Prepared statements
● Увеличивают производительность — не требуется каждый
раз
– разбирать запрос
– Нагружать каталог на предмет существования
таблиц, индексов и т. п.
– Проверять права доступа к объектам
– А в случае широкого использования view все
может оказаться еще интереснее
● prepare <sthname> as <real query>
● execute <sthname>(par1,par2...parN)
48. Prepared statements & plpgsql
● В plpgsql отсутствует аналог пакета DBMS_SQL — prepared
statements недоступны.
– Каждый статический запрос компилируется один
раз при обращении или перекомпилируется при
изменении объектов
● Внимание: ошибка, если объекты, на которые
ссылается statement, в момент начала его
выполнения еще существовали, но до обращения к
ним были удалены.
● Типичный пример: переименование таблицы при
высокой OLAP-нагрузке
● Что делать?
49. Advisory locks
● Решение 1: рекомендательные блокировки
– pg_advisory_lock, pg_advisory_xact_lock, _shared,
pg_try_
● Решение 2: обычные блокировки. Таблица блокировок.
select … for share.
50. Prepared statements
● А точно ли недоступны prepared statements в plpgsql?
● Конечно доступны: execute '….':
execute 'prepare sth1 for select 1';
execute 'execute sth1' into res;
● Execute 'execute' — а вот параметры, увы, действительно
недоступны. quote_literal(), quote_ident()
51. Prepared statements
● Насколько это быстро?
– Кстати: функции времени: now() возвращает
дату и время начала транзакции. Используйте
clock_timestamp()
– Кстати - анонимные блоки:
● do $$ code $$
– Кстати: $$-quoting:
● $$, $RE$, $Im$, $ANYTHING_ELSE$
– select $Re$^("|[^"])+$Re$
52. Код
do $code$
declare
i integer;
ts1 timestamp with time zone;
ts2 timestamp with time zone;
res integer;
begin
execute 'prepare sth1 as select 1';
ts1:=clock_timestamp();
for i in 1..100000 loop
-- execute 'execute sth1' into res;
-- select 1 into res;
-– execute 'select 1' into res;
–- Реальная таблица: select 1 as n into stht
–- execute 'prepare sth1 as select n from stht';
–- select n into res from stht
–- execute 'select n from stht' into res
end loop;
ts2:=clock_timestamp();
raise notice 'diff=%', (ts2-ts1)::text;
end;
$code$
53. Результаты
execute 'execute...' select .. into execute 'select...'
select 1 00:00:01.157 00:00:00.297 00:00:01.374
select n from stht 00:00:02.158 00:00:00.930 00:00:04.331
54. А зачем это, собственно, надо?
● Разбор
● Построение плана
● Выполнение
● Нередко построение плана > выполнение
● С динамическим выполнением все идет каждый раз по
новой
● С prepared — только один раз
● pg_prepared_statements
55. Prepared statements
● Возвращаем резалтсет
– return query execute
– только обернув в функцию
● Что еще?
– save_record('table_name',
'column1_name','column2_value',
'column2_name','column2_value'...
)
● plpgsql — функции с переменным числом параметров
56. Кстати: upsert и вставка в
несколько таблиц
Подход в лоб:
with
input as
(select n from generate_series(1,10) as gs(n)),
upd as(
update ups set val=i.n from input i
where ups.n=i.n returning i.n
),
ins as(
insert into ups select * from input i
where not exists(select * from upd u
where i.n=u.n)
returning ups.n
)
select (select count(*) from upd) as updates,
(select count(*) from ins) as inserts
57. Upsert
● Подход в лоб не работает — race condition: после
обновления другой процесс может добавить новые строки,
и при вставке возникнет ошибка.
● Как правильно:
– Для каждой вставляемой строки
● Попытаться обновить
● Обновилась — хорошо, не обновилось — добавляем
● При нарушении уникальности повторяем попытку
добавления строки с самого начала
58. Кстати: plpgsql, savepoint и
исключения
● В plpgsql нет явных savepoint
● В plpgsql при использовании исключения в блоке на входе в
блок ставится неявный savepoint
● При возникновении исключения в блоке происходит откат к
нему
● Пример:
59. Кстати: plpgsql, savepoint и
исключения
do $code$ ЗАМЕЧАНИЕ: BEFORE exception
begin n=10
create temporary table
excdemo as select 1 as n; ЗАМЕЧАНИЕ: AFTER exception n=1
begin
update excdemo set n=10;
raise notice
'BEFORE exception n=%',
(select n from excdemo);
raise sqlstate
'EX001';
exception
when sqlstate 'EX001' then
raise notice
'AFTER exception n=%',
(select n from excdemo);
end;
end;
$code$
60. Кстати: plpgsql, savepoint и
исключения
● Позволяет делать логгирование
– Не нужны автономные транзакции (ну, почти не
нужны...)
● Позволяет выполнять потенциально некорректный код!
– Это хорошо, а не плохо! Можно в живой боевой
сервер на ходу добавлять код, не обваливая все
по ошибке.
● «Можно» - разумеется, не значит «нужно».
61. Курсоры
● Задача — resultset из фунции
– funcname(..) returns table(colname coltype...)
– select * from funcname(...)
● Задача расширилась — несколько resultset'ов из функции
● Задача еще более расширилась — МНОГО resultset'ов
● Причем переменное число
● Что делать?
62. Курсоры
● Курсоры существуют только в пределах транзакции
– Начало транзакции
– Вызов фунции
– Fetch all from <cursor name1>
– Fetch all from <cursor name2>
– …
– Fetch all from <cursor nameN>
– commit
63. Курсоры
● refcursor
В сущности, курсор — это просто его имя; имя курсора —
строка
declare
cursname1 refcursor;
...
begin
...
open cursname1 for select ...
...
return array[cursname1,cursname2...]
64. Зачем надо
Дата продажи Тип Сумма
2012-10-01 Пиво 100
2012-10-01 Квас 50
2012-10-02 Вино 45
... ... ...
I II III IV V VI VII VIII IX X XI XII
Пиво 100 80 100 100 120 150 160 150 120 100 90 80
Квас ... ... ... ... ... ... ... ... ... ... ... ...
Вино ... ... ... ... ... ... ... ... ... ... ... …
Кефир ... ... ... ... ... ... ... ... ... ... ... ...
65. Курсоры
● Требуется поддержка на клиенте
● Для курсоров она реализуется несложно — в perl или php
достаточно рекурсивно обойти resultset и посмотреть типы
колонок.
● В Java — используя декоратор, создать класс,
возвращающий ResultSet (как именно его создавать —
отдельная история)
● Для json можно поступить аналогично
– Отличть json от text на клиенте малореально.
Хак: можно сделать domain для text и смотреть
длину.
66. generic_cursor
CREATE OR REPLACE FUNCTION generic_cursor(IN sql text, VARIADIC param text[]
DEFAULT ARRAY[]::text[])
RETURNS refcursor AS $BODY$
declare rv refcursor;
sthhash text := 'GENCURS'||md5(sql);
exec text := 'execute ' || sthhash ||
case when array_length(param,1) is null then ''
else '('||(select
string_agg(coalesce(quote_literal(pv),'NULL'),',') from unnest(param) as u(pv))
||')' end;
begin
begin
open rv for execute exec;
exception
when sqlstate '26000' -- prepared statement does not exist
or sqlstate '0A000' -- table definition had changed
or sqlstate '42703' --- -/-
or sqlstate '42P11'
then
if sqlstate='0A000' or sqlstate='42703' then
execute 'deallocate '||sthhash;
end if;
execute 'prepare '||sthhash|| coalesce((select '('||
string_agg('text',',') || ')' from unnest(param) as u(pv)),'') ||' as '||sql;
open rv for execute exec;
end;
return rv;
end; $BODY$ LANGUAGE plpgsql
67. generic_exec
CREATE OR REPLACE FUNCTION generic_exec(
IN sql text,
VARIADIC param text[] DEFAULT
ARRAY[]::text[])
RETURNS SETOF record AS $BODY$
declare
cr refcursor:=
generic_cursor(sql, variadic param);
begin
return query execute 'fetch all from '||
quote_ident(cr::text);
end;
$BODY$ LANGUAGE plpgsql
69. do $code$
declare
rv tt;
s1 timestamp; А оно надо? Да!
s2 timestamp;
s3 timestamp;
i integer;
begin
s1:=clock_timestamp();
for i in 1..1000 loop
execute 'select t1.* from tt t1, tt t2, tt t3, tt t4, tt t5, tt t7, tt t8
where t1.id=t2.id and t2.id=t3.id and t3.id=t4.id and t1.id=t5.id and t5.id=t7.id
and t5.id=t8.id and t8.id=9999
and t1.id between 1 and 10000 and t4.id between 9999 and 200000 and t3.id>9000
and exists(select * from tt t6 where t6.id=t5.id)
and t4.cnt=49 order by t4.cnt' into rv;
end loop;
s2:=clock_timestamp();
for i in 1..1000 loop
select * into rv from generic_exec('select t1.* from tt t1, tt t2, tt t3, tt t4,
tt t5, tt t7, tt t8
where t1.id=t2.id and t2.id=t3.id and t3.id=t4.id and t1.id=t5.id and t5.id=t7.id
and t5.id=t8.id and t8.id=9999
and t1.id between 1 and 10000 and t4.id between 9999 and 200000 and t3.id>9000
and exists(select * from tt t6 where t6.id=t5.id)
and t4.cnt=49 order by t4.cnt') as ge(n integer, cnt bigint);
end loop;
s3:=clock_timestamp();
raise notice 'Run 1=%',s2-s1;
raise notice 'Run 2=%',s3-s2;
end; $code$
71. То же самое, но многопоточно
$ pgbench -M prepared -U postgres -t 500 -n -j 2 -c 10 -f
generic_exec.pgb work
number of clients: 10
number of threads: 2
number of transactions per client: 500
number of transactions actually processed: 5000/5000
tps = 2340.001464 (including connections establishing)
tps = 2508.521577 (excluding connections establishing)
$ pgbench -M prepared -U postgres -t 500 -n -j 2 -c 10 -f
plain_execute.pgb work
query mode: prepared
number of clients: 10
number of threads: 2
number of transactions per client: 500
number of transactions actually processed: 5000/5000
tps = 146.373869 (including connections establishing)
tps = 147.008750 (excluding connections establishing)
72. Альтернатива
● JSON — в 9.2 row_to_json, array_to_json
– select
array_to_json(
array(
select row_to_json(c.*)
from pg_class c
)
)
● В предыдущих версиях легко можно написать и
самостоятельно, используя, например, hstore
● Можно просто возвращать массив hstore и разбирать на
клиенте
73. Заключение
● И снова: а зачем все это, собственно, надо?
● Производительность
● Переносимость
● Вычурность
● Пробуйте!
● Вопросы?