Как стать автором
Обновить
2.6

Microsoft SQL Server *

Система управления реляционными базами данных

Сначала показывать
Порог рейтинга
Уровень сложности

Уровень изоляции «Repeatable Read»

Время на прочтение4 мин
Количество просмотров16K

Эта статья была опубликована на SQL.RU Другие опубликованные там статьи на тему MS SQL Server можно найти в блоге https://mssqlforever.blogspot.com/ Telegram-канал блога тут: https://t.me/mssqlhelp

По материалам статьи Craig Freedman: Repeatable Read Isolation Level

В двух предыдущих статьях (12) было продемонстрировано как запросы с уровнем изоляции «read committed» могли порождать неожиданные результаты. Это становилось возможным из-за выполняющихся в одно и то же время изменений затронутых запросом строк. Чтобы недопустить подобных неожиданностей (но не всех), следует использовать для выборки уровень изоляции «repeatable read». В этой статье мы как раз и рассмотрим как одновременные изменения ведут себя с уровнем изоляции «repeatable read» (повторяемое чтение).
В отличие от просмотра с «read committed», просмотр с «repeatable read» удерживает блокировки каждой затронутой строки до окончания транзакции. На всём протяжении транзакции заблокированными могут оказаться даже некоторые строки, которые не соответствуют выборке в результате запроса. Такое блокирование гарантирует, что затронутые запросом строки не будут изменены или удалены в параллельном сеансе, пока текущая транзакция не будет завершена (независимо от того, будет ли она зафиксирована или произойдёт её откат). Эти блокировки не защищают от изменения или удаления те строки, которые еще не были охвачены просмотром, и не препятствуют вставке новых строк межу уже заблокированными строками.

Читать далее
Всего голосов 4: ↑4 и ↓0+4
Комментарии0

План запроса с уровнем изоляции «Read Committed»

Время на прочтение6 мин
Количество просмотров3.3K

Эта статья была опубликована на SQL.RU Другие опубликованные там статьи на тему MS SQL Server можно найти в блоге https://mssqlforever.blogspot.com/ Telegram-канал блога тут: https://t.me/mssqlhelp

По материалам статьи Craig Freedman: Query Plans and Read Committed Isolation Level

В прошлый раз мы рассмотрели то, как одновременные изменения могут стать причиной просмотра на уровне изоляции read committed. Также было показано что эти условия могут привести к выборке одной и той же строки несколько раз или вообще к отсутствию строки в выборке.  Теперь давайте рассмотрим как одновременные изменения могут отразиться на работе более сложных планов запроса.

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии5

Read Committed Isolation Level

Время на прочтение3 мин
Количество просмотров8K

Эта статья была опубликована на SQL.RU Другие опубликованные там статьи на тему MS SQL Server можно найти в блоге https://mssqlforever.blogspot.com/ Telegram-канал блога тут: https://t.me/mssqlhelp

По материалам статьи Craig Freedman: Read Committed Isolation Level

В этой статье я рассмотрю используемый по умолчанию уровень изоляции транзакций: read committed. Когда SQL Server выполняет блок операторов с уровнем изоляции read committed, он последовательно накладывает совместную блокировку на записи, которые затрагивает запрос. Продолжительность действия этих блокировок довольно велика, за это время осуществляется чтение и последующие операции с каждой записью выборки. Как правило, сервер снимает блокировку с записи перед тем, как перейти к следующей. Таким образом, если вы выполняете простой оператор «SELECT» с «read committed» и наблюдаете за блокировками (например, с помощью sys.dm_tran_locks), вы, как правило, видите блокировку одной записи за каждую итерацию выборки. Цель этих блокировок является гарантия того, что данные не изменятся во время их считывания и возвращения оператором выборки. Нужда в подобных блокировках возникает потому, что изменения данных всегда приобретают эксклюзивную блокировку, которая блокирует любые операции чтения, пытающиеся наложить совместную блокировку.

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Scalar Subqueries

Время на прочтение6 мин
Количество просмотров2.4K

Эта статья была опубликована на SQL.RU Другие опубликованные там статьи на тему MS SQL Server можно найти в блоге https://mssqlforever.blogspot.com/ Telegram-канал блога тут: https://t.me/mssqlhelp

По материалам статьи Craig Freedman: Scalar Subqueries

Пример:

Скалярный подзапрос — это подзапрос, который возвращает одну строку. Для некоторых запросов сразу видно ,что они скалярные. 

Читать далее
Всего голосов 4: ↑4 и ↓0+4
Комментарии0

Истории

Semi-join Transformation

Время на прочтение4 мин
Количество просмотров835

Эта статья была опубликована на SQL.RU Другие опубликованные там статьи на тему MS SQL Server можно найти в блоге https://mssqlforever.blogspot.com/ Telegram-канал блога тут: https://t.me/mssqlhelp

По материалам статьи Craig Freedman: Semi-join Transformation

В предыдущих статьях я приводил примеры полу-соединений (semi-joins). Вспомним, что полу-соединение возвращает строку из таблицы, если для этой строки есть хотя бы одна совпадающая строка во второй таблице. Вот простой пример:

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Введение в секционирование таблиц

Время на прочтение5 мин
Количество просмотров3.8K

Эта статья была опубликована на SQL.RU Другие опубликованные там статьи на тему MS SQL Server можно найти в блоге https://mssqlforever.blogspot.com/ Telegram-канал блога тут: https://t.me/mssqlhelp

В этой статье я собираюсь продемонстрировать особенности планов исполнения запросов при обращении к секционированным таблицам. Обратите внимание, что существует большая разница между секционированными таблицами (которые стали доступны только с SQL Server 2005) и секционированными представлениями (которые были доступных ещё в SQL Server 2000, и по-прежнему доступны в SQL Server 2005 и последующих версиях). Особенности планов запросов к секционированным представлениям я продемонстрирую в другой статье.

Читать далее
Всего голосов 5: ↑5 и ↓0+5
Комментарии0

Parallel Hash Join

Время на прочтение5 мин
Количество просмотров1.5K

Эта статья была опубликована на SQL.RU Другие опубликованные там статьи на тему MS SQL Server можно найти в блоге https://mssqlforever.blogspot.com/ Telegram-канал блога тут: https://t.me/mssqlhelp

По материалам статьи Craig Freedman: Parallel Hash Join

SQL Server использует один из двух вариантов стратегии распараллеливания хэш-соединения. Наиболее часто встречается хэш-секционирование (Hash Partitioning). Реже можно встретить Broadcast-секционирование; эту стратегию часто называют "Broadcast hash join".

Хэш-секционирование

Типичное распараллеливания хеш-соединения включает распределение строк компановки (т.е. строк из первого входого потока) и пробных строк (т.е. строк из второго входного потока) между отдельными потоками хэш-соединения с использованием хэш-секционирования. Если строки компановки и пробы имеют одни и те же значения ключа (т.е. они участвуют в соединении), такие хэши гарантированно попадут в один и тот же поток хэш-соединения. После того как данные были секционированы по хэшам между потоками, все экземпляры хэш-соединений работают полностью независимо от соответствующих им наборов данных. Отсутствие любых межпоточных зависимостей гарантирует, что эта стратегия будет давать очень хорошую масштабируемость по мере повышения степени параллелизма (т.е. числа потоков).
Как и в других рассмотренных ранее примерах с параллелизмом, в этой статье используется достаточно большая таблица, что бы, работая с ней, оптимизатор выбирал параллельный план исполнения запроса. Если вы будете воспроизводить эти примеры у себя, учтите, что создание этой таблицы может затянуться на несколько минут.

Перевод Ирины Наумовой.

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии2

Parallel Nested Loops Join

Время на прочтение6 мин
Количество просмотров1.2K

Эта статья была опубликована на SQL.RU Другие опубликованные там статьи на тему MS SQL Server можно найти в блоге https://mssqlforever.blogspot.com/ Telegram-канал блога тут: https://t.me/mssqlhelp

По материалам статьи Craig Freedman: Parallel Nested Loops Join

SQL Server распараллеливает Nested Loops Join, распределяя в случайном порядке строки внешней таблицы по потокам вложенных циклов. В данном случае, речь идёт о строках, которые поступают первыми, и мы их видим вверху, на графическом плане запроса. Например, если на входе соединения вложенных циклов имеется два потока, каждый поток получит приблизительно половину строк. Потоки проходятся по строкам внутренней таблицы соединения (то есть, по строкам, поданным во вторую очередь, мы их видим ниже в плане запроса), точно по такому же алгоритму, как это было бы реализовано в сценарии с последовательной обработкой строк. Таким образом, для каждой обрабатываемой потоком строки внешней таблицы, поток обеспечивает соединение своей внутренней таблицы, используя эту строку в качестве источника коррелированных параметров. Это позволяет потокам работать независимо друг от друга. При этом для внутренней таблицы соединения вложенных циклов SQL Server не добавляет операторы параллелизма и работу с ней не распараллеливает.

Перевод Ирины Наумовой

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Распараллеленный Просмотр

Время на прочтение5 мин
Количество просмотров1.2K

По материалам статьи Craig Freedman: Parallel Scan

В этой статье я собираюсь рассмотреть то, как SQL Server распараллеливает просмотр таблицы (сканирования - scans). Оператор просмотра - один из немногих операторов, которые адаптированы к параллелизму. Большинство других операторов ничего не знают о параллелизме, и не заботятся о том, выполняются ли они параллельно; оператор просмотра является в этом случае исключением.

Перевод Ирины Наумовой.

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Оператор распараллеливания (Exchange)

Время на прочтение4 мин
Количество просмотров1.3K

По материалам статьи Craig Freedman: The Parallelism Operator (aka Exchange)

Как я уже писал в статье Введение в распараллеливание исполнения запроса , итератор параллелизма (или обмена - Exchange operator) фактически привносит в процесс выполнения запроса возможность распараллеливания задачи. Оптимизатор помещает оператор обмена в том месте, где происходит разделение на несколько потоков, и оператор обмена перемещает строки между потоками.

Перевод Ирины Наумовой.

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Индексные объединения (Index Union)

Время на прочтение6 мин
Количество просмотров2.3K

По материалам статьи Craig Freedman: Index Union
Перевод Ирины Наумовой

Ранее я планировал продолжить писать о параллелизме (и сделаю это в следующий раз в другой статье), но получил интересный вопрос и решил написать об индексных объединениях.

Читать далее
Всего голосов 4: ↑4 и ↓0+4
Комментарии0

Анонс стрима 07.04.22: Сжать данные в SQL Server в десятки раз, а ускорить запросы в сотни

Время на прочтение1 мин
Количество просмотров3.3K

У меня в планах на этот год на Хабре было опубликовать пару статей по колумсторам и XML. Материала за годы накопилось предостаточно и выходило на 30..40 страниц текста - фактически мини-книга. Но когда за окном Градами и прочей дичью херячили месяц... оно как-то не складывалось настроиться на конструктив. Вначале агрессия на виновников этой дичи, потом паника за близких... печаль что все планы порушились и непонятно что ждать. А сейчас прям совсем ровно на все жизненные трудности ибо как-то получается разруливать все и помогать людям.

Так вот... со знакомым решили вернуться к прежней теме и постримить сегодня о колумсторах. Без политики, срача и прочего. Очень много шутеек о том как живеться в условиях спецоперации и немного полезной инфы о колумсторах на SQL Server.

Кто хочет из коллег послушать: https://www.youtube.com/watch?v=wXH3fUN0PsM

You are welcome!

...
Всего голосов 16: ↑11 и ↓5+9
Комментарии9

Введение в распараллеливание исполнения запроса

Время на прочтение4 мин
Количество просмотров8.2K

По материалам статьи Craig Freedman: Introduction to Parallel Query Execution

SQL Server умеет выполнять запросы одновременно на нескольких процессорах. Такую возможность принято называть параллельным исполнением запроса. Параллельное исполнение запроса может использоваться для сокращения времени отклика (то есть, повышение быстродействия) больших запросов. Оно также может использоваться и при исполнении больших запросов (которые обрабатывают большой объём данных) в одно и то же время с маленькими запросами (масштабирование), увеличивая число процессоров, используемых в обслуживании запроса. Для большинства больших запросов SQL Server масштабируется практически линейно или почти линейно. Повышение быстродействия тут означает, что если мы удваиваем число процессоров, мы можем наблюдать сокращение времени отклика тоже в два раза. Масштабирование тут означает, что если мы удваиваем число процессоров и размер запроса, мы получает то же самое время отклика.

Читать далее
Всего голосов 4: ↑4 и ↓0+4
Комментарии3

Ближайшие события

Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
OTUS CONF: GameDev
Дата30 мая
Время19:00 – 20:30
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область

Hash Aggregate

Время на прочтение11 мин
Количество просмотров2.5K

По материалам статьи Craig Freedman: Hash Aggregate

В двух своих предыдущих статьях, я писал об операторе агрегации потока. Агрегат потока хорошо подходит для скалярных агрегатов и для агрегации с использованием индекса, который обеспечивает порядок сортировки по столбцу(цам) предложения GROUP BY или когда сортировка задана явно (например, указано предложение ORDER BY).
Следующий оператор агрегации, это агрегат хэша, который подобен хэш-соединению. Он не требует указания порядка сортировки, зато потребляет память и устанавливает блокировку (то есть, он не выдаёт результатов, пока не обработает всё, что у него на входе). Агрегат хэша является лучшим выбором для эффективной агрегации очень больших наборов данных.
Вот так выглядит алгоритма агрегата хэша в псевдокоде:

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Агрегат потока (Stream Aggregate)

Время на прочтение10 мин
Количество просмотров2.2K

По материалам статьи Craig Freedman: Stream Aggregate

Когда мы имеем дело с предложением GROUP BY, SQL Server для вычисления агрегатов использует два оператора. Один из этих операторов - агрегат потока, который, как Вы помните, был рассмотрен в предыдущей статье, и который используется для скалярных агрегатов. Другой оператор, это агрегат хэша (Hash Aggregate). В этой статье, я более подробно рассмотрю то, как работает агрегат потока.

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии2

Агрегация

Время на прочтение6 мин
Количество просмотров10K

По материалам статьи Craig Freedman: Aggregation

Агрегация относится к таким операциям, когда больший набор строк свёртывается в меньший. Типичные агрегатные функции - COUNT, MIN, MAX, SUM и AVG. SQL Server поддерживает также и другие агрегаты, типа STDEV и VAR.

Я собираюсь посвятить этой теме несколько статей. В этой статье, я сосредоточусь на "Скалярных Агрегатах". Скалярные агрегаты - запросы с агрегатными функциями в списке оператора SELECT и без предложения GROUP BY. Скалярные агрегаты всегда возвращают одну строку.

Читать далее
Всего голосов 4: ↑4 и ↓0+4
Комментарии6

Подзапросы: AND и OR

Время на прочтение10 мин
Количество просмотров4.9K

По материалам статьи Craig Freedman: Subqueries: ANDs and ORs

В статье Введение в соединения, я показал примеры того, как можно использовать полусоединение для оценки подзапроса в EXISTS. В качестве резюме, давайте рассмотрим другой пример:

Читать далее
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Подзапросы в выражении CASE

Время на прочтение13 мин
Количество просмотров11K

По материалам статьи Craig Freedman: Subqueries in CASE Expressions

В этой статье будет рассмотрено, как SQL Server обрабатывает подзапросы в выражении CASE. Кроме того, будут рассмотрены несколько экзотических возможностей соединений.

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии5

Резюме по свойствам соединений

Время на прочтение8 мин
Количество просмотров8.9K

По материалам статьи Craig Freedman: Summary of Join Properties

Следующая таблица суммирует характеристики трех операторов соединения, которые были описаны в моих трех предшествующих статьях.

Читать далее
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Hash Join

Время на прочтение7 мин
Количество просмотров16K

Когда Вы встречаете случай использования оператора Hash Join (хэш-соединение), это говорит о наличии тяжелого запроса. В отличие то соединения Nested Loops Join, которое хорошо для относительно маленьких наборов данных, и от соединения Merge Join, которое помогает при умеренных размерах наборов данных, хэш-соединение превосходит другие типы соединений при необходимости соединения огромных наборов данных. Хэш-соединения распараллеливается и масштабируется лучше любого другого соединения и сильно выигрывает при большой производительности информационных хранилищ (я вернусь к обсуждению параллельного выполнения запросов в следующей серии статей).

Хэш-соединение имеет много общего с соединением слиянием. Подобно соединению слиянием, для него требуются не менее одного предиката объединения по эквивалентности, оно поддерживает остаточные предикаты, а также все внешние соединения и полусоединения. В отличие от соединения слиянием, для него не требуется наличие упорядоченных входных потоков и для поддержки полного внешнего соединения требуется наличие предиката соединения по эквивалентности.

Читать далее
Всего голосов 9: ↑9 и ↓0+9
Комментарии1