⚡️ SpeedML - это библиотека Python, целью которой является ускорение процесса разработки конвейера машинного обучения.
Она объединяет часто используемые пакеты ML, такие как
• Github
@sqlhub
Она объединяет часто используемые пакеты ML, такие как
Pandas, NumPy, Scikit-learn, XGBoost и Matplotlib. SpeedML
также предоставляет функциональные возможности для автоматизированного EDA.pip install speedml
• Github
@sqlhub
❤9👍6🔥5
Для достижения этой цели Dolt использует Prolly Tree-хранилище схемы и данных, представленных в виде графа. Таким образом достигается контроль версий базы данных на уровне хранилища.
Контроль версий БД в стиле Git предоставляет ряд полезных фичей:
— Мгновенный откат к любому предыдущему состоянию
— Полный журнал аудита с возможностью запроса, содержащий все данные с момента их создания.
— Несколько развивающихся ветвей данных
— Возможность объединения ветвей данных
— Быстрая синхронизация с удаленными версиями для резервного копирования или децентрализованной совместной работы.
— Запрашиваемые различия (т. е. различия) между версиями
Механизм хранения Dolt построен на графе коммитов Prolly Trees в стиле Git. Схема таблицы и данные хранятся в Prolly Trees. Корни этих деревьев Prolly вместе с другими метаданными хранятся в графе коммитов, чтобы обеспечить контроль версий в стиле Git.
🔗 Подробнее можно почитать на официальной страничке
🔗Github
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍5❤2
This media is not supported in your browser
VIEW IN TELEGRAM
Когда речь идёт о базах данных, может всплыть сочетание «Требования ACID».
Давайте освежим в памяти, что же это значит
Требования ACID — набор требований, которые обеспечивают сохранность ваших данных.
Атомарность гарантирует, что каждая транзакция будет выполнена полностью или не будет выполнена совсем. Не допускаются промежуточные состояния.
Это свойство вытекает из предыдущего. Благодаря тому, что транзакция не допускает промежуточных результатов, база остается консистентной. Есть такое определение транзакции: «Упорядоченное множество операций, переводящих базу данных из одного согласованного состояния в другое». То есть до выполнения операции и после база остается консистентной (согласованной)
Во время выполнения транзакции параллельные транзакции не должны оказывать влияния на её результат.
Если пользователь получил подтверждение от системы, что транзакция выполнена, он может быть уверен, что сделанные им изменения не будут отменены из-за какого-либо сбоя. Обесточилась система, произошел сбой в оборудовании? На выполненную транзакцию это не повлияет.
🔗 Полезная статья на Хабре в тему
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍10❤3
🔥 Sweet-Viz - библиотека, которая предоставляет быструю визуализацию и анализ данных.
Основная фича
i
Основная фича
Sweet-Viz
— обширный HTML-дашборд с полезными представлениями и сводками данных, который генерируется выполнением всего одной строки кода.pip install sweetviz
i
mport sweetviz as sv
my_report = sv.analyze(my_dataframe)
my_report.show_html() # Default arguments will generate to "SWEETVIZ_REPORT.html"
▪Github
@sqlhub👍10🔥3❤2
Иногда внутри SQL-запроса возникает необходимость проверить наличие/отсутствие NULL-значения в некотором наборе полей:
a IS NOT NULL OR b IS NOT NULL OR c IS NOT NULL
Но то же самое по смыслу условие можно записать гораздо короче с помощью функции coalesce:
coalesce(a, b, c) IS NOT NULL
Немного изменим условие - заменим
OR
на AND
:a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL
Тут нам поможет ROW-конструктор:
(a, b, c) IS NOT NULL
Теперь заменим
IS NOT NULL
на IS NULL
:a IS NULL AND b IS NULL AND c IS NULL
Тут достаточно вспомнить из логики, что
(A and B)
эквивалентно not(not A or not B)
, а (A or B)
- not(not A and not B)
, поэтому легко применяем not
к варианту IS NOT NULL + OR:coalesce(a, b, c) IS NULL
Или с помощью ROW-конструктора:
(a, b, c) IS NULL
Остался последний вариант:
a IS NULL OR b IS NULL OR c IS NULL
Тут мы можем "обратить" вариант IS NOT NULL + AND:
NOT (a, b, c) IS NOT NULL
Заметьте, что пара
NOT
тут "не сокращается", иначе получился бы предыдущий вариант.Подробнее об особенностях работы со сложными выражениями тут — "PostgreSQL Antipatterns: вычисление условий в SQL". И ещё годная статья — "«Ленивый сахар» PostgreSQL"
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥10❤4
DELETE FROM your_table
WHERE rowid NOT IN (
SELECT MAX(rowid)
FROM your_table
GROUP BY column1, column2, ...
);
DELETE FROM your_table
WHERE column1 IS NULL OR column2 IS NULL;
UPDATE your_table
SET column1 = 'default_value'
WHERE column1 IS NULL;
UPDATE your_table
SET column1 = UPPER(column1);
UPDATE your_table
SET column1 = TRIM(column1);
UPDATE your_table
SET date_column = TO_DATE(date_string, 'YYYY-MM-DD');
SELECT EXTRACT(YEAR FROM date_column) AS year,
EXTRACT(MONTH FROM date_column) AS month,
EXTRACT(DAY FROM date_column) AS day
FROM your_table;
Эти запросы могут помочь вам привести датасет в порядок, используйте)
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥9❤6👎2🥰2
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ Rexi — полезный инструмент для тестирования регулярных выражений прямо из терминала
Инструмент написан Python, на основе библиотеки
▪ Поддерживает оценку регулярных выражений в режимах
▪Предлагает мгновенную обратную связь по результатам сопоставления или поиска.
▪Github
@sqlhub
Инструмент написан Python, на основе библиотеки
textual
. Он предлагает дружелюбный интерфейс для интерактивной работы с регулярными выражениями.▪ Поддерживает оценку регулярных выражений в режимах
match или finditer.
▪Предлагает мгновенную обратную связь по результатам сопоставления или поиска.
▪Github
@sqlhub
❤8👍2🔥1
Периодически в коде запросов и "заточенных" под них индексов наблюдаю примерно подобные куски:
coalesce("Фамилия", '') || ' ' || coalesce("Имя", '') || ' ' || coalesce("Отчество", '')
Понятно, что тут хотели обезопасить себя от заполненности любого из полей NULL-значением, чтобы случайно вся строка не заNULL'илась.
Правда, тут возникают некоторые артефакты в виде "висящих пробелов" типа
' Иван Иванович'
или 'Иванов Иван '
.Но ведь есть решение изящнее и проще - функция concat_ws:
concat_ws(' ', "Фамилия", "Имя", "Отчество")
RTFM!
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥10❤5👎1
├── Пересмотр покрывающих индексов
├── Частичные индексы для отфильтрованных данных
└── Стратегии индексирования для соединений
├── Пересмотр подзапросов к JOIN'ам
├── Общие табличные выражения (CTE) и рекурсивные запросы
└── Ограничение наборов результатов с помощью OFFSET-FETCH
├── Выбор кандидатов на денормализацию
├── Создание денормализованных таблиц
└── Баланс между согласованностью данных и производительностью
├── Временные таблицы для промежуточных результатов
├── Создание и наполнение временных таблиц
└── Временные таблицы и агрегации
├── Оптимизация подзапросов
└── Оптимизация агрегаций
├── Операции на основе множеств
├── Пакетная обработка
└── Оптимизация циклов с помощью операций на основе множеств
Примеры некоторых из этих приёмов
Пересмотр подзапросов к JOIN'ам.
Оригинальный подзапрос:
SELECT * FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE region = 'West');
Переписан с использованием JOIN:
SELECT e.* FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id
WHERE d.region = 'West';
Общие табличные выражения (CTE) предоставляют удобный способ упростить сложные запросы и улучшить их читаемость:
WITH RecursiveCTE AS (
SELECT employee_id, first_name, manager_id, 0 AS depth
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.employee_id, e.first_name, e.manager_id, rc.depth + 1
FROM employees e
INNER JOIN RecursiveCTE rc ON e.manager_id = rc.employee_id
)
SELECT * FROM RecursiveCTE;
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27❤5🔥3🤔1
💎 Шпаргалки для всех: сокровищница знаний
Этот ресурс - настоящее сокровище для любого разработчика.
В нем содержится около 6000 разнообразных шпаргалок в виде изображений: от программирования и работы с базами данных до софт-скиллов.
Здесь вы найдете не только классические шпаргалки по регулярным выражениям и SQL, но и информацию о кофейных напитках, командах в Minecraft и французской грамматике.
▪ Смотреть
@sqlhub
Этот ресурс - настоящее сокровище для любого разработчика.
В нем содержится около 6000 разнообразных шпаргалок в виде изображений: от программирования и работы с базами данных до софт-скиллов.
Здесь вы найдете не только классические шпаргалки по регулярным выражениям и SQL, но и информацию о кофейных напитках, командах в Minecraft и французской грамматике.
▪ Смотреть
@sqlhub
❤11👍6🔥2
Для того чтобы проверить наличие записи, используйте оператор
EXISTS
:IF EXISTS (SELECT 1 FROM ваша_таблица WHERE ваш_столбец = ваше_значение)
PRINT 'Запись существует';
ELSE
PRINT 'Запись не найдена';
Замените
ваша_таблица
, ваш_столбец
и ваше_значение
релевантными данными. Этот способ является эффективным для поиска записей.SELECT COUNT(*)
для проверки наличия записи может показаться удобным, однако это не всегда эффективный подход, особенно при работе с обширными базами данных.В MS SQL Server целесообразно использовать
SELECT TOP 1
для сохранения ресурсов:IF EXISTS (SELECT TOP 1 1 FROM ваша_таблица WHERE ваш_столбец = ваше_значение)
PRINT 'Запись существует';
В MySQL и PostgreSQL применяйте
LIMIT 1
для ограничения выборки:SELECT 1 FROM ваша_таблица WHERE ваш_столбец = ваше_значение LIMIT 1;
Такие запросы быстро останавливают выполнение, как только найдено первое соответствие.
SELECT COUNT(*)
. Несмотря на то что многие СУБД оптимизируют SELECT COUNT(*)
, в работе не все из них показывают одинаковую эффективность. В случае сомнений используйте EXISTS
или LIMIT/TOP
.@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥6❤3
PostgreSQL 16 вносит немало улучшений в планировщик запросов и позволяет выполнять многие SQL-запросы быстрее, чем в предыдущих версиях PostgreSQL.
Вот некоторые из изменений:
DISTINCT
ORDER BY
или DISTINCT
, использовать предварительно отсортированные данныеUNION ALL
anti-join
с ненулевым входом в качестве внутреннего отношенияFULL
и RIGHT OUTER
хэш-соединенияROWS
, когда режим RANGE
активен, но не нуженntile()
, cume_dist()
и percent_rank()
left join
и unique joins
в секционированных таблицахLimit
вместо Unique
для реализации DISTINCT
, когда это возможноselect_outer_pathkeys_for_merge()
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍8🔥3🤔2