6. Важное предшествующее обсуждение
Настоящее обсуждение: рассмотрение с точки зрения интегратора («товароведа»)
Пользовательский спрос Лингвистика Универсальность [Над]системная интеграция
SQL не столько как язык, сколько как «отрицание NoSQL-движения» → New School
строгая согласованность ограниченная транзакционность вопросы масштабирования вопросы мультимодельности
Рассмотрены с точки зрения СУБД-строителя
Cassandra CQL Couchbase N1QL RethinkDB ReQL Elastic Query DSL CrateDB SQL
Константин Осипов. NewSQL: SQL никуда не уходит // Backend Conf , РИТ++, 2017)
7. Итоги
SQL – «наше всё» Но не весь SQL – наш (есть специфики в гетерогенной среде) Wanted…
Умозрительный пример: SQL как shell
+ н е у м о з р и т е л ь н ы й п р о г н о з : S Q L к S 3
Переписывание запросов
HoTTSQL Переписывание модели
Абстрагирование от модели хранения и гибридизация
Одним запросом – к разным источникам Проблемы планирования
К поиску супермодели
SQL CoSQL (Мейер) Кольцо нормальных форм
Реляционность SQL
Нереляционности SQL в реляционных СУБД Реляционная часть SQL Реализуемость SQL в нереляционных СУБД
История
Язык оператора Язык программиста Язык аналитика
9. Язык оператора
Structured English Query Language
SEQUEL
Руководство оператора
ЭВМ.
Структурированный язык
запросов SQL
Вытеснен идеями QBE
•(Query-by-example,
Моше Цлоф, 1974)
ICSE ’76: Proceedings of the 2nd international
conference on Software engineering
10. Язык программиста
Процедурные расширения
PL/SQL SQL PL SQL-PSM T-SQL …
Усложнения
Рекурсивные
запросы
Регулярные
выражения
Работа с
XML
Работа с
геоданными
Оконные
функции
Темпоральные
операции
Работа с
JSON
11. 2010-е: язык аналитика
На SQL спросить
проще и яснее,
чем вникать в
тонкости работы
drag-n-drop-BI
На SQL спросить
быстрее, чем
просить
программистов
сделать витринку
и картинку
SELECT PROD, SUM(AMT)
FROM SALES
WHERE CAT = 52
GROUP BY CUBE(SHOP,RG)
HAVING SUM(AMT)>100
На SQL готовы разговаривать не только программисты,
но как быть с нереляционными источниками?
13. Реляционен ли SQL?
SQL слишком часто отходит от принципов реляционной теории
строки-
дубликаты
NULL-
значения
Соединения по произвольным критериям
A JOIN B on A.x=B.y
вместо соединения по
декларированному ключу
Подзапрос
A IN (SELECT B …)
с B из другого домена
14. В настоящем 𝑅 ⊆ 𝐷1 × ⋯ × 𝐷 𝑛
многое привычное и не должно работать
Сортировка
Лимиты
Последовательности
Оконные функции
•в обновлении более одного
элемента в одном запросе
•обращение к предыдущему
элементу окна
15. Реляционная часть SQL
Выборка
• В части проекции?
• …пока не
возвращает
дубликаты
• То есть только
DISTINCT на
всю проекцию
• В части
фильтрации
Группировка
• Как свёртка
• … тонкостями
на ROLLUP, CUBE
Соединение
• Притом SQL
позволяет его
«ассемблировать»
Теоретико-
множественные
операции
• Лишь в части
приведения
dataframe к
единому типу
кортежа
• Привет из
R, Octave, Python
16. «Ассемблирование» соединений
(и группировок)
SELECT DEPTNAME, AVG(SALARY)
FROM EMP NATURAL JOIN DEPT
GROUP BY DEPTNAME
SELECT DEPTNAME, AVG(SALARY)
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY DEPTNAME
SELECT DEPTNAME, DEPTFUND/DEPTSIZE
FROM DEPT, (SELECT SUM(SALARY) AS DEPTFUND, COUNT(1) AS DEPTSIZE
FROM EMP
WHERE EMP.DEPTNO=DEPT.DEPTNO)
18. Явные нереляционности SQL в
современных РСУБД
Копания вглубь типов
• XML, JSON, геоданные, …
Сортировки
Лимиты
Приближённые запросы
Оконные функции
19. Копания вглубь
ALTER TABLE EMP ADD COLUMN (ADDRESS CLOB);
ALTER TABLE EMP ADD CONSTRAINT
ADDRESS_J CHECK (ADDRESS IS JSON)
…
SELECT ADDRESS.HOME_REC. STREET, COUNT(1)
FROM EMP
WHERE ADDRESS.HOME_REC.ZIP BETWEEN 121000 AND 125000
GROUP BY ADDRESS.HOME_REC.STREET
Oracle Database, JSON, точечная нотация
20. SQL для NoSQL
SQL is a kludge!
•Эван Уивер (RailsConf’2006)
Kludge ([klʌdʒ], техн., жарг.)
• клудж, устройство, программа или часть программы, которые
теоретически не должны работать, но почему-то работают
• ошибка, ляп (The first time, it’s a kludge! The second, a trick. Later, it’s a
well-established technique!)
AQL, N1QL, CQL, UnQL, HiveQL
•«в нашей NoSQL-СУБД мы решили для всеобщего
удобства реализовать SQL-подобный синтаксис»
21. SQL в мире NoSQL
«Ключ – значение»
Redis
Tarantool
Aerospike
GenieDB
RocksDB
IMDG как класс
Документо-
ориентированные
MongoDB
ToroDB
CouchDB
Couchbase
NosDB
RethinkDB
CrateDB
«Семейство столбцов»
HBase+Phoenix
Cassandra
ScyllaDB
RavenDB
Accumulo
MyRocks
SQL и SQL-подобные
CockroachDB
22. SQL в IMDG: глубина гонки
Гонка уже не за SQL как таковым, а за глубиной соответствия стандартам
Hazelcast
Предикатная
часть SQL
Gridgain
(Ignite)
ANSI SQL-99
Oracle
Coherence
CohQL
(одновременно
SQL- и JPQL-
подобный)
Gigaspaces
XAP
Почти ANSI
SQL-92
Tibco
ActiveSpaces
Предикатная
часть SQL
Gemfire
(Geode)
SQL-подобный
OQL
JBoss Data
Grid
SQL-подобный
InfinispanQL
23. CocroachDB
EMPNO FULLNAME DEPTNO SALARY
1 Сидор Петров 10 200
2 Харитон Иванов 20 100
KEY VALUE
/<EMP>/1/<FULLNAME> "Сидор Петров"
/<EMP>/1/<DEPTNO> 10
/<EMP>/1/<SALARY> 200
/<EMP>/2/<FULLNAME> "Харитон Иванов"
/<EMP>/2/<DEPTNO> 20
/<EMP>/2/<SALARY> 100
<EMP> – идентификатор таблицы EMP
SELECT * FROM EMP WHERE EMPNO=2
Scan("/<EMP>/2", "/<EMP>/2/*")
24. «Ключ – значение»
как низкоуровневый движок для РСУБД
Встраиваемая
СУБД
«ключ –
значение»
RocksDB
InnoDB
XtraDB
Реляционная
СУБД
Cockroach
DB
MyRocks
MySQL
MariaDB
Percona
Server
26. Агрегатная модель
Скрепляющее свойство NoSQL-моделей (кроме графовой)
•Ключ – значение
•Документоориентированная
•Семейство столбцов
Не кортеж из атомарных элементов, а привязанные к ключу коллекции,
возможно, сложной структуры
Не интерпретируется как отношение (казалось бы?)
27. CoSQL
Erik Meijer and Gavin Bierman
// Communications of the ACM, vol. 54 (2011), No. 4
SQL coSQL
Дочерние записи ссылаются на родительские Родительские записи содержат дочерние
Элементы обязательно строго типизированы (Потенциально) динамически типизированы
Синхронные обновления (ACID) для нескольких
записей
Асинхронные обновления (BASE) для одной записи
Набросок теоретико-категорной модели, объединяющей
реляционную алгебру и «двойственную ей» алгебру для агрегатных моделей
29. Кольцо нормальных форм
N1NF
1NF
2NF
3NF
4NF
5NF
6NF
EAV
EMPNO FULLNAME REGION CITY STREET HOUSE FLAT IDTYPE IDVAL
1 Сидор
Петров
ЦФО Москва 3-я Строителей 25 12 Паспорт 1010 101010
СНИЛС 1010-101011
ИНН 556677889900
EMPNO FULLNAME
1 Сидор Петров
AID EMPNO REGION CITY STREET HOUSE FLAT
1010 1 ЦФО Москва 3-я Строителей 25 12
EMPNO IDTYPE IDVAL
1 Паспорт 1010 101010
1 СНИЛС 1010-101011
1 ИНН 556677889900
30. Селективность, плотность хранения –
вне прямой зависимости от нормализации
Строчное
хранение
6NF
Столбцовое
хранение
1NF
Сопоставимые объёмы, сопоставимые сложности доступа
32. Большой транзакционный объект
Постоянно прибывающий журнал (операций)
•С многочисленной, но, как правило, атомарной атрибутикой
•С немногочисленными вложенными коллекциями
•С изменяющейся время от времени атрибутикой
С понятным способом сегментирования
•Равномерно хэширующийся уникальный идентификатор
•Либо – по временному штампу
33. Эволюция масштаба (1)
EMP
•10 тыс.
DEPT
•500
PAYROLL
•120 тыс. в год
PAYROLL_ITEM
•1 млн в год
EMP
•10 тыс.
DEPT
•500
PAYROLL
•120 тыс. в год
PAYROLL_ITEM
•1 млн в год
TASK
•10 тыс. в год
TIMESHEET
•10 млн в год
EMP
•10 тыс.
DEPT
•500
PAYROLL
•120 тыс. в год
PAYROLL_ITEM
•1 млн в год
SQUID/ACCESS.LOG
•5000 в день per EMP
•>10 млрд за год
Большой
транзакционный
объект
«Словари», slow
changed
dimensions
Реляционная
неразличимость
1995 2005 2015
34. Центральная (мастер)-сущность
Основной учитываемый объект
• С крайне многочисленной, меняющейся и сложной атрибутикой
• С многочисленными вложенными коллекциями
• Возможно, составляющими большие транзакционные объекты
• Все прочие «большие сущности» – прямо или транзитивно ссылаются на мастера
С понятным способом сегментирования
• Их достаточно много, и хэш от первичного ключа весьма равномерно размажется по
кластеру
• Все прочие большие сущности сегментируются вслед за мастер-сущностью в точности по
её ключу
• (Почти) все практически осмысленные большие соединения – локализуются на сегментах
35. Эволюция масштаба (2)
CUST
•10 тыс.
PROD
•500
BILL
•100 тыс. в год
BILL_ITEM
•1 млн в год
CUST
•100 тыс.
PROD
•1 тыс.
BILL
•1 млн в год
BILL_ITEM
•10 млн в год
CUST_ACTION
•100 тыс. в год
CUST
•1 млн
PROD
•1500
CUST_CHARGE
•5 млрд в год
CUST_PAYMENT
•100 млн в год
CUST_ACTIVITY
•50 млрд в год
Вложимый
транзакционный
объект
«Словари», slow
changed
dimensions
Реляционная
неразличимость
1995 2005 2015
Мастер-
сущность
36. От простого сегментирования
– к расслоению с сегментированными слоями
In-memory
MPP DB
HDFS
S3
Speed layer
Serving layer
Batch layer
SQL ?
37. Абстрагирование от модели
хранения и гибридизация
Если везде SQL, почему бы не отправить один запрос ко всем сразу?
Если везде SQL, то почему бы не расслоить хранение
(по технико-экономически соображениям)?
38. Одним запросом – к любому хранилищу
Apache Drill
HDFS
HBase
Hive
RDBMS
MongoDB
Pivotal HDB
(Apache Hawq)
Hadoop
Greenplum
Database
Gemfire
Teradata
SQL-H
Hadoop
Aster Data
Teradata
Database
Oracle
Big Data SQL
Hadoop
Oracle
Database
39. Проблемы планирования
Было:
• Фиксированный
(outline) план
запроса в Oracle
Database
“Пришла
Big Data”:
• Часть секций
(partitions) из
одной из
больших таблиц
отогнаны в
HDFS
Эффект:
• Заходим во
вложенных
циклах в HDFS
(запись
EXTERNAL
TABLE в плане)
Меры:
• Уничтожен
outline и
немного
переписан
запрос
Нужен:
• согласованный
со знаниями
оптимизаторов
источников
переписыватель
запросов
41. HoTTSQL: прогресс в
переписывании запросов
На основе инструментария
гомотопической теории типов
• теория, эксплуатирующая зависимые типы и
некоторые геометрические идеи
• программа, нацеленная на перевод математических
доказательств на язык систем автоматического
доказательства (Coq, Agda, Idris)
SQL-запрос –
это тип
Эквивалентность
SQL-запросов –
это тоже тип
Задача: населён
ли тип данной
эквивалентности?
42. Переписывание
модели
N1NF
1NF
2NF
3NF
4NF
5NF
6NF+
EAV
Широкая таблица в BigTable-стиле
Реляционная таблица с
дочерними таблицами по
столбцам-коллекциям
Гроздь таблиц
(гипернормализованная снежинка
со сквозным ключом к хабу)
Гроздь таблиц от ключевой к
дочерним по выявлению
функциональных зависимостей
43. От Schema-on-Read к Model-on-Read
•определение или доопределение схемы в
процессе раскапывания содержания источника
Schema-
on-Read
•определение или доопределение, в какую
модель уложить или доложить данные
•определение или доопределение, в какую
модель отправить запрос или его часть
Model-
on-Read
44. Раскапывая схему: Apache Drill
SELECT address.home_rec.street AS STREET, COUNT(1) AS CNT
FROM hbase.emp
WHERE address.home_rec.zip = "124125"
GROUP BY address.home_rec.street
SELECT *
FROM hbase.emp
LIMIT 2
row_key name address
1 {"name": "Сидор",
"surname": "Петров"}
{"home_rec": {"zip": "124125", "city": "Москва", "street": "3-я Строителей", "house": 25},
"work_rec": {"zip": "124129", "city": "Москва", "street": "Тверская", "house": 13}
2 {"name": "Харитон",
"surname": "Иванов"}
{"home_rec": {"zip": "124125", "city": "Москва", "street": "2-я Строителей", "house": 2},
"work_rec": {"zip": "124129", "city": "Москва", "street": "Тверская", "house": 13}
STREET CNT
3-я Строителей 1
2-я Строителей 1
45. Model-on-Read: как это могло бы быть
Разобрать схему
на уровне
доменов и
кардинальностей
вхождения
Доопределить
домены и
ограничения,
выявить
масштабы
Классифицировать
объекты,
сущности, словари
Разложить (DDL →
пакетный ETL) по
СУБД в
соответствии с её
рабочей моделью
нормализации
Универсально
запрашивать в
терминах
объектов,
сущностей,
словарей с
трансляцией в
нужную модель
46. Универсальный SQL: каким бы мог быть
Над мастер-
сущностями и
большими
транзакционными
объектами
…c поддержкой
копания вглубь в
духе точечной и
путевой нотации
Вместо
соединений со
словарями –
lookup-синтаксис
…и, возможно,
lookup-
семантика, с
вещанием
словарей по
узлам
Со строгой
доменной
типизацией
…поэтапно
доопределяемой
…с доменно-
типизированными
функциями
[высшего порядка]
С возможностями
трансляции в SQL
для других
моделей
…в том числе, с
переписыванием
запросов в
согласовании со
статистикой
47. Элементы универсального SQL в ClickHouse
Раскрытие темы: 8 ноября, 15:00, Конгресс-холл,
Эффективное использование ClickHouse // Алексей Миловидов
Больше, чем SQL
ARRAY JOIN
PREWHERE
SAMPLE
Конкретнее, чем РСУБД
Информация о
локальности на
уровне семантики
[GLOBAL] JOIN
[GLOBAL] IN
Рождён для
горизонтального
масштаба
Таблицы –
отдельно,
словари – отдельно
Врождённые ключи
сегментирования
(сначала были только месяцы)
49. Блуждаем по каталогам
SELECT TYPE, ACCESS_PARTERN, LINKS,
OWNER, GROUP, SIZE, NAME
FROM FILESYSTEM
WHERE DIR = SELECT CURRENT FROM CWD
TYPE ACCESS_PATTERN LINKS OWNER GROUP SIZE NAME
d rwxr-xr-x 1 root root 24 dir1
d rwxrwxr-x 1 user1 post 24 dir2
2 записи выбрано
UPDATE CWD SET CURRENT = CURRENT + '/' + 'dir2'
1 строка обновлена
ls -la
cd dir2
50. Блуждаем по файлам
awk -F" '{print $6}' `cat access.log access.log.old` | sort | uniq -c | sort -fr
SELECT USER_AGENT, COUNT(1)
FROM
(SELECT $6 AS USER_AGENT
FROM ACCESS_LOG
UNION ALL
SELECT $6 AS USER_AGENT
FROM ACCESS_LOG_OLD)
GROUP BY USER_AGENT
ORDER BY COUNT(1) DESC
cat
awk
uniq
sort
USER_AGENT $2
MSIE 8.0; Windows NT 5.2;
Trident/4.0
110
Mozilla/5.0 (Windows NT 6.1;
Win64; x64; rv:47.0)
Gecko/20100101 Firefox/47.0
94
Mozilla/5.0 (Macintosh; Intel Mac
OS X x.y; rv:42.0) Gecko/20100101
Firefox/42.0
56
Mozilla/5.0 (iPhone; CPU iPhone
OS 10_3_1 like Mac OS X)
AppleWebKit/603.1.30 (KHTML,
like Gecko) Version/10.0
Mobile/14E304 Safari/602.1
55
51. killall -9 psql
SELECT UID, PID, PPID, STIME, TTY, CMD
FROM PROC
WHERE CMD LIKE '%psql%'
INSERT INTO PROC_SIGNAL (PID, SIGNAL)
VALUES
((SELECT PID FROM PROC
WHERE PROGRAM = 'psql'),
'SIGKILL')
2 записи добавлено
Ничего не выбрано
Если есть procfs,
то почему нет procdb?
52. Хайп на взлёте: SQL for S3?
H y p e C y c l e f o r D a t a M a n a g e m e n t , 2 0 1 7
Прежде всего – как идея
дезагрегации хранения
и обработки
…но и требующая выразительных
средств на стороне SQL для работы
с букетами-каталогами, файлами-
объектами и их группами, версиями
Amazon Redshift Spectrum как
возможный прототип
53. Итоги
SQL – «наше всё!»
Не всё из SQL – «наше»
Wanted: надмоделный SQL
54. SQL – универсальный язык доступа
к любым данным
SQL – язык программиста и пользователя-аналитика
QBE, универсальные
конструкторы
запросов – сложнее
SQL
Доступ к хранимым
данным и к потокам
данных
SQL над потоком –
стандарт де-факто
Нет смысла бороться с SQL:
все попытки сделать что-то лучше не получили признания
OData
Datalog
XQuery
JSONiq
Даже в «нишах» SQL приживается лучше,
чем специализированные языки
MDX SPARQL GraphQL
55. Для больших систем
[универсальный] SQL применим с
ограничениями на соединения
Эффективная по параллелизму конструкция выполнения одинакова во всех моделях и для всех СУБД
Модели преобразуемы одна к другой
Кардинальности сущностей –
неизменны
Принципы сегментирования –
неизменны
Прочие сущности – «словари»
(но не равнозначимые отношения для соединения)
Широковещаются по сегментам Фактически являются функциями (lookup, match…)
Сегментирование по узлам
По мастер-сущности с
большим транзакционным объектом
По большому транзакционному объекту
56. Wanted: надмодельный SQL
Различающий «большие» мастер-сущности, транзакционные объекты и «словари»
Поддерживающий доменную типизацию, соединяющий только нужное и в правильную сторону
Трансформирующий DDL и DML в заданный класс модели (xNF → yDB)
Различающий сегменты (секции) в разных источниках
Взаимодействующий со стоимостными оптимизаторами различных СУБД
Работающий с классами эквивалентности SQL и переписывающий SQL
Основа-кандидат: Apache Calcite