Производительность запросов в SQL
Использование OR внутри оператора JOIN или WHERE для нескольких столбцов.
SQL Server может эффективно обрабатывать набор данных, если используется оператор WHERE или любая комбинация фильтров, разделенных AND. Будучи исключающими, эти операторы берут данные и нарезают их на все более мелкие части, пока не останется нужный набор данных.
Оператор OR – совсем другая история. SQL Server не может обработать его за одну операцию. Вместо этого каждый компонент OR рассмотривается отдельно. Когда каждая такая затратная операция завершена, результаты объединяются.
Сценарий, в котором OR работает хуже всего, – это когда задействовано несколько столбцов или таблиц. Даже если используется всего несколько таблиц или столбцов, производительность может стать крайне низкой.
Давайте рассмотрим простой пример использования OR, который приводит к плохой производительности:
SELECT DISTINCT
PRODUCT.ProductID,
PRODUCT.Name
FROM Production.Product PRODUCT
INNER JOIN Sales.SalesOrderDetail DETAIL
ON PRODUCT.ProductID = DETAIL.ProductID
OR PRODUCT.rowguid = DETAIL.rowguid;
Читать дальше
@sqlhub
Использование OR внутри оператора JOIN или WHERE для нескольких столбцов.
SQL Server может эффективно обрабатывать набор данных, если используется оператор WHERE или любая комбинация фильтров, разделенных AND. Будучи исключающими, эти операторы берут данные и нарезают их на все более мелкие части, пока не останется нужный набор данных.
Оператор OR – совсем другая история. SQL Server не может обработать его за одну операцию. Вместо этого каждый компонент OR рассмотривается отдельно. Когда каждая такая затратная операция завершена, результаты объединяются.
Сценарий, в котором OR работает хуже всего, – это когда задействовано несколько столбцов или таблиц. Даже если используется всего несколько таблиц или столбцов, производительность может стать крайне низкой.
Давайте рассмотрим простой пример использования OR, который приводит к плохой производительности:
SELECT DISTINCT
PRODUCT.ProductID,
PRODUCT.Name
FROM Production.Product PRODUCT
INNER JOIN Sales.SalesOrderDetail DETAIL
ON PRODUCT.ProductID = DETAIL.ProductID
OR PRODUCT.rowguid = DETAIL.rowguid;
Читать дальше
@sqlhub
👍10
Трюк дня. COALESCE() для перезаписи NULL
При помощи функции COALESCE() можно перезаписать NULL на другое значение:
Запрос вернёт значение ‘missing‘ для всех строк таблицы, где null_var IS NULL
В mssql это делает функция isnull(null_var,'missing')
#tips
@sqlhub
При помощи функции COALESCE() можно перезаписать NULL на другое значение:
SELECT
id,
null_var,
COALESCE(null_var, 'missing') AS recode_null_var
FROM
current_table
ORDER BY id
Запрос вернёт значение ‘missing‘ для всех строк таблицы, где null_var IS NULL
В mssql это делает функция isnull(null_var,'missing')
#tips
@sqlhub
👍9
Друзья, для тех из вас кто хочет проверить свои знания в SQL запросах - у наших друзей из @sqlquestions сейчас как раз идет марафон SQL-задач.
Приходите, решайте задачи и общайтесь с любителями SQL.
Решай задачи
Приходите, решайте задачи и общайтесь с любителями SQL.
Решай задачи
Telegram
SQL задачи
Друзья, мы начинаем SQL марафон - серию задач по SQL.
Будет 15 задач.
1 задача в неделю.
Свои решения присылайте в комментариях к задачам. По итогу 15 задач, каждый увидит, сколько он смог решить правильно сам.
Мы создали для вас небольшой снипет(отрывок)…
Будет 15 задач.
1 задача в неделю.
Свои решения присылайте в комментариях к задачам. По итогу 15 задач, каждый увидит, сколько он смог решить правильно сам.
Мы создали для вас небольшой снипет(отрывок)…
👍6
Проблемы производительности запросов с EXISTS
Мне на самом деле нравится EXISTS и NOT EXISTS. Правда. Они решают множество проблем.
Эта публикация не является их общей критикой, и я ни в коем случае не призываю вас отказаться от них. Я бы посоветовал вам даже использовать их почаще.
Но есть некоторые моменты, о которых вам следует знать, когда вы их используете, будь то в логике потока управления или в запросах.
Если вы будете помнить о них, у вас все будет хорошо.
Читать дальше
@sqlhub
Мне на самом деле нравится EXISTS и NOT EXISTS. Правда. Они решают множество проблем.
Эта публикация не является их общей критикой, и я ни в коем случае не призываю вас отказаться от них. Я бы посоветовал вам даже использовать их почаще.
Но есть некоторые моменты, о которых вам следует знать, когда вы их используете, будь то в логике потока управления или в запросах.
Если вы будете помнить о них, у вас все будет хорошо.
Читать дальше
@sqlhub
👍4🥰1
Какой запрос возвратит работников с зарплатой >=2500 и <=4500?
Anonymous Quiz
56%
SELECT * FROM employees WHERE salary BETWEEN 2500 AND 4500;
6%
SELECT * FROM employees WHERE salary > 2499 AND < 4501;
12%
SELECT * FROM employees WHERE salary IN (2500, 4500);
19%
SELECT * FROM employees WHERE salary > 2499 AND salary < 4501;
8%
Посмотреть ответы
👍10
Трюк дня. Агрегирование записей в PostgreSQL
Таблица
Разница между датой окончания (
Напишите запрос, возвращающий даты начала и окончания каждого проекта, а также количество дней, затраченных на его выполнение. Расположите их в порядке возрастания продолжительности проекта, а в случае равенства - по возрастанию даты начала.
Код создания view исходной таблицы projects здесь.
Решение будет вечером.
#tips
Таблица
projects
содержит три столбца: task_id, start_date
и end_date
. Разница между датой окончания (
end_date
) и датой начала (start_date
) составляет 1 день для каждой строки таблицы. Если даты окончания задач последовательны, они являются частью одного проекта. Даты проектов не пересекаются.Напишите запрос, возвращающий даты начала и окончания каждого проекта, а также количество дней, затраченных на его выполнение. Расположите их в порядке возрастания продолжительности проекта, а в случае равенства - по возрастанию даты начала.
Код создания view исходной таблицы projects здесь.
Решение будет вечером.
#tips
👍3
Трюк дня. Агрегирование записей в PostgreSQL. Решение
WITH projects (task_id, start_date, end_date)
AS (VALUES
(1, CAST('10-01-20' AS date), CAST('10-02-20' AS date)),
(2, CAST('10-02-20' AS date), CAST('10-03-20' AS date)),
(3, CAST('10-03-20' AS date), CAST('10-04-20' AS date)),
(4, CAST('10-13-20' AS date), CAST('10-14-20' AS date)),
(5, CAST('10-14-20' AS date), CAST('10-15-20' AS date)),
(6, CAST('10-28-20' AS date), CAST('10-29-20' AS date)),
(7, CAST('10-30-20' AS date), CAST('10-31-20' AS date))),
-- получим такие даты начала, которых не существует в колонке даты окончания (это 'настоящие' даты начала проекта)
t1 AS (
SELECT start_date
FROM projects
WHERE start_date NOT IN (SELECT end_date FROM projects) ),
-- получим такие даты окончания, которые не существуют в колонке дат начала (это 'настоящие' даты окончания проекта)
t2 AS (
SELECT end_date
FROM projects
WHERE end_date NOT IN (SELECT start_date FROM projects) ),
--отфильтруем допустимые пары начало-окончание (начало < окончание), затем найдем правильную дату окончания для каждой даты начала (минимальная дата окончания, поскольку нет пересекающихся проектов)
t3 AS (
SELECT
start_date,
MIN(end_date) AS end_date
FROM t1, t2
WHERE start_date < end_date
GROUP BY 1 )
SELECT
*,
end_date - start_date AS project_duration
FROM t3
ORDER BY 3, 1
#tips🥰2🤔2😢1
Какой оператор нужно вставить вместо [?], чтобы создать временную таблицу?
Anonymous Quiz
34%
TEMP
8%
37%
TEMPORARY
2%
ошибка
19%
ничего из перечисленного
👍8
Иерархические структуры данных и Doctrine
Хранение иерархических данных (или попросту — деревьев) в реляционных структурах задача довольно нетривиальная и вызывает некоторые проблемы, когда разработчики сталкиваются с подобной задачей.
В первую очередь, это связано с тем, что реляционные базы не приспособлены к хранению иерархических структур (как, например, XML-файлы), структура реляционных таблиц представляет из себя простые списки. Иерархические же данные имеют связь родитель-наследники, которая не реализована в реляционной структуре.
Тем не менее, задача хранить деревья в базе данных рано или поздно возникает перед любым разработчиком.
Ниже мы подробно рассмотрим, какие существуют подходы в организации хранения деревьев в реляционных БД, а также рассмотрим инструментарий, который нам предоставляет ORM Doctrine для работы с такими структурами.
Читать дальше
@sqlhub
Хранение иерархических данных (или попросту — деревьев) в реляционных структурах задача довольно нетривиальная и вызывает некоторые проблемы, когда разработчики сталкиваются с подобной задачей.
В первую очередь, это связано с тем, что реляционные базы не приспособлены к хранению иерархических структур (как, например, XML-файлы), структура реляционных таблиц представляет из себя простые списки. Иерархические же данные имеют связь родитель-наследники, которая не реализована в реляционной структуре.
Тем не менее, задача хранить деревья в базе данных рано или поздно возникает перед любым разработчиком.
Ниже мы подробно рассмотрим, какие существуют подходы в организации хранения деревьев в реляционных БД, а также рассмотрим инструментарий, который нам предоставляет ORM Doctrine для работы с такими структурами.
Читать дальше
@sqlhub
👍7
Forwarded from Анализ данных (Data analysis)
Автоматическое масштабирование БД в Kubernetes для MongoDB, MySQL и PostgreSQL
Читать
@data_analysis_ml
Читать
@data_analysis_ml
Telegraph
Автоматическое масштабирование БД в Kubernetes для MongoDB, MySQL и PostgreSQL
Автор оригинала: Dmitriy Kostiuk и Mykola Marzhan Стремясь к повышению производительности базы данных, вы можете столкнуться с ситуацией, когда оптимизации и настройки уже недостаточно. Если вы не можете заменить движок БД, а для настройки параметры рабочей…
🔥4
Отличаются ли в SQL операторы AND и & (амперсанд)?
Anonymous Quiz
6%
AND имеет более низкий приоритет, чем &
17%
Между ними нет отличий
45%
Оператор & не поддерживается стандартом SQL
9%
AND имеет более высокий приоритет, чем &
23%
Посмотреть ответы
👍13👎1🔥1
Колоночные базы данных
#nosql
"Колоночные базы данных позволяют эффективно делать сложные выборки на больших таблицах. Изменение структуры больших таблиц происходит мгновенно, а сжатие данных позволяет сэкономить кучу места. Однако не следует использовать колоночные базы для случаев с обычными выборками по ключу и известными структурами запросов. Для этого лучше подойдут обычные (строчные) СУБД."
Читать
@data_study
#nosql
"Колоночные базы данных позволяют эффективно делать сложные выборки на больших таблицах. Изменение структуры больших таблиц происходит мгновенно, а сжатие данных позволяет сэкономить кучу места. Однако не следует использовать колоночные базы для случаев с обычными выборками по ключу и известными структурами запросов. Для этого лучше подойдут обычные (строчные) СУБД."
Читать
@data_study
🔥6
5 полезных запросов для MS SQL
За 2 года работы с MS SQL у меня накопился перечень из 5 запросов: для поиска, отладки, агрегации и обработки множеств и таблиц.
https://tproger.ru/articles/5-poleznyh-zaprosov-dlja-ms-sql/
@sqlhub
За 2 года работы с MS SQL у меня накопился перечень из 5 запросов: для поиска, отладки, агрегации и обработки множеств и таблиц.
https://tproger.ru/articles/5-poleznyh-zaprosov-dlja-ms-sql/
@sqlhub
Tproger
5 полезных запросов MS SQL на каждый день
За 2 года работы с MS SQL у меня накопился перечень из 5 запросов: для поиска, отладки, агрегации и обработки множеств и таблиц.
👍7