Синтаксический анализ SQL-запросов предоставляет сверхспособности для мониторинга работоспособности данных. В этом посте описывается, как начать работу с синтаксическим анализом SQL для наблюдаемости данных.
История запросов хранилища данных-это богатый источник информации о том, как данные используются в вашей организации. Многие аспекты наблюдаемости данных можно отслеживать, анализируя историю запросов. Например, анализ истории запросов может извлечь:
- Популярные таблицы и столбцы
- Неиспользуемые таблицы и столбцы
- Свежесть запросов
Эта статистика также помогает автоматизировать общие задачи разработки данных, такие как:
- Резервное копирование и аварийное восстановление
- Проблемы с качеством данных сортировки
- Отслеживание конфиденциальных данных и способов их использования.
Проблемы и подходы
Язык SQL является стандартом ISO/IEC, а последняя версия - SQL2016. Однако каждая база данных реализует стандарт по-разному, использует разные имена функций для одной и той же операции и имеет расширения для доступа к определенным пользовательским функциям. Поэтому не существует одного SQL-парсера для диалектов всех популярных баз данных и хранилищ данных.
Регулярные выражения-популярный подход к извлечению информации из операторов SQL. Однако регулярные выражения быстро становятся слишком сложными для обработки общих функций, таких как WITH, подзапросы. Sqlparse-это популярный пакет Python, который использует регулярные выражения для анализа SQL.
Альтернативный подход заключается в реализации грамматики SQL с использованием генераторов синтаксических анализаторов, таких как ANTLR. Существуют аналогичные генераторы парсеров с открытым исходным кодом на других популярных языках.
Существует несколько проектов, которые поддерживают парсеры для популярных баз данных с открытым исходным кодом, таких как MySQL и Postgres. Существуют платформы SQL-парсера/оптимизатора, такие как Apache Calcite, которые помогают уменьшить усилия по реализации диалекта SQL по вашему выбору.
Парсеры с открытым исходным кодом
Некоторые популярные базы данных и хранилища данных с открытым исходным кодом:
MySQL/MariaDB
- Pingcap parser-это MySQL-парсер в Go.
- sql-parser в phpmyadmin-это проверяющий SQL-лексер и парсер с акцентом на диалект MySQL.
Postgres
libpg_query извлекает парсер (написанный на C) из проекта postgres и упаковывает его как автономную библиотеку. Эта библиотека обернута на других языках другими проектами, такими как:
- Python: pglast
- Ruby : pg_query
- Golang: pg_query_go
- JS: psql-parser в Node и pg-query-emscripten в браузере
- Rust: pg_query.rs
Несколько движков
- queryparser реализует диалекты Apache Hive, Presto/Trino и Vertica.
- zetasql реализует диалекты BigQuery, Spanner и Dataflow.
Общие парсеры
- Python: sqlparse
- Rust: sqlparser-rs
- Python: mo-sql-parsing
Платформы
Платформы Parser/Optimizer реализуют общие функции языка SQL и позволяют настраивать его как первоклассную функцию платформы. Два популярных проекта с открытым исходным кодом:
- Apache Calcite-популярный парсер/оптимизатор, который используется в популярных базах данных и механизмах запросов, таких как Apache Hive, BlazingSQL и многих других.
- JSqlParser может анализировать несколько диалектов SQL, таких как MySQL, Postgres и Oracle. Грамматика может быть изменена для поддержки других диалектов SQL.
Apache Calcite позволяет настраивать в различных точках процесса синтаксического анализа.
- Правила синтаксического анализатора могут быть изменены для поддержки пользовательского синтаксиса.
- Такие соглашения, как кавычки против двойных кавычек, чувствительность к регистру.
- Добавить правила оптимизатора.
Практические советы по началу работы
Есть много заброшенных SQL-парсеров с открытым исходным кодом. Первый фильтр-использовать проект, который будет поддерживаться в будущем. Для популярных баз данных, таких как Postgres и MySQL/MariaDB, существуют парсеры, доступные на нескольких языках программирования.
Что делать, если для вашей базы данных нет парсера?
Большинство команд не создают парсер с нуля. Популярным вариантом является использование синтаксического анализатора Postgres, а затем добавление пользовательского синтаксиса SQL. Примерами являются AWS Redshift, Vertica и DuckDB. Используйте SQL-парсер Postgres для анализа истории запросов этих баз данных для анализа большинства запросов.
Многие запросы не будут проанализированы, например, ВЫГРУЗКА в AWS Redshift. Если важно также проанализировать варианты, рассмотрите возможность изменения проектов, чтобы принять пользовательскую грамматику ИЛИ использовать платформу, такую как Apache Calcite.