T-SQL обычно предоставляет много способов "снять шкурку с кота", как говорится. Здесь мы рассмотрим два интересных способа преобразования дат и времени из символьных столбцов в столбец, использующий тип данных datetime. Продолжить чтение "PARSE или CAST и CONVERT"
Steinar Andersen рассказал о проблеме, с которой он столкнулся при навязывании планов, которые содержали табличные переменные.
Без паники. Конечно, по большей части вы можете навязывать план с табличными переменными. У Стейнара была довольно специфическая проблема. Прежде чем я перейду к объяснению, замечу, что Стейнар сам все понял. Когда он описывал проблему, я сразу понял, каким будет его вывод. Меня подвигло на этот пост сообщение Стейнара о том, что он нигде не нашел обсуждения этой проблемы. Так что давайте поговорим о ней. Продолжить чтение "О хранилище запросов, навязывании плана и табличных переменных"
Навязанные планы (Plan Forcing) в SQL Server предоставляют очень легкий метод для DBA и разработчиков стабилизировать производительность запроса. Однако plan forcing не является постоянным решением. Plan forcing опирается на следующие предпосылки: существует множество планов для запроса, и один из них наиболее предпочтителен с точки зрения производительности.
Продолжить чтение "Навязывание плана в SQL Server"
Возможность автоматической настройки в SQL Server 2017 Enterprise Edition и Azure SQL Database является первым шагом к сокращению времени профессионалами в области данных, которое они проводят в поисках решения проблем с производительностью. Эта возможность включает автоматическую коррекцию плана (Automatic Plan Correction) и автоматическое управление индексами (Automatic Index Management - только в Azure SQL Database), которые доступны независимо друг от друга. Здесь я хочу рассмотреть Automatic Plan Correction. С этой опцией, если SQL Server обнаруживает, что запрос существенно проигрывает в производительности, он навязывает ему последний известный хороший план, чтобы стабилизировать производительность. По сути, вместо вас, администратора баз данных или разработчика, которым на выходных звонят по поводу производительности системы, SQL Server сам решит эту проблему. Звучит слишком просто, не так ли? Давайте приглядимся. Продолжить чтение "Автоматическая корректировка планов в SQL Server"
SQL является декларативным языком. Мы используем SQL, чтобы написать логическую спецификацию запроса, описывающую результат, который мы хотим получить. Например, мы могли бы написать запрос с использование либо APPLY, либо JOIN, которые логически описывают в точности одни и те же результаты. Продолжить чтение "Apply против соединения вложенными циклами"
Для того, чтобы иметь возможность использовать R и Python (а также Java в SQL Server 2019) непосредственно из ваших скриптов SQL Server, применяется процедура sp_execute_external_script. Когда вы видите этот код впервые, он напоминает sp_execute_sql. Первое, что приходит на ум, это "О, нет. Еще одно лазейка для проникновения SQL-инъекции." У меня есть для вас несколько хороших и плохих новостей. Продолжить чтение "Процедура sp_execute_external_script и SQL-инъекция"
SQL Server использует статистику для создания планов запроса, которые улучшают производительность. При написании запросов есть простые правила, например, когда использовать левые соединения, когда внутренние и т.д. Оптимизатор запросов, с другой стороны, использует статистику, чтобы решить, каким именно образом извлекать данные и возвращать их пользователю. Если вы выполняете один и тот же запрос на двух разных базах данных с аналогичной схемой, одной размером 500Мб, а другой - 500Гб, вы, вероятно, можете получить два различных плана выполнения, несмотря на то, что соединяете те же самые таблицы. План выполнения генерируется на основе статистики. Продолжить чтение "Введение в статистику SQL Server"
Основанный на стоимости оптимизатор запросов SQL Server довольно хорошо понимает, в каком порядке фильтровать ваши данные, чтобы добиться быстрого выполнения запросов. Он учитывает такие вещи как покрытие индексами, распределение данных и многое другое, чтобы решить, как извлекать данные для вашего запроса. Продолжить чтение "Порядок выполнения предикатов на столбцах, содержащих данные разных типов"