- PVSM.RU - https://www.pvsm.ru -

В IT-проектах код пишут все. Инженеры с помощью нескольких строк управляют Kubernetes кластерами, разгоняют облака Terraform'ом и ворочают тонны конфигураций на Ansible, Chef и Puppet. QA пишут понятные бизнесу тестовые сценарии на Spock и Cucumber. Аналитики свободно, часто лучше разработчиков, разговаривают на SQL. Проектная документация в форматах Markdown, AsciiDoc или LaTEX "компилируются" в нужный формат на билд-сервере. Ну а сами разработчики, эти укротители кода, владеют сразу россыпью языков на каждый жизненный случай — клиентский, серверный, скриптовый, функциональный и пр.
Код уже давно перестал быть загадочной тарабарщиной и теперь в том или ином виде доступен и понятен многим, даже премьер-министрам [1]. И весь этот код участвует в стандартном жизненном цикле — находится под управлением VCS, подвергается code review, автоматизированному тестированию, CI, CD. Используются общие инструменты и подходы, метрики производительности и качества. А все вместе это носит гордое название — "Everything as code".
Однако мир БД традиционно стоит особняком вдалеке от этой феерии прогресса и технологий. Процесс разработки и сопровождения БД не меняется годами и продолжает вселять ужас и страх в разработчиков, администраторов и пользователей по всему миру. Но возможно ли представить БД в виде обычного кода? Приблизиться к основному процессу разработки, использовать общие инструменты и подходы? Об этом под катом.
Большинству из нас ежедневно, хотим мы этого или нет, приходится сталкиваться с самыми разными БД. Проектировать, разрабатывать, администрировать, решать проблемы с производительностью, конкурентным доступом и вот это все. При этом требования к сбору, обработке и хранению данных постоянно ужесточаются — для одних нужна 100% консистентность, для других нет. Одни хранятся годами, другие несколько секунд. Потеря одних приведет к миллионным убыткам, тогда как потеря других не будет заметна для бизнеса.
В связи с этим давно появился и успешно используется подход Polyglot Persistence [2], в результате чего встретить в наши дни на каком-нибудь проекте одну единственную СУБД будет большой удачей. Вместо этого для каждой конкретной задачи подбирается наиболее подходящая база, без попыток как-то выкрутиться и решить все свои проблемы на старой доброй реляционке. А, например, микросервисная архитектура позволяет изолировать работу с конкретной СУБД в рамках одного сервиса и выжать из нее максимум пользы, без вреда для чистоты архитектуры всего проекта. В итоге "Реляционка" (куда ж без неё) + "Key-value DB" + "Wide Column DB" + "Document-oriented DB" + "Search engine DB" + "Graph DB" + "Какая-то еще DB" = "SUCCESS!". Помимо этого, увеличивается количество экземпляров (инстансов) этих БД — шардинг, репликации, распределенные СУБД. Плюс все это надо "растянуть" и поддерживать в разных средах — разработческой, тестовой, продовой и пр.
Чтобы не быть голословным, приведу несколько выдержек из свежего соцопроса от компании-гиганта по решениям в области управления и разработки БД Quest Software — Проблемы DBA: Тренды в администрировании БД [3] (чтобы скачать, придется пройти несложную регистрацию, но оно того стоит):
Не секрет, что для эффективной работы с той или иной СУБД необходимы специализированные инструменты, такие, как IDE и DB-менеджеры, средства мониторинга, моделирования, миграции схем и многое другое. Однако большая часть таких инструментов и сред были придуманы и разработаны еще в те славные времена, когда любому проекту с головой хватало одной-единственной реляционной СУБД, а таких модных слов, как "Agile", "DevOps" и "CI/CD", еще не придумали. И с тех пор мало что изменилось, т.к. область разработки и сопровождения БД всегда являлась достаточно закрытой и консервативной, а у большинства разработчиков ассоциируются с чем-то древним, сложным и непонятным. Сегодня же, когда практически в любом проектном хозяйстве трудится сразу несколько самых разношерстных СУБД и десятки/сотни их инстансов, обычные повседневные проблемы разработчиков и DBA становятся еще более острыми.
Традиционно самым популярным и незаменимым инструментом для работы с БД являются всевозможные IDE. Обычно это комплексное решение, которое объединяет под своим интерфейсом, в основном графическим, самые разные функции для разработки и администрирования в единую рабочую среду, делает нашу работу с БД более продуктивной и комфортной — остается только клацнуть мышью на нужном пункте меню. И действительно, мало кто из нас обходится без таких крутых штук, как EMS SQL Manager [4], Toad [5], dbForge [6] и многих других [7].
Одной из главных проблем таких "коробочек" является то, что под прессом новых фич и новых СУБД (которые не прекращают появляться на рынке) они получаются довольно сложными и продолжают усложняться с каждым разом. Причем как в использовании (зачастую людям приходится осваивать не особенности работы конкретной СУБД, а хитрости и фичи самой IDE), так и в их реализации (поэтому такие системы обычно закрытые и очень платные). Даже многими (включая меня) любимый DBeaver [8], флагман среди open sourse DB IDE, предоставляет поддержку NoSQL-решений (а какой проект сейчас обходится без них) только в своей Enterprise версии [9]. В добавок ко всему этому сохраняется неиллюзорный риск того, что поддержку какой-либо очень нужной и интересной функциональности СУБД можно не дождаться в скором времени, пока разработчики IDE не посчитают нужным ее впилить (а могут вообще не посчитать и не впилить).
В ответ на сложившуюся ситуацию сами пользователи зачастую не дожидаются пока появится нужная фича или поддержка новой СУБД, а решают поступающие проблемы самостоятельно и наиболее подходящим для себя и своего проекта способом. GitHub просто кишит такими решениями разной степени сложности. В основном это наборы sql-скриптов на все случаи жизни (dataegret/pg-utils [10], NikolayS/postgres_dba [11], gwenshap/Oracle-DBA-Scripts [12], ktaranov/sqlserver-kit [13], lestatkim/opensql [14]). Или консольные утилиты, такие, как top-подобные pg_activity [15] и pgcenter [16]. А также всевозможные web-based тулзы, начиная от вполне самостоятельных клиентов и средств мониторинга (pg_web [17], pg_hero [18]) и заканчивая, например, просто html-обертками над системными таблицами (pg_web_stats [19], pg_stats_viewer [20]). В результате чего складывается целый класс решений вида "programmers-for-programmers", "DBA-for-DBA", с помощью которых простые, и не очень, пользователи СУБД делятся своим опытом друг с другом непосредственно.
Похожая картина когда-то давным-давно наблюдались в области администрирования серверов и управления конфигурациями ПО. Тогда с постоянным появлением новых требований и технологий инфраструктура проектов стала заметно усложняться, резко увеличивалось количество серверов и софта, на нем работающего. А также появилась необходимость более частой, а затем и непрерывной поставки ПО с новыми бизнес-фичами заказчику. Существующие средства для конфигурирования и управления всем этим хозяйством плохо справлялись, в результате чего появился подход "Infrastructure as Code" и такие инструменты, как Ansible, Chef, Salt, Puppet и др., где конфигурирование инфраструктуры осуществляется на специальном DSL. Что даёт больше гибкости и свободы творчества. А код на таком DSL участвует в стандартном жизненном цикле наряду с основным кодом приложения (на Java, C#, Ruby или любом другом языке программирования), а именно — хранится в системе контроля версий (со всеми вытекающими — брэнчи, форки, code review), собирается в билды на сервере сборок, запускаются автоматические тесты и пр.
В дальнейшем влияние такого подхода стало заметно и в других областях:
Все больше людей уже не боятся писать код, это становится нормой. Это дает возможность более гибкой конфигурации, а также позволяет использовать общие инструменты (контроль версий, метрики, визуализация, отчеты, тестирование и пр.) в общем флоу. Во многих специализированных инструментах графический интерфейс заменяется или дополняется более гибким программным интерфейсом, различными DSL и конфигурационными файлами.
Более подробную информацию на эту тему можно найти в докладе Александра Тарасова (aatarasoff [33]) "Everything as a Code" [34].
А что на этот счет в бескрайнем мире баз данных? Набрав в Google простое словосочетание "Database as code [35]", я не нашел ничего интересного, кроме одного-единственного (но зато какого!) поста на DZone — "Database as Code: a Novel Concept [36]".
Мы много говорим о database-first подходе. Мы много говорим о том, что данные — это самый ценный актив предприятия. Но как насчет концепции, представленной Dan North [37] на третьем слайде его презентации [38]? Что если относиться к базе данных как к коду?
Звучит заманчиво, а на слайдах #5 и #6 (к сожалению, видео я не нашел) описываются 2 подхода к управлению схемой БД "через код" — через инкрементальные миграции (Liquibase, Flyway) и идемпотентные DDL-скрипты (Redgate [39]). Таким образом, схема — это тоже код, она находится под контролем VCS, собирается на билд-сервере, выполняются автоматические тесты и все такое.
Что нам необходимо, чтобы изменить наше в области работы с базами данных? Мы должны прекратить относиться к нашей БД как к магическому артефакту или как к уникальному сценарию и взглянуть на нее под тем же углом, что мы смотрим на обычный код нашего приложения.
Снова мощно сказано, у меня аж слезы на глазах наворачиваются. К сожалению, и в докладе, и в самом посте, "как код" рассматриваются только изменения схемы БД (миграция схем БД):
Мы относимся к исходному коду нашего приложения как к сокровищу. И это абсолютно верно, код — это сердце любого приложения. Но не должны ли изменения базы данных также находиться под управлением системы контроля версий, быть автоматизированными, быть готовыми к релизу по первому требованию и подчиняться "DevOps-законам", как и основной код?
Но минуточку...
Большинство современных СУБД предоставляют свой язык запросов, с помощью которого мы можем не только получать и изменять хранящиеся в ней данные (т.н. DML) и оперировать их схемой (т.н. DDL), а вообще получить (не побоюсь этого слова) любую метаинформацию о текущей БД и ее состоянии (из системных таблиц и представлений) и выполнять практически любые операции над ней (запустить БД, остановить, перевести в read only, собрать статистику, управлять памятью и пр). И такой код тоже вполне себе подходит под концепцию, описанную в предыдущем параграфе.
А когда речь заходит о БД и языке запросов, то первым в голову приходит, конечно же, старый и добрый SQL. Но можем ли мы рассчитывать на него (а заодно и на реляционные БД, с которыми у большинства он плотно ассоциируется) сейчас и в ближайшем будущем, учитывая огромный рост спроса на NoSQL-решения?
Вы можете справедливо меня спросить — о каком вообще SQL я тут разговариваю в эпоху NoSQL и schemaless databases, когда "пыльные реляционки доживают свой век исключительно в кровавом легаси Ынтерпрайзе". Ранний Хабр (как лакмусовая бумажка трендов в мире технологий) тоже когда-то был наполнен негативом по отношению к SQL и реляционкам и предвещал их скорейшую гибель (в скобках указаны количество голосов, а через слеш — количество комментариев):
Однако примерно с 12-года настроение на Хабре заметно меняется:
При этом анти-sql'ные и антиреляционные настроения продолжают иметь место, но реакция сообщества на них уже совершенно другая:
Подтверждение этих настроений можно найти в недавних докладах Константина Осипова (kostja [52]) "NewSQL: SQL никуда не уходит" [53] и Андрея Николаенко "Нереляционный SQL" [54]. Возьму на себя ответственность привести краткое резюме из обоих выступлений:
Дальше приведу еще немного аргументов, но если и так все понятно, то можно смело переходить к следующему параграфу.
История баз данных в "No-нотациях": [82]
Также в последнее время появляется много новых и модных СУБД, которые являются «надстройками» над известными и проверенными реляционными СУБД. Например Postgres-based (Timescale [83] и ToroDB [84]), MySQL-based (RadonDB [85]) и даже на базе sqllite (которая всегда позиционировалась как простая и надежная embedded-база) появился rqlite [86] – «легкое распределенное реляционное хранилище». Либо реализуют интерфейс какой-либо популярной базы (например, MySQL для InfiniDB [87] и TiDB [88]). Такой подход хорош тем, что при новой модели данных мы остаемся на той же привычной платформе, которую знаем как конфигурировать и администрировать.
Ну а для совсем уж "безсхемных" ребят тоже есть попытки создать общий универсальный язык "а-ля SQL", как, например, Eclipse JNoSQL [89], а точнее — его подпроект JNoSQL Aphrodite [90].
Google, который и является одним из родоначальников NoSQL-движения, также делает все больше акцентов на SQL. Сначала это был Spanner [91], а теперь активно развивается BigQuery [92]:
SQL-интерфейсами обзаводятся не только хранилища и обработчики данных. Например, с помощью osquery [93] (от самого Facebook) и fsql [94] на языке SQL можно получить много всякой полезной информацию из любой ОС или выполнять различные операции с файловыми системами.
В общем, SQL вполне комфортно себя чувствует в современных условиях, в том числе далеко за пределами реляционок. Практически с любым источником данных можно "поговорить" на SQL или SQL-like языке, получить нужную информацию о данных или метаданных хранилища и выполнять какие-либо операции (например, что-нибудь создать, удалить, запустить, остановить и пр.)
Здесь и далее (для удобства и с вашего разрешения) под "SQL" я буду подразумевать не только "тот самый" стандартный реляционный SQL, но и все его подвиды (в т.ч. далеко не реляционные), да и вообще любой встроенный в БД QL, с помощью которого можно сделать что-нибудь полезное.
А к тому, что в далеком 92-м году появился замечательный ANSI-стандарт [95], согласно которому любая реляционная СУБД обязана уметь описывать свою внутреннюю структуру в специальной схеме — Information schema [96]. Т.о. с помощью стандартного языка запросов к служебным таблицам/представлениям можно получить метаданные любой БД — как в ней содержатся схемы, таблицы, индексы, колонки и пр. Но на самом деле одной схемой данных это не ограничивается, и таким же образом (пусть уже и за пределами стандарта) можно получить информацию о процессах, сессиях, планах выполнения запросов, дисковой подсистеме, утилизации памяти и еще много чего другого.
Несмотря на то, что этот стандарт появился почти четверть века назад и только для реляционных БД, почти все современные NoSQL и NewSQL базы тоже реализовывают что-то похожее. Например, в Cassandra есть сразу несколько системных схем [97] (а точнее keyspace'ов – system, system_auth, system_schema, system_traces), доступ к которым можно получить с помощью уже упоминавшегося CQL. В ClickHouse есть специальная схема «system» [98]. Разработчики из CockroachDB вообще замахнулись на реализацию стандартной information_schema [99]. И даже документный Mongo радует нас системными коллекциями [100].
При этом наблюдается постоянный рост количества и расширение таких системных представлений. Например, в Postgresql (как БД с одним из самых активных сообществ) помимо реализации самой information_schema, собственной схемы pg_catalog и pg_stat-представлений имеет несколько официальных расширений в виде преставлений pg_stat_statements [101] и pg_buffercache [102]. А также дополнительные сторонние представления, такие как pg_active_session_history [103], pg_store_plans [104] и pg_stat_kcache [105].
Практически любому узлу соответствует какая-либо системная таблица, которая отображает его структуру и/или состояние. То есть о своем внутреннем устройстве и состоянии БД может рассказать сама посредством своего языка запросов. Помимо этого многие СУБД предоставляет возможность с помощью своего языка запросов не только получить полезные метаданные, но и выполнять служебные операции — что-нибудь остановить, запустить, очистить, собрать статистику и пр. Так в некоторых СУБД команду "ALTER" можно применить не только к таблицам или колонкам, но и к другим объектам, например, к сессии ("alter session set sql_trace = true"), датафайлам ("alter tablespace add datafile") или системе целиком ("alter system kill session").
Знание этих таблиц и запросов поможет как в разработке и администрировании, так и в освоении очередной новой СУБД. Понятно, что в одних базах такие возможности весьма развиты, и "кодом" можно сделать практически все, а в других гораздо скромнее, но определенно имеет место тенденция того, что все больше разработчиков СУБД будут развивать такие возможности в своих продуктах, а мы сможем более эффективно их эксплуатировать.
К сожалению, SQL уже давно и прочно воспринимается многими как язык "низкого уровня", некий "байт-код" для БД. Который не принято, а в некоторых обществах даже глубоко неприлично "писать руками" и вообще каким-либо образом контактировать с ним. Мы уже давно привыкли, что многочисленные DB-тулзы и фреймворки сами генерируют и выполняют за нас "хитрые и сложные" SQL-запросы к системе, и за этим процессом остается только наблюдать. Но давайте выйдем из зоны комфорта теплых ламповых графических интерфейсов и кодогенераторов и посмотрим на наши СУБД с точки зрения обычного кода. Тем более, что все необходимое для этого у нас есть.
Теперь по делу. Пользователи любой СУБД имеют возможность описать практически все аспекты работы со своей БД в виде кода, на простом, понятном и привычном многим языке. Это может быть не обязательно ANSI SQL, а любой SQL-like диалект, либо вообще свой собственный встроенный QL или API, в зависимости от используемой БД. Чем это полезно?
Интересно ваше мнение на этот счет, пишите в комментариях — будем обсуждать.
В следующем посте я планирую на конкретных примерах проиллюстрировать описанные выше идеи, а также расскажу о том, как мы в КРОК пробуем применить их в экспериментальном графическом DB-manager'е с открытым исходным кодом, который разрабатывается в рамках одного из исследовательских проектов.
Автор: mgramin
Источник [106]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/database/296941
Ссылки в тексте:
[1] даже премьер-министрам: https://habr.com/post/365479
[2] Polyglot Persistence: https://martinfowler.com/bliki/PolyglotPersistence.html
[3] Проблемы DBA: Тренды в администрировании БД: https://www.quest.com/whitepapert/dbas-face-new-challenges-trend-in-database-administration-8130482/?param=Atii%2ffmTEZXy3nsJCa8V2slf6pUG3GyWRs4yK0H%2bV6eEA3JvCMN6imQzO6W2bLiUWqUKi%2bW%2fcZDlHt9xcpineQe34qfhI%2fxmFNM%2bR1Lye3mqBj%2bAUJ%2blCEyy6ElMpd0V9TsUl2jmB%2bus2JWKueJPKpfOTZwfIQIph%2fKKTtJodIaxNKDJEO78PNp9lNVT31hOyl1BapipycPunpxrcTDM8VtEfl%2bWl3gsXbaH2V5Dk24%3d
[4] EMS SQL Manager: https://www.sqlmanager.net/ru/products/manager
[5] Toad: https://www.quest.com/toad
[6] dbForge: https://www.devart.com/dbforge
[7] многих других: https://github.com/mgramin/awesome-db-tools#ide
[8] DBeaver: https://github.com/dbeaver/dbeaver
[9] только в своей Enterprise версии: https://dbeaver.com/edition
[10] dataegret/pg-utils: https://github.com/dataegret/pg-utils
[11] NikolayS/postgres_dba: https://github.com/NikolayS/postgres_dba
[12] gwenshap/Oracle-DBA-Scripts: https://github.com/gwenshap/Oracle-DBA-Scripts
[13] ktaranov/sqlserver-kit: https://github.com/ktaranov/sqlserver-kit
[14] lestatkim/opensql: https://github.com/lestatkim/opensql
[15] pg_activity: https://github.com/julmon/pg_activity
[16] pgcenter: https://github.com/lesovsky/pgcenter
[17] pg_web: https://github.com/sosedoff/pgweb
[18] pg_hero: https://github.com/ankane/pghero
[19] pg_web_stats: https://github.com/kirs/pg_web_stats
[20] pg_stats_viewer: https://github.com/nordicdyno/pg_stats_viewer
[21] Spock: http://spockframework.org
[22] Cucumber: https://cucumber.io
[23] Gatling: https://gatling.io
[24] Postman: http://blog.getpostman.com/2017/10/25/writing-tests-in-postman
[25] Jenkins pipeline: https://jenkins.io/doc/book/pipeline
[26] PlantUML: http://en.plantuml.com
[27] Graphviz: https://www.graphviz.org
[28] Mermaid: https://github.com/knsv/mermaid
[29] flowchart.js: https://github.com/adrai/flowchart.js
[30] DNSControl: https://github.com/StackExchange/dnscontrol
[31] OctoDNS: https://github.com/github/octodns
[32] reveal.js: https://github.com/hakimel/reveal.js
[33] aatarasoff: https://habr.com/users/aatarasoff/
[34] "Everything as a Code": https://youtu.be/_Zm8ORdNT0Y
[35] Database as code: https://www.google.ru/search?q=Database+as+code
[36] Database as Code: a Novel Concept: https://dzone.com/articles/database-as-code-a-novel-concept
[37] Dan North: https://twitter.com/tastapod
[38] презентации: https://speakerdeck.com/tastapod/arent-we-forgetting-someone?slide=1
[39] Redgate: https://www.red-gate.com/products/sql-development/sql-compare
[40] мышление: http://www.braintools.ru
[41] «MongoDB или как разлюбить SQL»: https://habr.com/post/74144
[42] «Точка сбора NoSQL»: https://habr.com/post/102532
[43] «Реляционные базы данных обречены?»: https://habr.com/post/103021
[44] «NoSQL базы данных: понимаем суть»: https://habr.com/post/152477
[45] «1000 раз подумать, прежде чем использовать noSQL»: https://habr.com/post/153859
[46] «NoSQL и Big Data – обман трудящихся?»: https://habr.com/company/jelastic/blog/166845
[47] «Почему вы никогда не должны использовать MongoDB» (+143/245): https://habr.com/post/231213
[48] «Почему SQL одерживает верх над NoSQL, и к чему это приведет в будущем»: https://habr.com/company/alconost/blog/340372
[49] "Нет, вам не нужно машинное обучение. Вам нужен SQL": https://habr.com/post/417581
[50] «Недостатки RDBMS или RDBMS vs NoSQL»: https://habr.com/post/236523
[51] «Не пора ли реляционным БД на свалку истории?»: https://habr.com/post/267079
[52] kostja: https://habr.com/users/kostja/
[53] "NewSQL: SQL никуда не уходит": https://youtu.be/_8OZcgOKUyk
[54] "Нереляционный SQL": http://www.highload.ru/2017/abstracts/3069.html
[55] CQL: http://cassandra.apache.org/doc/latest/cql/index.html
[56] AQL: https://www.aerospike.com/docs/tools/aql/
[57] N1QL: https://www.couchbase.com/products/n1ql
[58] Tarantool: https://tarantool.io/en/doc/2.0/tutorials/sql_tutorial
[59] ClickHouse: https://clickhouse.yandex/docs/en/query_language
[60] CrateDB: https://crate.io/docs/crate/reference/en/2.0/sql/index.html
[61] Amazon RDS: https://aws.amazon.com/ru/rds/
[62] Amazon Aurora: https://aws.amazon.com/ru/rds/aurora/
[63] Oracle Cloud: https://cloud.oracle.com/database
[64] Google Cloud SQL: https://cloud.google.com/sql/docs/
[65] Microsoft SQL Azure: https://azure.microsoft.com/ru-ru/services/sql-database/
[66] Alibaba Cloud ApsaraDB: https://www.alibabacloud.com/product/apsaradb-for-rds
[67] Yandex Managed Databases: https://cloud.yandex.ru/services/mdb
[68] Hive: https://hive.apache.org
[69] Impala: https://impala.apache.org
[70] Spark: https://spark.apache.org
[71] Kudu: https://kudu.apache.org/
[72] Presto: https://prestodb.io
[73] Phoenix: https://phoenix.apache.org/
[74] Flink: https://ci.apache.org/projects/flink/flink-docs-stable/dev/table/sql.html
[75] Samza: https://samza.apache.org/learn/tutorials/latest/samza-sql.html
[76] Storm: http://storm.apache.org/releases/current/storm-sql.html
[77] Apex: https://apex.apache.org/docs/malhar/apis/calcite/#sql-apis-for-apache-apex
[78] Kafka: https://www.confluent.io/blog/ksql-open-source-streaming-sql-for-apache-kafka
[79] CockroachDB: https://www.cockroachlabs.com
[80] FoundationDB: https://www.foundationdb.org/
[81] MemSQL: https://www.memsql.com
[83] Timescale: https://www.timescale.com
[84] ToroDB: https://www.torodb.com
[85] RadonDB: https://github.com/radondb/radon
[86] rqlite: https://github.com/rqlite/rqlite
[87] InfiniDB: http://infinidb.co
[88] TiDB: https://github.com/pingcap/tidb
[89] Eclipse JNoSQL: https://dzone.com/articles/using-domain-specific-language-to-manipulate-nosql
[90] JNoSQL Aphrodite: https://github.com/eclipse/jnosql-aphrodite
[91] Spanner: https://cloud.google.com/spanner
[92] BigQuery: https://ai.googleblog.com/2018/07/machine-learning-in-google-bigquery.html
[93] osquery: https://osquery.io
[94] fsql: https://github.com/kshvmdn/fsql
[95] ANSI-стандарт: https://en.wikipedia.org/wiki/SQL-92
[96] Information schema: https://en.wikipedia.org/wiki/Information_schema
[97] сразу несколько системных схем: https://docs.datastax.com/en/dse/6.0/cql/cql/cql_using/useQuerySystem.html
[98] специальная схема «system»: https://clickhouse.yandex/docs/en/system_tables
[99] реализацию стандартной information_schema: https://www.cockroachlabs.com/docs/stable/information-schema.html
[100] системными коллекциями: https://docs.mongodb.com/manual/reference/system-collections
[101] pg_stat_statements: https://www.postgresql.org/docs/current/static/pgstatstatements.html
[102] pg_buffercache: https://www.postgresql.org/docs/current/static/pgbuffercache.html
[103] pg_active_session_history: https://github.com/pgsentinel/pgsentinel
[104] pg_store_plans: https://github.com/ossc-db/pg_store_plans
[105] pg_stat_kcache: https://github.com/powa-team/pg_stat_kcache
[106] Источник: https://habr.com/post/333376/?utm_campaign=333376
Нажмите здесь для печати.