В этой лекции мы продолжим изучение хранимых процедур, которое начали в лекции 21. Вы узнаете, как анализировать хранимые процедуры и другие операторы T-SQL с помощью анализатора запросов Microsoft SQL Server Query Analyzer и профайлера SQL Server Profiler. Из этого анализа вы сможете определять, насколько эффективны операторы T-SQL. Эффективный запрос SQL Server использует подходящую последовательность операций и подходящие индексы для снижения количества обрабатываемых строк и минимизации количества операций ввода-вывода.
Используя Query Analyzer, вы можете видеть план исполнения, выбранный для оператора T-SQL оптимизатором запросов SQL Server. Оптимизатор запросов – это внутренний модуль, который ищет наилучший план исполнения для каждого оператора T-SQL. Оптимизатор запросов анализирует каждый оператор T-SQL, просматривает ряд возможных планов исполнения и выполняет оценку "стоимости" каждого плана с точки зрения требуемых ресурсов и времени обработки. Выбирается план с наименьшей стоимостью. Стоимость каждого плана определяется на основе имеющейся статистики, которая собрана системой и может оказаться устаревшей. Поскольку вы можете знать больше о вашей базе данных и ваших данных, чем оптимизатор запросов, то, возможно, вам удастся создать план, который окажется лучше, чем у оптимизатора запросов. Используя информацию, которую выдает Query Analyzer, вы можете определить, будет ли эффективным план оптимизатора запросов для определенного оператора, и если нет, то вы можете попытаться оптимизировать данный оператор, модифицируя его или используя подсказку SQL. В этой лекции вы узнаете, как оптимизировать операторы T-SQL, что будет дополнением к изучению использования Query Analyzer.
Используя Profiler, вы можете анализировать операции внутри вашей системы SQL Server, чтобы определять, какие операторы SQL и хранимые процедуры используют излишние системные ресурсы. Обладая этой информацией, вы можете сосредоточить свои усилия по настройке в первую очередь на этих операторах и хранимых процедурах. Кроме описания того, как использовать Profiler, в этой лекции также показано, как наиболее эффективно использовать информацию, получаемую с помощью Profiler.
Использование SQL Query Аnalyzer
Утилита Query Analyzer поставляется вместе с Microsoft SQL Server 2000 взамен Interactive SQL for Windows (ISQL/W) как графический пользовательский интерфейс (GUI) SQL, но вы, возможно, обратили внимание, что утилита Query Analyzer представлена как isqlw.exe в диспетчере задач. Вы можете использовать Query Analyzer для обработки операторов T-SQL и просмотра результатов этих операторов. Query Analyzer можно также использовать как средство отладки для оценки плана исполнения, который генерируется оптимизатором запросов для вашего оператора T-SQL.
Выполнение операторов T-SQL
Выполнение операторов T-SQL и вывод результатов этих операторов являются основными возможностями Query Analyzer. Чтобы использовать Query Analyzer для выполнения оператора T-SQL, выполните следующие шаги.
Щелкните на кнопке Start (Пуск), укажите Programs, укажите Microsoft SQL Server и затем выберите Query Analyzer. Появится диалоговое окно Connect to SQL Server (Подсоединение к SQL Server) (рис 35.1(рис 35.1) Диалоговое окно Connect to SQL Server (Подсоединение к SQL Server)
Введите имя сервера в комбинированном поле с раскрывающимся списком. Это может быть имя локального сервера или удаленного сервера. На рис. 35.1 в этом поле введена точка (.). Ввод точки указывает, что вы хотите подсоединиться к локальному серверу. Установка флажка непосредственно под полем SQL Server указывает, что вы хотите запустить SQL Server, если он еще не запущен. В секции Connect using (Подсоединяться с использованием) выберите метод аутентификации, который хотите использовать для подсоединения к SQL Server. Если выбрать вариант Windows NT authentication (Аутентификация Windows), то вам не нужно указывать имя пользователя или пароль, поскольку для аутентификации доступа к SQL Server будет использоваться учетная запись Microsoft Windows 2000. Если выбрать вариант SQL Server authentication (Аутентификация в SQL Server), то для доступа к SQL Server нужно указать имя пользователя SQL Server (Login name) и пароль (Password).
Щелкните на кнопке OK для подсоединения к указанному серверу SQL и для запуска Query Analyzer. При первоначальном появлении окна Query Analyzer видны только панель Query и панели навигации, но этот вид изменяется, как только вы начинаете запускать операторы T-SQL. Разверните панель Query для заполнения всей правой стороны окна Query Analyzer (рис. 35.2). В раскрывающемся списке панели инструментов выберите базу данных, в которой хотите запускать запросы. На рис. 35.2 выбрана база данных master. Для нашего примера щелкните на направленной вниз стрелке и выберите Northwind.
После выбора базы данных введите в правой панели оператор T-SQL – в данном случае – SELECT * FROM Customers. Теперь у вас появляется несколько возможностей. Вы можете проверить синтаксис данного оператора T-SQL, щелкнув на кнопке Parse Query (Синтаксическая проверка запроса) в панели инструментов (синяя пометка ["галочка"]), или можете запустить оператор, щелкнув на кнопке Execute Query (Выполнить запрос) (зеленый треугольник, указывающий вправо). Вы можете остановить выполнение запроса, щелкнув на кнопке Cancel Executing Query (Отменить выполнение запроса) (квадрат). На рис. 35.3 показан выполненный запрос по таблице Customers базы данных Northwind.После запуска оператора T-SQL утилита Query Analyzer создает панель с возможностью вертикальной и горизонтальной прокрутки для просмотра результатов, как это показано на рис. 35.3. Query Analyzer можно также использовать как средство, помогающее вам в настройке ваших операторов T-SQL, как мы увидим в разделе "Оптимизация операторов T-SQL" ниже в этой лекции.

(рис 35.3) Окно Query Analyzer(рис 35.2) Выполненный запрос в панели Query Analyzer
Просмотр планов исполнения
и модифицирование операторов T-SQL
Как уже говорилось, вы можете также использовать Query Analyzer для просмотра плана исполнения, выбранного оптимизатором запросов для оператора T-SQL. Это средство позволяет определить, насколько эффективен ваш оператор T-SQL и какие пути выбраны для исполнения и доступа к данным. Вы можете затем внести изменения в этот оператор T-SQL и схему базы данных и затем определить, как это влияет на производительность. Чтобы использовать Query Analyzer для просмотра оценочного плана исполнения, выполните следующие шаги.
В окне Query Analyzer введите оператор T-SQL, чтобы выполнить его оценку с помощью Query Analyzer, как это описано выше, и затем щелкните на кнопке Display Estimated Execution Plan (Отобразить оценочный план исполнения) (кнопка справа от раскрывающегося списка выбора базы данных) или нажмите клавиши Ctrl+L. Появится панель Estimated Execution Plan (рис. 35.4). В этой панели запрос представлен в графическом виде; показана также "стоимость" каждой операции. Здесь также показан метод доступа к данным. В панели (рис. 35.4), появляется имя индекса (рис 35.4) Панель Estimated Execution Plan
Панель Estimated Execution Plan предоставляет доступ к дополнительным данным об операциях, показанных в этой панели. Чтобы увидеть эти дополнительные данные для любой операции, задержите указатель мыши на значке этой операции. Появится всплывающее окно, содержащее дополнительные данные (рис 35.5(рис 35.5) Просмотр дополнительных данных об операцииЭто всплывающее окно содержит следующую информацию:Physical operation/Logical operation (Физическая операция/Логическая операция). Операции, выполняемые данным запросом, такие как индексное сканирование, связывание (join), агрегирование и т.д. Если физический оператор представлен красным цветом, это означает, что оптимизатор запросов выдал предупреждение и вы должны внести исправления в ваш оператор T-SQL.
Estimated row count (Оценка количества строк). Количество строк, которое (по оценке Query Optimizer) будет выбрано данной операцией.
Estimated Row Size (Оценка размера строк). Оценка размера считываемых строк в байтах.
Estimated I/O cost/Estimated CPU cost (Оценка стоимости ввода-вывода/Оценка стоимости ЦП). Оценка ресурсов ввода-вывода и времени процессора, которые будут использоваться этой операцией. Меньшее значение соответствует большей эффективности оператора T-SQL
Estimated number of executes (Оценка количества выполнений).Приблизительное количество выполнений данной операции во время выполнения данного оператора T-SQL.
Estimated cost (Оценка стоимости). Стоимость операции по оценке оптимизатора запросов. Эта стоимость показана в процентах от полной стоимости данного оператора T-SQL.
Estimated subtree Cost (Оценка стоимости поддеревьев). Оценка стоимости выполнения предыдущих частей и данной части оператора T-SQL. Если имеется несколько поддеревьев, то это средство позволяет просматривать стоимость выполнения каждого поддерева.
Argument (Параметры). Параметры, используемые данным оператором T-SQL.
Примечание. План исполнения описывает, как оптимизатор запросов будет исполнять оператор T-SQL. Этот план показывает типы операций, которые будут использоваться, и порядок, в котором они будут выполняться. Метод доступа к данным описывает, как будет осуществляться доступ к объектам базы данных (таблицам, индексам и т.д.). План и метод доступа связаны друг с другом: метод доступа к данным иногда рассматривается как часть плана исполнения, но его можно также рассматривать отдельно.
Далее мы рассмотрим некоторые более сложные примеры использования Query Analyzer. Эти примеры также показывают влияние неэффективных операторов
T-SQL на снижение производительности за счет увеличения времени отклика и использования системных ресурсов, которые могли бы использоваться другими процессами. Сначала мы рассмотрим пример использования Query Analyzer для просмотра и модифицирования плана исполнения оператора T-SQL. Как уже говорилось, за счет модифицирования ваших операторов T-SQL вам, возможно, удастся получить для них более высокую производительность. Во многих случаях вы можете создать более эффективный и при этом функционально эквивалентный оператор
T-SQL. Затем мы будем рассматривать все более сложные оценочные планы исполнения для нескольких типов операторов T-SQL.
В примерах остальной части этого раздела используется таблица Orders базы данных Northwind. Посмотрим, как организована эта таблица. Когда мы будем рассматривать примеры, эта информация поможет нам определить, насколько приемлемым является план исполнения, выбранный оптимизатором запросов. Таблица Orders имеет кластеризованный индекс с именем (рис 35.6) Диалоговое окно Manage Indexes (Управление индексами)
Для доступа к этому окну с помощью Enterprise Manager раскройте группу серверов, раскройте сервер, раскройте папку Databases, раскройте базу данных Northwind и щелкните на папке Tables. Щелкните правой кнопкой мыши на таблице Orders в правой панели, укажите в контекстном меню All Tasks (Все задачи) и затем выберите Manage Indexes. Или просто выберите пункт Manage Indexes из меню Tools окна Query Analyzer и затем выберите из раскрывающегося меню таблицу Orders.
Просмотр плана для оператора SELECT
и модифицирование этого оператора
В этом разделе мы рассмотрим запрос информации по заказам (orders), помещенным сотрудником (employee), идентификационный номер которого (employee ID) равен 4. Вот этот запрос:
SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM Orders
WHERE EmployeeID = 4
В данной организации каждый сотрудник обрабатывает небольшую часть от всех заказов, поэтому вы, вероятно, предполагаете, что SQL Server будет использовать при обработке этого запроса индекс EmployeeID. Вместо этого Query Analyzer информирует вас, что SQL Server будет использовать доступ с помощью кластеризованного индекса PK_Orders (рис. 35.7).
(рис 35.7) Панель Estimated Execution Plan, где показано, что будет использоваться кластеризованный индекс PK_OrdersЧтобы оптимизатор запросов использовал вместо этого индекс EmployeeID, вы можете использовать подсказку в операторе SELECT, как показано в следующем операторе. (См. раздел "Использование подсказок" далее.)
SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM Orders WITH (INDEX(EmployeeID))
WHERE EmployeeID = 5
Примечание. В Microsoft SQL Server 7 предпочтительной подсказкой по индексам было INDEX=имя_индекса. С появлением SQL Server 2000 предпочтительной подсказкой по индексам стало INDEX(имя_индекса).
Включая в команду эту дополнительную информацию, вы указываете оптимизатору запросов, что нужно использовать нужный вам план исполнения, а не тот, что был выбран для вас оптимизатором. На рис. 35.8 показана панель Estimated Execution Plan с измененным планом. Как видно из представленного в панели метода доступа, индекс EmployeeID будет использоваться в качестве входного параметра для процесса поиска по закладкам (bookmark lookup), который выполнит затем выборку данных из базы данных. (Процесс поиска по закладкам ищет внутренний идентификатор для строки данных.)
(рис 35.8) Панель Estimated Execution Plan с измененным планомОптимизатор запросов является эффективным инструментом, который постоянно обновляет статистику, чтобы выбрать наилучший план исполнения. Но поскольку вы хорошо представляете себе вашу организацию и ваши данные, то в некоторых случаях вы осведомлены лучше, чем оптимизатор запросов, чтобы выбрать лучший план исполнения.
Внимание. Используя подсказку, переопределяющую план оптимизатора запросов, вы делаете это на свой страх и риск. Хотя здесь нет или почти нет опасности потери или порчи данных, вы можете ухудшить производительность системы.
Просмотр плана для операции связывания
Выполнение какой-либо операции связывания (join) включает в себя намного больше процессов, чем будет показано в панели Estimated Execution Plan ниже в этой лекции. Операция связывания выполняет доступ к нескольким таблицам, сопровождаемый связыванием (объединением) считываемых данных. (Операции связывания рассматриваются в лекции 14.) Вот пример оператора с операцией связывания:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
Сюда включен оператор SQL-92 JOIN. Использование этого оператора является рекомендованным способом связывания в SQL Server 2000. В следующем операторе используется более традиционный синтаксис связывания, который по-прежнему поддерживается в SQL Server:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders, Employees
WHERE Orders.EmployeeID = Employees.EmployeeID
Любой из этих операторов T-SQL связывает таблицы Orders и Employees по колонке EmployeeID. Результирующий оценочный план исполнения показан на рис. 35.9.
(рис 35.9) Операция связывания, показанная в панели Estimated Execution PlanВ этой панели видно, какое из двух поддеревьев имеет более высокую стоимость. Вы также видите тип планируемой операции связывания. SQL Server поддерживает несколько операций связывания, включая хеш-связывание, связывание вложенных цепочек и связывание слиянием. При использовании комплексной операции связывания план исполнения может оказаться очень сложным. (Query Analyzer регулирует размер панели Estimated Execution Plan, чтобы вместить нужно количество ветвей.) Поскольку нашей целью является сокращение времени ЦП и количества операций ввода-вывода, вам нужно попытаться определить, можно ли выбрать лучший план исполнения. В некоторых случаях вы можете применить подсказку, указывающую использование определенного индекса, сокращая тем самым время использования ЦП и интенсивность операций ввода-вывода. Вы можете также использовать подсказки в операциях связывания таблиц. Для запроса (рис. 35.9), возможно, выбран наилучший план исполнения, поскольку в предложении FROM связывание является единственной операцией.
Просмотр плана для операции агрегирования
Показанный здесь оператор T-SQL выполняет не только операцию связывания, но также операцию агрегирования:
SET QUOTED_ IDENTIFIER ON
GO
SELECT CustomerID, SUM("Order Details".UnitPrice)
FROM Orders JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID
GROUP BY CustomerID
Панель Estimated Execution Plan для этой комплексной операции показана на рис. 35.10.
(рис 35.10) Операция агрегирования, представленная в панели Estimated Execution PlanПримечание. Поскольку имя таблицы Order Details содержит ключевое слово и пробел, здесь должен использоваться параметр SET QUOTED_IDENTIFIER ON. Это позволяет указывать имя таблицы Order Details в кавычках. Для получения более подробной информации по этому параметру найдите "SET QUOTED_IDENTIFIER" Books Online.
Просмотр плана для хранимой процедуры
Для просмотра плана исполнения хранимой процедуры нужно просто вызвать эту хранимую процедуру из окна Query Analyzer. В панели Query Analyzer будет выведен оценочный план вызванной вами хранимой процедуры. На рис. 35.11 показан план для процедуры sp_who. (Отметим, что план исполнения этой широко используемой хранимой процедуры очень сложен.) Вы можете просматривать план исполнения хранимой процедуры, не зная, какие операторы T-SQL образуют эту процедуру.
(рис 35.11) План исполнения хранимой процедуры, показанный в панели Estimated Execution Plan
Использование браузера объектов
Браузер объектов (Object Browser) – это расширение в Query Analyzer, включенное в SQL Server 2000. Запустив Query Analyzer, вы увидите браузер объектов в левой части этого окна. Браузер объектов разбит на две секции: секция объектов баз данных и секция общих объектов (Common objects). В секции объектов баз данных вы можете выполнять перемещение по объектам, таким как таблицы и представления. В секции общих объектов обеспечивается удобный доступ к системным объектам и функциям. Вам нужно выполнить просмотр в браузере объектов, чтобы выяснить, какую информацию он содержит, и затем определить, что вы можете использовать.
Объекты базы данных
Верхняя секция браузера объектов содержит объекты баз данных. Вы сразу видите базы данных по умолчанию и любые созданные вами базы данных под обозначением системы SQL Server, которой они принадлежат. Чтобы увидеть информацию, которая содержится в браузере объектов, нужно просто раскрыть объекты. Раскроем базу данных Northwind и затем раскроем папку User Tables (Пользовательские таблицы). Вы увидите таблицы базы данных Northwind (рис. 35.12).
(рис 35.12) Просмотр таблиц в браузере объектовЗатем вы можете раскрывать определенные пользователем таблицы и затем раскрывать папки, содержащие информацию о колонках, индексах, ограничениях, зависимостях и триггерах. На рис. 35.13 раскрыта таблица Orders. Вы можете также раскрывать соответствующие папки для просмотра информации о системных таблицах, представлениях, хранимых процедурах, функциях и определенных пользователем типах данных.
Доступ к информации базы данных внутри Query Analyzer – очень удобное средство, поскольку это позволяет создавать операторы SQL и хранимые процедуры без необходимости поиска информации об объектах вне Query Analyzer. Вы можете не только просматривать информацию в браузере объектов, но также редактировать объекты, перемещать объекты методом "drag and drop" и даже формировать сценарии создания и модифицирования объектов. Это еще более расширяет функциональные возможности Query Analyzer.
Секция Common Objects
Нижняя часть браузера объектов – это папка с именем Common Objects (Общие объекты) (рис. 35.14).

(рис 35.14) Раскрытие таблицы в браузере объектов(рис 35.13) Раскрытие папки в секции Common objects (Общие объекты) браузера объектовВнутри этой папки находятся папки, содержащие информацию о таких объектах, как функции конфигурирования, функции курсоров, функции даты и времени, а также математические функции. Тем самым вы получаете простой доступ к функциям без необходимости поиска их синтаксиса.
Если раскрыть какую-либо папку в этой секции, то вы увидите соответствующие функции этой папки (функции конфигурирования на рис. 35.14). Вы можете перетаскивать эти функции в панель запросов или, поместив курсор мыши поверх функции, вы можете видеть ее краткое описание. Это удобно для обработки эпизодических запросов.
Кроме доступа к глобальным переменным, вы имеете доступ к вызовам других полезных функций, таких как математические и строковые функции. Продолжая раскрывать объекты, вы можете получать, например, информацию о параметрах этих функций. На рис. 35.15 показана папка Parameters (Параметры) раскрытой математической функции.
(рис 35.15) Просмотр параметров в браузере объектов
Использование SQL Profiler
В дополнение к использованию Query Analyzer для поиска неэффективных операторов T-SQL вы можете также использовать утилиту SQL Server Profiler. Profiler позволяет наблюдать за всеми операторами T-SQL, которые выполняются в системе, с графическим отображением информации об этих операторах. Profiler также предоставляет возможности сортировки и фильтрации, которые можно использовать для выявления операторов T-SQL, использующих основную часть ресурсов ЦП и ввода-вывода. Обладая этой информацией, вы можете определять, каким операторам
T-SQL уделить основное внимание для их настройки. Операторы T-SQL, которые вызываются из приложения, можно просматривать в Profiler; при этом вам не требуется доступ исходному коду самого приложения.
Утилита Profiler в SQL Server 2000 действует аналогично утилите Profiler в SQL Server 7, но она содержит некоторые улучшения. Одним из полезных дополнений является шаблон трассировки (trace template), который можно использовать для создания файлов трассировки. (Трассировку нужно по-прежнему создавать до того, как вы сможете использовать ее для мониторинга операций SQL Server.) В SQL Server трассировки должны были создаваться вручную.
Для вызова утилиты Profiler и запуска трассировки выполните следующие шаги.
Щелкните на кнопке Start, укажите пункт Programs, укажите Microsoft SQL Server и затем выберите Profiler. При первоначальном открытии окна Profiler оно будет пустым. Не будет открыто ни одной панели, и не будет выполняться никакого профилирования в SQL Server.
Чтобы начать создание профилирование, вы должны выбрать для выполнения существующий шаблон трассировки или создать новый шаблон трассировки для выполнения. (Процесс запуска описан на шаге 4.) SQL Server 2000 Profiler предоставляет для выбора целый ряд шаблонов трассировки. Использование этих шаблонов трассировки может сэкономить вам много времен, поскольку вам не нужно создавать трассировку с самого начала. Чтобы увидеть список шаблонов трассировки, щелкните на меню File (Файл), укажите команду Open (Открыть) и выберите пункт Trace Templates (Шаблоны трассировки), чтобы появилось диалоговое окно Open (рис 35.16(рис 35.16) Диалоговое окно Open со списком шаблонов трассировкиИмеются следующие шаблоны трассировки, поставляемые вместе с SQL Server.SQLServerProfilerSP_Counts.tdf. Подсчитывает количество запущенных хранимых процедур. Результаты группируются по именам хранимых процедур и содержат количество запусков соответствующей процедуры.
SQLServerProfilerStandard.tdf. Собирает общую информацию о соединениях, выполненных хранимых процедурах и пакетах SQL в порядке их выполнения.
SQLServerProfilerTSQL.tdf. Собирает информацию обо всех операторах T-SQL в порядке их поступления в SQL Server от пользователей. Эта трассировка содержит просто операторы T-SQL и моменты времени их запуска.
SQLServerProfilerTSQL_Duration.tdf. Выводит запущенные операторы T-SQL, а также время (в миллисекундах), которое потребовалось для выполнения этих операторов.
SQLServerProfilerTSQL_Grouped.tdf. Собирает данные, аналогичные тому, что собирает SQLServerProfilerTSQL, но группирует операторы по пользователям, запустившим эти операторы.
SQLServerProfilerTSQL_Replay.tdf. Предоставляет подробную информацию о запускавшихся операторах T-SQL. Эта трассировка содержит данные, которые можно использовать для воспроизведения операторов T-SQL в Query Analyzer.
SQLServerProfilerTSQL_SPs.tdf . Выводит указанные хранимые процедуры, а также команды T-SQL внутри этих процедур. Результаты выводятся в порядке выполнения.
SQLServerProfilerTuning.tdf. Собирает данные о хранимой процедуре и выполнении пакета SQL.
Эти шаблоны трассировки могут оказаться очень полезными. Например, шаблон трассировки SQLServerProfilerTSQL_Duration может помочь вам в определении операторов T-SQL, на выполнение которых требуется больше всего времени. Эта информация может послужить отправной точкой для оптимизации запроса. Оператор может занимать много времени, потому что он выполняет много работы или, может быть, потому, что он действует неэффективно. Как вы увидите на следующем шаге, для любой трассировки у вас должен использоваться заранее определенный шаблон.
Для запуска трассировки щелкните на File, укажите команду New (Создать) и затем выберите пункт Trace (Трассировка). Появится диалоговое окно Connect to SQL Server (рис 35.17(рис 35.17) Диалоговое окно Connect to SQL Server
Появится окно Trace Properties (Свойства трассировки) (рис 35.18(рис 35.18) Вкладка General окна Trace Properties (Свойства трассировки)
Далее щелкните на вкладке Events (События) (рис 35.19(рис 35.19) Вкладка Events (События) окна Trace PropertiesВ этой вкладке вы можете выбрать одно или несколько событий, которые будут отслеживаться в данной трассировке. Можно отслеживать целый ряд классов (категорий) событий и конкретных событий. В окне списка Available event classes (Имеющиеся классы событий) содержатся такие классы событий, как Cursors (Курсоры), Errors and Warnings (Ошибки и предупреждения), Locks (Блокировки), Objects (Объекты), Scans (Сканирования), SQL Operators (Операторы SQL), Stored Procedures (Хранимые процедуры), Transactions (Транзакции) и TSQL.
После выбора событий, трассировку которых вы хотите выполнять, щелкните на вкладке Data Columns (Колонки данных) (рис 35.20(рис 35.20) Вкладка Data Columns (Колонки данных) окна Trace Properties
Щелкните на вкладке Filters (Фильтры) (рис. 35.21). В этой вкладке вы можете указывать, нужно ли, чтобы утилита Profiler включала или исключала определенные события. Например, вам следует исключить трассировку самой утилиты Profiler. (Это установка по умолчанию.) Исключая процессы SQL Server, вы делаете окно Profiler менее насыщенным и более удобным для чтения.
По окончании установки параметров щелкните на кнопке Run для запуска данной трассировки. Если вы внесли какие-либо изменения в шаблон трассировки, то рекомендуется сохранить этот модифицированный шаблон трассировки под другим именем с помощью команды Save As меню File. После запуска трассировки в окне Profiler будут выводиться события по мере их возникновения. В соответствии с шаблоном трассировки, выбранным в этом примере, события будут сортироваться по длительности (в миллисекундах). На рис. 35.22 показано окно Profiler с результатами трассировки.
Внимание. Profiler может использовать значительную часть системных ресурсов в условиях большой загруженности системы. Чем больше событий отслеживается в трассировке, тем выше дополнительная нагрузка на систему.

(рис 35.22) Вкладка Filters (Фильтры) окна Trace Properties(рис 35.21) Выполняемая трассировка
Оптимизация операторов T-SQL
В предыдущих разделах вы изучали, как следить за выполнением операторов T-SQL с помощью утилиты Profiler и как определять план исполнения и метод доступа к данным с помощью Query Analyzer. Мы также рассматривали простой пример модифицирования оператора T-SQL для улучшения его производительности. Используя эти средства, вы можете теперь модифицировать многие типы операторов T-SQL, чтобы улучшить показатели их выполнения. В этом разделе мы рассмотрим несколько способов оптимизации операторов T-SQL, чтобы повысить их производительность или чтобы они использовали меньше системных ресурсов.
Оптимизация плана исполнения
Модифицирование плана исполнения может оказаться трудным делом, а создание лучшего плана исполнения, чем у оптимизатора запросов, может оказаться еще более трудным делом. Наиболее вероятны улучшения от внесения изменений в план исполнения операторов JOIN, GROUP BY, ORDER BY и UNION. Вы можете легко модифицировать эти операции, пробуя различные подсказки и просматривая результаты (см. раздел "Использование подсказок" далее). Изменяя подсказку и просматривая результаты в окне Query Analyzer, вы, возможно, найдете более эффективный вариант выполнения оператора.
К сожалению, не существует какого-либо единого подхода к настройке операторов T-SQL для получения более высокой производительности. Поскольку каждая база данных уникальна и каждое приложение отличается от других приложений, модификации должны выполняться для каждого конкретного случая.
Выбор метода доступа к базе данных
Как уже говорилось выше в этой лекции, методы доступа к данным – это, по сути, объекты, используемые системой SQL Server при выборке данных из базы данных. Анализируя свою базу данных и данные, которые она содержит, вам, возможно, удастся оптимизировать метод доступа к данным, когда целью оптимизации является снижение количества операций ввода-вывода.
Модификации метода доступа к данным, как и модификации плана исполнения, должны выполняться для каждого конкретного случая. Следующие рекомендации помогут вам в выборе более эффективного метода доступа к данным.
Используйте наиболее подходящий индекс.Использование наиболее подходящего индекса для операции является необходимым условием достижения наиболее высокой производительности. Наиболее подходящий индекс для определенной операции – это индекс, позволяющий наиболее быстро находить данные с использованием наименьшего числа операций ввода-вывода. Вы можете определить наиболее подходящий индекс, исходя из знания особенностей вашей базы данных и ее данных или используя утилиту Query Analyzer. Эта утилита позволяет вам опробовать различные сценарии, чтобы определить индекс, который позволяет считывать минимальное количество строк. (Напомним, что Query Analyzer просто оценивает количество возвращаемых строк; чтобы определить точное количество строк, вы должны использовать Profiler.)Примечание.Как уже говорилось в лекции 17, индексы очень важны для SQL Server, но они могут приводить к снижению производительности при неверном использовании. Следите за количеством индексов на одну таблицу – особенно при большом количестве операций для операторов INSERT, UPDATE и DELETE. Излишнее количество индексов приводит к снижению производительности для операций этого типа, поскольку модифицирование индексов сопряжено с дополнительной нагрузкой на систему.
Используйте охватывающие (covering) индексы. Использование охватывающих (covering) индексов, возможно, позволит вам обойтись без операции ввода-вывода в процессе поиска данных (см. лекцию 17). Вместо доступа к соответствующей таблице вам, возможно, удастся считывать необходимые данные из самого индекса.
Снижайте количество возвращаемых строк.Определите, насколько необходимы те или иные данные, возвращаемые в результате запросов. Модифицируйте запросы T-SQL, чтобы в них выполнялся доступ только к необходимым данным. Не считывайте строки, которые будут затем отброшены. Снижение количества строк, считываемых из базы данных, может быть достигнуто в результате повышения селективности запроса.
Использование подсказок
Вы можете изменять метод доступа к данным и план исполнения, модифицируя сам оператор T-SQL, но в случае ошибок этот метод может нарушить функциональные требования к данному оператору T-SQL. Более надежным методом оптимизации операторов T-SQL является использование подсказок. С помощью подсказок вы можете указывать оптимизатору запросов, какие операции он должен выполнять и какие объекты он должен использовать. В этом разделе вы узнаете о различных подсказках SQL Server и об их использовании.
Подсказки операций связывания
Подсказки операций связывания (join hints) используются, чтобы указывать оптимизатору запросов типы операций связывания, которые он должен выполнять. (Если в запросе не указано никакого типа, то оптимизатор запросов выбирает тип самостоятельно.) В SQL Server вы можете выполнять связывание вложенных цепочек, хеш-связывание, связывание слиянием и удаленное связывание. Вы указываете метод связывания с помощью следующих подсказок.
LOOP. Указывает связывание вложенных цепочек. При этом типе связывания для каждой строки внешней таблицы проверяется каждая строка внутренней таблицы на совпадение значений указанных полей.
HASH. Указывает хеш-связывание. При этом типе связывания одна таблица преобразуется как хеш-таблица. Другая таблица сканируется по одной строке, и для поиска совпадений используется хеш-функция.
MERGE. Указывается связывание с сортировкой слиянием. При этом типе связывания сортируется каждая таблица, и затем каждая строка каждой таблицы сравнивается с соответствующей строкой в убывающем порядке.
REMOTE. Указывает удаленное связывание. При этом типе связывания хотя бы одна их участвующих таблиц является удаленной.
Рассмотрим пример использования подсказки для операции связывания. Мы используем пример из раздела "Просмотр плана для операции связывания" выше в этой лекции и укажем следующую хеш-подсказку:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders, Employees
WHERE Orders.EmployeeID = Employees.EmployeeID
OPTION (HASH JOIN)
Примечание. Подсказки для связывания являются взаимоисключающими – можно одновременно указывать только одну подсказку.
Если вы решили использовать для связывания синтаксис SQL-92, то можете задать тип связывания, также используя подсказку. Применяя синтаксис SQL-92, вы могли бы переписать предыдущий запрос следующим образом:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders INNER HASH JOIN Employees
ON (Orders.EmployeeID = Employees.EmployeeID)
Использование подсказок для связывания является достаточно сложной темой, и не существует никаких правил, указывающих, когда использовать подсказки для связывания. Существует много причин для выбора определенной операции связывания, таких как предикаты, размер каждой таблицы при связывании и количество таблиц, участвующих в операции связывания. Чтобы определить, нужно ли изменять операцию связывания, лучше всего опробовать каждый тип связывания в Query Analyzer и посмотреть, какой из них дает меньшую стоимость. Но обычно наилучший способ для операции связывания выбирает оптимизатор запросов.
Подсказки для запросов
Подсказки для запросов используются для указания того, как следует выполнять определенные операции запроса. Подсказки для запросов разбиты на три категории: GROUP BY, UNION и остальные.
Подсказки GROUP BY. Следующие подсказки указывают, как следует выполнять операции GROUP BY или COMPUTE.
HASH GROUP BY. Указывает, что для выполнения операции GROUP BY будет использоваться хеш-функция
ORDER GROUP BY. Указывает, что для выполнения операции GROUP BY будет использоваться операция сортировки.
Используя пример GROUP BY из раздела "Просмотр плана для операции агрегирования" выше в этой лекции, мы можем указать с помощью подсказки, как должна выполняться операция HASH GROUP BY:
SELECT CustomerID, SUM(OrderDetails.UnitPrice)
FROM Orders, OrderDetails
GROUP BY CustomerID
OPTION (HASH GROUP)
Примечание. Подсказки типа GROUP BY являются взаимоисключающими – можно одновременно использовать только одну подсказку.
Подсказки UNION. Следующие подсказки используются для указания того, как следует выполнять операции UNION.
MERGE UNION. Для выполнения операции UNION используется операция MERGE.
HASH UNION. Для выполнения операции UNION используется хеш-функция.
CONCAT UNION. Для выполнения операции UNION используется функция конкатенации.
Вот пример использования подсказки CONCAT UNION:
SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM orders
WHERE CustomerID = 'TOMSP'
UNION
SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM orders
WHERE EmployeeID = '4'
OPTION (CONCAT UNION)
Примечание. Подсказки типа UNION являются взаимоисключающими.
К сожалению, не существует какой-либо "секретной формулы", которую можно использовать для определения наиболее подходящей операции UNION в вашей ситуации. И здесь лучше всего использовать Query Analyzer для опробования различных подсказок UNION, чтобы посмотреть, какая из них дает наилучшую стоимость. Обычно наилучшую стратегию для операций UNION определяет оптимизатор запросов SQL Server.
Остальные подсказки.Следующие подсказки можно использовать для выполнения различных запросных операций.
FORCE ORDER. Указывает, что доступ к таблицам должен выполняться в том же порядке, как они представлены в запросе. По умолчанию SQL Server может изменять порядок следования таблиц.
ROBUST PLAN. Указывает, что оптимизатор запросов должен быть готов к максимально возможному размеру строк. Вот пример использования этой подсказки:SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders, Employees
WHERE Orders.EmployeeID = Employees.EmployeeID
OPTION (ROBUST PLAN)
Подсказки для таблиц
Подсказки для таблиц используются, чтобы управлять способом доступа к таблицам.
Здесь описаны две подсказки для таблиц.
FAST n.Заменяет FASTFIRSTROWS, сохраненную для обратной совместимости. Эта подсказка указывает SQL Server, что нужно оптимизировать выборку n первых строк данных.
INDEX = имя_индекса. Указывает оптимизатору запросов, что нужно использовать указанный индекс, когда имеется такая возможность. В одном из первых примеров этой лекции показано, как использовать подсказку INDEX. Мы повторяем здесь этот пример:SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM orders WITH (INDEX = EmployeeID)
WHERE EmployeeID = 5
OPTION (FAST 10)
Квалификатор WITH не является обязательным.
Подсказка INDEX = EmployeeID указывает, что должен использоваться индекс EmployeeID. Если указана подсказка FAST 10, то SQL Server будет оптимизировать выборку первых 10 строк (если возможно) и затем будет возвращать остальные строки.
Заключение
В этой лекции вы узнали, как использовать Query Analyzer для определения плана исполнения и методов доступа к данным, наиболее подходящих для данного запроса. Кроме того, вы узнали, как использовать Profiler для просмотра операторов
T-SQL, которые выполняются в вашей системе, и как запускать трассировки, чтобы определить наличие некоторых операторов T-SQL, возможно, вызывающих проблемы производительности. Вы также узнали, как оптимизировать план исполнения и методы доступа к данным, исходя из структуры вашей базы данных и ваших данных. И, наконец, вы узнали, как использовать подсказки для указания того, что должен использоваться определенный план исполнения или метод доступа к данным. В лекции 36 эта тема будет развита: вы узнаете о проблемах производительности и способах их разрешения.
В этой лекции мы продолжим изучение хранимых процедур, которое начали в лекции 21. Вы узнаете, как анализировать хранимые процедуры и другие операторы T-SQL с помощью анализатора запросов Microsoft SQL Server Query Analyzer и профайлера SQL Server Profiler. Из этого анализа вы сможете определять, насколько эффективны операторы T-SQL. Эффективный запрос SQL Server использует подходящую последовательность операций и подходящие индексы для снижения количества обрабатываемых строк и минимизации количества операций ввода-вывода.
Используя Query Analyzer, вы можете видеть план исполнения, выбранный для оператора T-SQL оптимизатором запросов SQL Server. Оптимизатор запросов – это внутренний модуль, который ищет наилучший план исполнения для каждого оператора T-SQL. Оптимизатор запросов анализирует каждый оператор T-SQL, просматривает ряд возможных планов исполнения и выполняет оценку "стоимости" каждого плана с точки зрения требуемых ресурсов и времени обработки. Выбирается план с наименьшей стоимостью. Стоимость каждого плана определяется на основе имеющейся статистики, которая собрана системой и может оказаться устаревшей. Поскольку вы можете знать больше о вашей базе данных и ваших данных, чем оптимизатор запросов, то, возможно, вам удастся создать план, который окажется лучше, чем у оптимизатора запросов. Используя информацию, которую выдает Query Analyzer, вы можете определить, будет ли эффективным план оптимизатора запросов для определенного оператора, и если нет, то вы можете попытаться оптимизировать данный оператор, модифицируя его или используя подсказку SQL. В этой лекции вы узнаете, как оптимизировать операторы T-SQL, что будет дополнением к изучению использования Query Analyzer.
Используя Profiler, вы можете анализировать операции внутри вашей системы SQL Server, чтобы определять, какие операторы SQL и хранимые процедуры используют излишние системные ресурсы. Обладая этой информацией, вы можете сосредоточить свои усилия по настройке в первую очередь на этих операторах и хранимых процедурах. Кроме описания того, как использовать Profiler, в этой лекции также показано, как наиболее эффективно использовать информацию, получаемую с помощью Profiler.
Использование SQL Query Аnalyzer
Утилита Query Analyzer поставляется вместе с Microsoft SQL Server 2000 взамен Interactive SQL for Windows (ISQL/W) как графический пользовательский интерфейс (GUI) SQL, но вы, возможно, обратили внимание, что утилита Query Analyzer представлена как isqlw.exe в диспетчере задач. Вы можете использовать Query Analyzer для обработки операторов T-SQL и просмотра результатов этих операторов. Query Analyzer можно также использовать как средство отладки для оценки плана исполнения, который генерируется оптимизатором запросов для вашего оператора T-SQL.
Выполнение операторов T-SQL
Выполнение операторов T-SQL и вывод результатов этих операторов являются основными возможностями Query Analyzer. Чтобы использовать Query Analyzer для выполнения оператора T-SQL, выполните следующие шаги.
Щелкните на кнопке Start (Пуск), укажите Programs, укажите Microsoft SQL Server и затем выберите Query Analyzer. Появится диалоговое окно Connect to SQL Server (Подсоединение к SQL Server) (рис 35.1(рис 35.1) Диалоговое окно Connect to SQL Server (Подсоединение к SQL Server)
Введите имя сервера в комбинированном поле с раскрывающимся списком. Это может быть имя локального сервера или удаленного сервера. На рис. 35.1 в этом поле введена точка (.). Ввод точки указывает, что вы хотите подсоединиться к локальному серверу. Установка флажка непосредственно под полем SQL Server указывает, что вы хотите запустить SQL Server, если он еще не запущен. В секции Connect using (Подсоединяться с использованием) выберите метод аутентификации, который хотите использовать для подсоединения к SQL Server. Если выбрать вариант Windows NT authentication (Аутентификация Windows), то вам не нужно указывать имя пользователя или пароль, поскольку для аутентификации доступа к SQL Server будет использоваться учетная запись Microsoft Windows 2000. Если выбрать вариант SQL Server authentication (Аутентификация в SQL Server), то для доступа к SQL Server нужно указать имя пользователя SQL Server (Login name) и пароль (Password).
Щелкните на кнопке OK для подсоединения к указанному серверу SQL и для запуска Query Analyzer. При первоначальном появлении окна Query Analyzer видны только панель Query и панели навигации, но этот вид изменяется, как только вы начинаете запускать операторы T-SQL. Разверните панель Query для заполнения всей правой стороны окна Query Analyzer (рис. 35.2). В раскрывающемся списке панели инструментов выберите базу данных, в которой хотите запускать запросы. На рис. 35.2 выбрана база данных master. Для нашего примера щелкните на направленной вниз стрелке и выберите Northwind.
После выбора базы данных введите в правой панели оператор T-SQL – в данном случае – SELECT * FROM Customers. Теперь у вас появляется несколько возможностей. Вы можете проверить синтаксис данного оператора T-SQL, щелкнув на кнопке Parse Query (Синтаксическая проверка запроса) в панели инструментов (синяя пометка ["галочка"]), или можете запустить оператор, щелкнув на кнопке Execute Query (Выполнить запрос) (зеленый треугольник, указывающий вправо). Вы можете остановить выполнение запроса, щелкнув на кнопке Cancel Executing Query (Отменить выполнение запроса) (квадрат). На рис. 35.3 показан выполненный запрос по таблице Customers базы данных Northwind.После запуска оператора T-SQL утилита Query Analyzer создает панель с возможностью вертикальной и горизонтальной прокрутки для просмотра результатов, как это показано на рис. 35.3. Query Analyzer можно также использовать как средство, помогающее вам в настройке ваших операторов T-SQL, как мы увидим в разделе "Оптимизация операторов T-SQL" ниже в этой лекции.

(рис 35.3) Окно Query Analyzer(рис 35.2) Выполненный запрос в панели Query Analyzer
Просмотр планов исполнения
и модифицирование операторов T-SQL
Как уже говорилось, вы можете также использовать Query Analyzer для просмотра плана исполнения, выбранного оптимизатором запросов для оператора T-SQL. Это средство позволяет определить, насколько эффективен ваш оператор T-SQL и какие пути выбраны для исполнения и доступа к данным. Вы можете затем внести изменения в этот оператор T-SQL и схему базы данных и затем определить, как это влияет на производительность. Чтобы использовать Query Analyzer для просмотра оценочного плана исполнения, выполните следующие шаги.
В окне Query Analyzer введите оператор T-SQL, чтобы выполнить его оценку с помощью Query Analyzer, как это описано выше, и затем щелкните на кнопке Display Estimated Execution Plan (Отобразить оценочный план исполнения) (кнопка справа от раскрывающегося списка выбора базы данных) или нажмите клавиши Ctrl+L. Появится панель Estimated Execution Plan (рис. 35.4). В этой панели запрос представлен в графическом виде; показана также "стоимость" каждой операции. Здесь также показан метод доступа к данным. В панели (рис. 35.4), появляется имя индекса (рис 35.4) Панель Estimated Execution Plan
Панель Estimated Execution Plan предоставляет доступ к дополнительным данным об операциях, показанных в этой панели. Чтобы увидеть эти дополнительные данные для любой операции, задержите указатель мыши на значке этой операции. Появится всплывающее окно, содержащее дополнительные данные (рис 35.5(рис 35.5) Просмотр дополнительных данных об операцииЭто всплывающее окно содержит следующую информацию:Physical operation/Logical operation (Физическая операция/Логическая операция). Операции, выполняемые данным запросом, такие как индексное сканирование, связывание (join), агрегирование и т.д. Если физический оператор представлен красным цветом, это означает, что оптимизатор запросов выдал предупреждение и вы должны внести исправления в ваш оператор T-SQL.
Estimated row count (Оценка количества строк). Количество строк, которое (по оценке Query Optimizer) будет выбрано данной операцией.
Estimated Row Size (Оценка размера строк). Оценка размера считываемых строк в байтах.
Estimated I/O cost/Estimated CPU cost (Оценка стоимости ввода-вывода/Оценка стоимости ЦП). Оценка ресурсов ввода-вывода и времени процессора, которые будут использоваться этой операцией. Меньшее значение соответствует большей эффективности оператора T-SQL
Estimated number of executes (Оценка количества выполнений).Приблизительное количество выполнений данной операции во время выполнения данного оператора T-SQL.
Estimated cost (Оценка стоимости). Стоимость операции по оценке оптимизатора запросов. Эта стоимость показана в процентах от полной стоимости данного оператора T-SQL.
Estimated subtree Cost (Оценка стоимости поддеревьев). Оценка стоимости выполнения предыдущих частей и данной части оператора T-SQL. Если имеется несколько поддеревьев, то это средство позволяет просматривать стоимость выполнения каждого поддерева.
Argument (Параметры). Параметры, используемые данным оператором T-SQL.
Примечание. План исполнения описывает, как оптимизатор запросов будет исполнять оператор T-SQL. Этот план показывает типы операций, которые будут использоваться, и порядок, в котором они будут выполняться. Метод доступа к данным описывает, как будет осуществляться доступ к объектам базы данных (таблицам, индексам и т.д.). План и метод доступа связаны друг с другом: метод доступа к данным иногда рассматривается как часть плана исполнения, но его можно также рассматривать отдельно.
Далее мы рассмотрим некоторые более сложные примеры использования Query Analyzer. Эти примеры также показывают влияние неэффективных операторов
T-SQL на снижение производительности за счет увеличения времени отклика и использования системных ресурсов, которые могли бы использоваться другими процессами. Сначала мы рассмотрим пример использования Query Analyzer для просмотра и модифицирования плана исполнения оператора T-SQL. Как уже говорилось, за счет модифицирования ваших операторов T-SQL вам, возможно, удастся получить для них более высокую производительность. Во многих случаях вы можете создать более эффективный и при этом функционально эквивалентный оператор
T-SQL. Затем мы будем рассматривать все более сложные оценочные планы исполнения для нескольких типов операторов T-SQL.
В примерах остальной части этого раздела используется таблица Orders базы данных Northwind. Посмотрим, как организована эта таблица. Когда мы будем рассматривать примеры, эта информация поможет нам определить, насколько приемлемым является план исполнения, выбранный оптимизатором запросов. Таблица Orders имеет кластеризованный индекс с именем (рис 35.6) Диалоговое окно Manage Indexes (Управление индексами)
Для доступа к этому окну с помощью Enterprise Manager раскройте группу серверов, раскройте сервер, раскройте папку Databases, раскройте базу данных Northwind и щелкните на папке Tables. Щелкните правой кнопкой мыши на таблице Orders в правой панели, укажите в контекстном меню All Tasks (Все задачи) и затем выберите Manage Indexes. Или просто выберите пункт Manage Indexes из меню Tools окна Query Analyzer и затем выберите из раскрывающегося меню таблицу Orders.
Просмотр плана для оператора SELECT
и модифицирование этого оператора
В этом разделе мы рассмотрим запрос информации по заказам (orders), помещенным сотрудником (employee), идентификационный номер которого (employee ID) равен 4. Вот этот запрос:
SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM Orders
WHERE EmployeeID = 4
В данной организации каждый сотрудник обрабатывает небольшую часть от всех заказов, поэтому вы, вероятно, предполагаете, что SQL Server будет использовать при обработке этого запроса индекс EmployeeID. Вместо этого Query Analyzer информирует вас, что SQL Server будет использовать доступ с помощью кластеризованного индекса PK_Orders (рис. 35.7).
(рис 35.7) Панель Estimated Execution Plan, где показано, что будет использоваться кластеризованный индекс PK_OrdersЧтобы оптимизатор запросов использовал вместо этого индекс EmployeeID, вы можете использовать подсказку в операторе SELECT, как показано в следующем операторе. (См. раздел "Использование подсказок" далее.)
SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM Orders WITH (INDEX(EmployeeID))
WHERE EmployeeID = 5
Примечание. В Microsoft SQL Server 7 предпочтительной подсказкой по индексам было INDEX=имя_индекса. С появлением SQL Server 2000 предпочтительной подсказкой по индексам стало INDEX(имя_индекса).
Включая в команду эту дополнительную информацию, вы указываете оптимизатору запросов, что нужно использовать нужный вам план исполнения, а не тот, что был выбран для вас оптимизатором. На рис. 35.8 показана панель Estimated Execution Plan с измененным планом. Как видно из представленного в панели метода доступа, индекс EmployeeID будет использоваться в качестве входного параметра для процесса поиска по закладкам (bookmark lookup), который выполнит затем выборку данных из базы данных. (Процесс поиска по закладкам ищет внутренний идентификатор для строки данных.)
(рис 35.8) Панель Estimated Execution Plan с измененным планомОптимизатор запросов является эффективным инструментом, который постоянно обновляет статистику, чтобы выбрать наилучший план исполнения. Но поскольку вы хорошо представляете себе вашу организацию и ваши данные, то в некоторых случаях вы осведомлены лучше, чем оптимизатор запросов, чтобы выбрать лучший план исполнения.
Внимание. Используя подсказку, переопределяющую план оптимизатора запросов, вы делаете это на свой страх и риск. Хотя здесь нет или почти нет опасности потери или порчи данных, вы можете ухудшить производительность системы.
Просмотр плана для операции связывания
Выполнение какой-либо операции связывания (join) включает в себя намного больше процессов, чем будет показано в панели Estimated Execution Plan ниже в этой лекции. Операция связывания выполняет доступ к нескольким таблицам, сопровождаемый связыванием (объединением) считываемых данных. (Операции связывания рассматриваются в лекции 14.) Вот пример оператора с операцией связывания:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
Сюда включен оператор SQL-92 JOIN. Использование этого оператора является рекомендованным способом связывания в SQL Server 2000. В следующем операторе используется более традиционный синтаксис связывания, который по-прежнему поддерживается в SQL Server:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders, Employees
WHERE Orders.EmployeeID = Employees.EmployeeID
Любой из этих операторов T-SQL связывает таблицы Orders и Employees по колонке EmployeeID. Результирующий оценочный план исполнения показан на рис. 35.9.
(рис 35.9) Операция связывания, показанная в панели Estimated Execution PlanВ этой панели видно, какое из двух поддеревьев имеет более высокую стоимость. Вы также видите тип планируемой операции связывания. SQL Server поддерживает несколько операций связывания, включая хеш-связывание, связывание вложенных цепочек и связывание слиянием. При использовании комплексной операции связывания план исполнения может оказаться очень сложным. (Query Analyzer регулирует размер панели Estimated Execution Plan, чтобы вместить нужно количество ветвей.) Поскольку нашей целью является сокращение времени ЦП и количества операций ввода-вывода, вам нужно попытаться определить, можно ли выбрать лучший план исполнения. В некоторых случаях вы можете применить подсказку, указывающую использование определенного индекса, сокращая тем самым время использования ЦП и интенсивность операций ввода-вывода. Вы можете также использовать подсказки в операциях связывания таблиц. Для запроса (рис. 35.9), возможно, выбран наилучший план исполнения, поскольку в предложении FROM связывание является единственной операцией.
Просмотр плана для операции агрегирования
Показанный здесь оператор T-SQL выполняет не только операцию связывания, но также операцию агрегирования:
SET QUOTED_ IDENTIFIER ON
GO
SELECT CustomerID, SUM("Order Details".UnitPrice)
FROM Orders JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID
GROUP BY CustomerID
Панель Estimated Execution Plan для этой комплексной операции показана на рис. 35.10.
(рис 35.10) Операция агрегирования, представленная в панели Estimated Execution PlanПримечание. Поскольку имя таблицы Order Details содержит ключевое слово и пробел, здесь должен использоваться параметр SET QUOTED_IDENTIFIER ON. Это позволяет указывать имя таблицы Order Details в кавычках. Для получения более подробной информации по этому параметру найдите "SET QUOTED_IDENTIFIER" Books Online.
Просмотр плана для хранимой процедуры
Для просмотра плана исполнения хранимой процедуры нужно просто вызвать эту хранимую процедуру из окна Query Analyzer. В панели Query Analyzer будет выведен оценочный план вызванной вами хранимой процедуры. На рис. 35.11 показан план для процедуры sp_who. (Отметим, что план исполнения этой широко используемой хранимой процедуры очень сложен.) Вы можете просматривать план исполнения хранимой процедуры, не зная, какие операторы T-SQL образуют эту процедуру.
(рис 35.11) План исполнения хранимой процедуры, показанный в панели Estimated Execution Plan
Использование браузера объектов
Браузер объектов (Object Browser) – это расширение в Query Analyzer, включенное в SQL Server 2000. Запустив Query Analyzer, вы увидите браузер объектов в левой части этого окна. Браузер объектов разбит на две секции: секция объектов баз данных и секция общих объектов (Common objects). В секции объектов баз данных вы можете выполнять перемещение по объектам, таким как таблицы и представления. В секции общих объектов обеспечивается удобный доступ к системным объектам и функциям. Вам нужно выполнить просмотр в браузере объектов, чтобы выяснить, какую информацию он содержит, и затем определить, что вы можете использовать.
Объекты базы данных
Верхняя секция браузера объектов содержит объекты баз данных. Вы сразу видите базы данных по умолчанию и любые созданные вами базы данных под обозначением системы SQL Server, которой они принадлежат. Чтобы увидеть информацию, которая содержится в браузере объектов, нужно просто раскрыть объекты. Раскроем базу данных Northwind и затем раскроем папку User Tables (Пользовательские таблицы). Вы увидите таблицы базы данных Northwind (рис. 35.12).
(рис 35.12) Просмотр таблиц в браузере объектовЗатем вы можете раскрывать определенные пользователем таблицы и затем раскрывать папки, содержащие информацию о колонках, индексах, ограничениях, зависимостях и триггерах. На рис. 35.13 раскрыта таблица Orders. Вы можете также раскрывать соответствующие папки для просмотра информации о системных таблицах, представлениях, хранимых процедурах, функциях и определенных пользователем типах данных.
Доступ к информации базы данных внутри Query Analyzer – очень удобное средство, поскольку это позволяет создавать операторы SQL и хранимые процедуры без необходимости поиска информации об объектах вне Query Analyzer. Вы можете не только просматривать информацию в браузере объектов, но также редактировать объекты, перемещать объекты методом "drag and drop" и даже формировать сценарии создания и модифицирования объектов. Это еще более расширяет функциональные возможности Query Analyzer.
Секция Common Objects
Нижняя часть браузера объектов – это папка с именем Common Objects (Общие объекты) (рис. 35.14).

(рис 35.14) Раскрытие таблицы в браузере объектов(рис 35.13) Раскрытие папки в секции Common objects (Общие объекты) браузера объектовВнутри этой папки находятся папки, содержащие информацию о таких объектах, как функции конфигурирования, функции курсоров, функции даты и времени, а также математические функции. Тем самым вы получаете простой доступ к функциям без необходимости поиска их синтаксиса.
Если раскрыть какую-либо папку в этой секции, то вы увидите соответствующие функции этой папки (функции конфигурирования на рис. 35.14). Вы можете перетаскивать эти функции в панель запросов или, поместив курсор мыши поверх функции, вы можете видеть ее краткое описание. Это удобно для обработки эпизодических запросов.
Кроме доступа к глобальным переменным, вы имеете доступ к вызовам других полезных функций, таких как математические и строковые функции. Продолжая раскрывать объекты, вы можете получать, например, информацию о параметрах этих функций. На рис. 35.15 показана папка Parameters (Параметры) раскрытой математической функции.
(рис 35.15) Просмотр параметров в браузере объектов
Использование SQL Profiler
В дополнение к использованию Query Analyzer для поиска неэффективных операторов T-SQL вы можете также использовать утилиту SQL Server Profiler. Profiler позволяет наблюдать за всеми операторами T-SQL, которые выполняются в системе, с графическим отображением информации об этих операторах. Profiler также предоставляет возможности сортировки и фильтрации, которые можно использовать для выявления операторов T-SQL, использующих основную часть ресурсов ЦП и ввода-вывода. Обладая этой информацией, вы можете определять, каким операторам
T-SQL уделить основное внимание для их настройки. Операторы T-SQL, которые вызываются из приложения, можно просматривать в Profiler; при этом вам не требуется доступ исходному коду самого приложения.
Утилита Profiler в SQL Server 2000 действует аналогично утилите Profiler в SQL Server 7, но она содержит некоторые улучшения. Одним из полезных дополнений является шаблон трассировки (trace template), который можно использовать для создания файлов трассировки. (Трассировку нужно по-прежнему создавать до того, как вы сможете использовать ее для мониторинга операций SQL Server.) В SQL Server трассировки должны были создаваться вручную.
Для вызова утилиты Profiler и запуска трассировки выполните следующие шаги.
Щелкните на кнопке Start, укажите пункт Programs, укажите Microsoft SQL Server и затем выберите Profiler. При первоначальном открытии окна Profiler оно будет пустым. Не будет открыто ни одной панели, и не будет выполняться никакого профилирования в SQL Server.
Чтобы начать создание профилирование, вы должны выбрать для выполнения существующий шаблон трассировки или создать новый шаблон трассировки для выполнения. (Процесс запуска описан на шаге 4.) SQL Server 2000 Profiler предоставляет для выбора целый ряд шаблонов трассировки. Использование этих шаблонов трассировки может сэкономить вам много времен, поскольку вам не нужно создавать трассировку с самого начала. Чтобы увидеть список шаблонов трассировки, щелкните на меню File (Файл), укажите команду Open (Открыть) и выберите пункт Trace Templates (Шаблоны трассировки), чтобы появилось диалоговое окно Open (рис 35.16(рис 35.16) Диалоговое окно Open со списком шаблонов трассировкиИмеются следующие шаблоны трассировки, поставляемые вместе с SQL Server.SQLServerProfilerSP_Counts.tdf. Подсчитывает количество запущенных хранимых процедур. Результаты группируются по именам хранимых процедур и содержат количество запусков соответствующей процедуры.
SQLServerProfilerStandard.tdf. Собирает общую информацию о соединениях, выполненных хранимых процедурах и пакетах SQL в порядке их выполнения.
SQLServerProfilerTSQL.tdf. Собирает информацию обо всех операторах T-SQL в порядке их поступления в SQL Server от пользователей. Эта трассировка содержит просто операторы T-SQL и моменты времени их запуска.
SQLServerProfilerTSQL_Duration.tdf. Выводит запущенные операторы T-SQL, а также время (в миллисекундах), которое потребовалось для выполнения этих операторов.
SQLServerProfilerTSQL_Grouped.tdf. Собирает данные, аналогичные тому, что собирает SQLServerProfilerTSQL, но группирует операторы по пользователям, запустившим эти операторы.
SQLServerProfilerTSQL_Replay.tdf. Предоставляет подробную информацию о запускавшихся операторах T-SQL. Эта трассировка содержит данные, которые можно использовать для воспроизведения операторов T-SQL в Query Analyzer.
SQLServerProfilerTSQL_SPs.tdf . Выводит указанные хранимые процедуры, а также команды T-SQL внутри этих процедур. Результаты выводятся в порядке выполнения.
SQLServerProfilerTuning.tdf. Собирает данные о хранимой процедуре и выполнении пакета SQL.
Эти шаблоны трассировки могут оказаться очень полезными. Например, шаблон трассировки SQLServerProfilerTSQL_Duration может помочь вам в определении операторов T-SQL, на выполнение которых требуется больше всего времени. Эта информация может послужить отправной точкой для оптимизации запроса. Оператор может занимать много времени, потому что он выполняет много работы или, может быть, потому, что он действует неэффективно. Как вы увидите на следующем шаге, для любой трассировки у вас должен использоваться заранее определенный шаблон.
Для запуска трассировки щелкните на File, укажите команду New (Создать) и затем выберите пункт Trace (Трассировка). Появится диалоговое окно Connect to SQL Server (рис 35.17(рис 35.17) Диалоговое окно Connect to SQL Server
Появится окно Trace Properties (Свойства трассировки) (рис 35.18(рис 35.18) Вкладка General окна Trace Properties (Свойства трассировки)
Далее щелкните на вкладке Events (События) (рис 35.19(рис 35.19) Вкладка Events (События) окна Trace PropertiesВ этой вкладке вы можете выбрать одно или несколько событий, которые будут отслеживаться в данной трассировке. Можно отслеживать целый ряд классов (категорий) событий и конкретных событий. В окне списка Available event classes (Имеющиеся классы событий) содержатся такие классы событий, как Cursors (Курсоры), Errors and Warnings (Ошибки и предупреждения), Locks (Блокировки), Objects (Объекты), Scans (Сканирования), SQL Operators (Операторы SQL), Stored Procedures (Хранимые процедуры), Transactions (Транзакции) и TSQL.
После выбора событий, трассировку которых вы хотите выполнять, щелкните на вкладке Data Columns (Колонки данных) (рис 35.20(рис 35.20) Вкладка Data Columns (Колонки данных) окна Trace Properties
Щелкните на вкладке Filters (Фильтры) (рис. 35.21). В этой вкладке вы можете указывать, нужно ли, чтобы утилита Profiler включала или исключала определенные события. Например, вам следует исключить трассировку самой утилиты Profiler. (Это установка по умолчанию.) Исключая процессы SQL Server, вы делаете окно Profiler менее насыщенным и более удобным для чтения.
По окончании установки параметров щелкните на кнопке Run для запуска данной трассировки. Если вы внесли какие-либо изменения в шаблон трассировки, то рекомендуется сохранить этот модифицированный шаблон трассировки под другим именем с помощью команды Save As меню File. После запуска трассировки в окне Profiler будут выводиться события по мере их возникновения. В соответствии с шаблоном трассировки, выбранным в этом примере, события будут сортироваться по длительности (в миллисекундах). На рис. 35.22 показано окно Profiler с результатами трассировки.
Внимание. Profiler может использовать значительную часть системных ресурсов в условиях большой загруженности системы. Чем больше событий отслеживается в трассировке, тем выше дополнительная нагрузка на систему.

(рис 35.22) Вкладка Filters (Фильтры) окна Trace Properties(рис 35.21) Выполняемая трассировка
Оптимизация операторов T-SQL
В предыдущих разделах вы изучали, как следить за выполнением операторов T-SQL с помощью утилиты Profiler и как определять план исполнения и метод доступа к данным с помощью Query Analyzer. Мы также рассматривали простой пример модифицирования оператора T-SQL для улучшения его производительности. Используя эти средства, вы можете теперь модифицировать многие типы операторов T-SQL, чтобы улучшить показатели их выполнения. В этом разделе мы рассмотрим несколько способов оптимизации операторов T-SQL, чтобы повысить их производительность или чтобы они использовали меньше системных ресурсов.
Оптимизация плана исполнения
Модифицирование плана исполнения может оказаться трудным делом, а создание лучшего плана исполнения, чем у оптимизатора запросов, может оказаться еще более трудным делом. Наиболее вероятны улучшения от внесения изменений в план исполнения операторов JOIN, GROUP BY, ORDER BY и UNION. Вы можете легко модифицировать эти операции, пробуя различные подсказки и просматривая результаты (см. раздел "Использование подсказок" далее). Изменяя подсказку и просматривая результаты в окне Query Analyzer, вы, возможно, найдете более эффективный вариант выполнения оператора.
К сожалению, не существует какого-либо единого подхода к настройке операторов T-SQL для получения более высокой производительности. Поскольку каждая база данных уникальна и каждое приложение отличается от других приложений, модификации должны выполняться для каждого конкретного случая.
Выбор метода доступа к базе данных
Как уже говорилось выше в этой лекции, методы доступа к данным – это, по сути, объекты, используемые системой SQL Server при выборке данных из базы данных. Анализируя свою базу данных и данные, которые она содержит, вам, возможно, удастся оптимизировать метод доступа к данным, когда целью оптимизации является снижение количества операций ввода-вывода.
Модификации метода доступа к данным, как и модификации плана исполнения, должны выполняться для каждого конкретного случая. Следующие рекомендации помогут вам в выборе более эффективного метода доступа к данным.
Используйте наиболее подходящий индекс.Использование наиболее подходящего индекса для операции является необходимым условием достижения наиболее высокой производительности. Наиболее подходящий индекс для определенной операции – это индекс, позволяющий наиболее быстро находить данные с использованием наименьшего числа операций ввода-вывода. Вы можете определить наиболее подходящий индекс, исходя из знания особенностей вашей базы данных и ее данных или используя утилиту Query Analyzer. Эта утилита позволяет вам опробовать различные сценарии, чтобы определить индекс, который позволяет считывать минимальное количество строк. (Напомним, что Query Analyzer просто оценивает количество возвращаемых строк; чтобы определить точное количество строк, вы должны использовать Profiler.)Примечание.Как уже говорилось в лекции 17, индексы очень важны для SQL Server, но они могут приводить к снижению производительности при неверном использовании. Следите за количеством индексов на одну таблицу – особенно при большом количестве операций для операторов INSERT, UPDATE и DELETE. Излишнее количество индексов приводит к снижению производительности для операций этого типа, поскольку модифицирование индексов сопряжено с дополнительной нагрузкой на систему.
Используйте охватывающие (covering) индексы. Использование охватывающих (covering) индексов, возможно, позволит вам обойтись без операции ввода-вывода в процессе поиска данных (см. лекцию 17). Вместо доступа к соответствующей таблице вам, возможно, удастся считывать необходимые данные из самого индекса.
Снижайте количество возвращаемых строк.Определите, насколько необходимы те или иные данные, возвращаемые в результате запросов. Модифицируйте запросы T-SQL, чтобы в них выполнялся доступ только к необходимым данным. Не считывайте строки, которые будут затем отброшены. Снижение количества строк, считываемых из базы данных, может быть достигнуто в результате повышения селективности запроса.
Использование подсказок
Вы можете изменять метод доступа к данным и план исполнения, модифицируя сам оператор T-SQL, но в случае ошибок этот метод может нарушить функциональные требования к данному оператору T-SQL. Более надежным методом оптимизации операторов T-SQL является использование подсказок. С помощью подсказок вы можете указывать оптимизатору запросов, какие операции он должен выполнять и какие объекты он должен использовать. В этом разделе вы узнаете о различных подсказках SQL Server и об их использовании.
Подсказки операций связывания
Подсказки операций связывания (join hints) используются, чтобы указывать оптимизатору запросов типы операций связывания, которые он должен выполнять. (Если в запросе не указано никакого типа, то оптимизатор запросов выбирает тип самостоятельно.) В SQL Server вы можете выполнять связывание вложенных цепочек, хеш-связывание, связывание слиянием и удаленное связывание. Вы указываете метод связывания с помощью следующих подсказок.
LOOP. Указывает связывание вложенных цепочек. При этом типе связывания для каждой строки внешней таблицы проверяется каждая строка внутренней таблицы на совпадение значений указанных полей.
HASH. Указывает хеш-связывание. При этом типе связывания одна таблица преобразуется как хеш-таблица. Другая таблица сканируется по одной строке, и для поиска совпадений используется хеш-функция.
MERGE. Указывается связывание с сортировкой слиянием. При этом типе связывания сортируется каждая таблица, и затем каждая строка каждой таблицы сравнивается с соответствующей строкой в убывающем порядке.
REMOTE. Указывает удаленное связывание. При этом типе связывания хотя бы одна их участвующих таблиц является удаленной.
Рассмотрим пример использования подсказки для операции связывания. Мы используем пример из раздела "Просмотр плана для операции связывания" выше в этой лекции и укажем следующую хеш-подсказку:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders, Employees
WHERE Orders.EmployeeID = Employees.EmployeeID
OPTION (HASH JOIN)
Примечание. Подсказки для связывания являются взаимоисключающими – можно одновременно указывать только одну подсказку.
Если вы решили использовать для связывания синтаксис SQL-92, то можете задать тип связывания, также используя подсказку. Применяя синтаксис SQL-92, вы могли бы переписать предыдущий запрос следующим образом:
SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders INNER HASH JOIN Employees
ON (Orders.EmployeeID = Employees.EmployeeID)
Использование подсказок для связывания является достаточно сложной темой, и не существует никаких правил, указывающих, когда использовать подсказки для связывания. Существует много причин для выбора определенной операции связывания, таких как предикаты, размер каждой таблицы при связывании и количество таблиц, участвующих в операции связывания. Чтобы определить, нужно ли изменять операцию связывания, лучше всего опробовать каждый тип связывания в Query Analyzer и посмотреть, какой из них дает меньшую стоимость. Но обычно наилучший способ для операции связывания выбирает оптимизатор запросов.
Подсказки для запросов
Подсказки для запросов используются для указания того, как следует выполнять определенные операции запроса. Подсказки для запросов разбиты на три категории: GROUP BY, UNION и остальные.
Подсказки GROUP BY. Следующие подсказки указывают, как следует выполнять операции GROUP BY или COMPUTE.
HASH GROUP BY. Указывает, что для выполнения операции GROUP BY будет использоваться хеш-функция
ORDER GROUP BY. Указывает, что для выполнения операции GROUP BY будет использоваться операция сортировки.
Используя пример GROUP BY из раздела "Просмотр плана для операции агрегирования" выше в этой лекции, мы можем указать с помощью подсказки, как должна выполняться операция HASH GROUP BY:
SELECT CustomerID, SUM(OrderDetails.UnitPrice)
FROM Orders, OrderDetails
GROUP BY CustomerID
OPTION (HASH GROUP)
Примечание. Подсказки типа GROUP BY являются взаимоисключающими – можно одновременно использовать только одну подсказку.
Подсказки UNION. Следующие подсказки используются для указания того, как следует выполнять операции UNION.
MERGE UNION. Для выполнения операции UNION используется операция MERGE.
HASH UNION. Для выполнения операции UNION используется хеш-функция.
CONCAT UNION. Для выполнения операции UNION используется функция конкатенации.
Вот пример использования подсказки CONCAT UNION:
SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM orders
WHERE CustomerID = 'TOMSP'
UNION
SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM orders
WHERE EmployeeID = '4'
OPTION (CONCAT UNION)
Примечание. Подсказки типа UNION являются взаимоисключающими.
К сожалению, не существует какой-либо "секретной формулы", которую можно использовать для определения наиболее подходящей операции UNION в вашей ситуации. И здесь лучше всего использовать Query Analyzer для опробования различных подсказок UNION, чтобы посмотреть, какая из них дает наилучшую стоимость. Обычно наилучшую стратегию для операций UNION определяет оптимизатор запросов SQL Server.
Остальные подсказки.Следующие подсказки можно использовать для выполнения различных запросных операций.
FORCE ORDER. Указывает, что доступ к таблицам должен выполняться в том же порядке, как они представлены в запросе. По умолчанию SQL Server может изменять порядок следования таблиц.
ROBUST PLAN. Указывает, что оптимизатор запросов должен быть готов к максимально возможному размеру строк. Вот пример использования этой подсказки:SELECT OrderID, CustomerID, Employees.EmployeeID, FirstName,
LastName, OrderDate
FROM Orders, Employees
WHERE Orders.EmployeeID = Employees.EmployeeID
OPTION (ROBUST PLAN)
Подсказки для таблиц
Подсказки для таблиц используются, чтобы управлять способом доступа к таблицам.
Здесь описаны две подсказки для таблиц.
FAST n.Заменяет FASTFIRSTROWS, сохраненную для обратной совместимости. Эта подсказка указывает SQL Server, что нужно оптимизировать выборку n первых строк данных.
INDEX = имя_индекса. Указывает оптимизатору запросов, что нужно использовать указанный индекс, когда имеется такая возможность. В одном из первых примеров этой лекции показано, как использовать подсказку INDEX. Мы повторяем здесь этот пример:SELECT OrderID, CustomerID, EmployeeID, OrderDate
FROM orders WITH (INDEX = EmployeeID)
WHERE EmployeeID = 5
OPTION (FAST 10)
Квалификатор WITH не является обязательным.
Подсказка INDEX = EmployeeID указывает, что должен использоваться индекс EmployeeID. Если указана подсказка FAST 10, то SQL Server будет оптимизировать выборку первых 10 строк (если возможно) и затем будет возвращать остальные строки.
Заключение
В этой лекции вы узнали, как использовать Query Analyzer для определения плана исполнения и методов доступа к данным, наиболее подходящих для данного запроса. Кроме того, вы узнали, как использовать Profiler для просмотра операторов
T-SQL, которые выполняются в вашей системе, и как запускать трассировки, чтобы определить наличие некоторых операторов T-SQL, возможно, вызывающих проблемы производительности. Вы также узнали, как оптимизировать план исполнения и методы доступа к данным, исходя из структуры вашей базы данных и ваших данных. И, наконец, вы узнали, как использовать подсказки для указания того, что должен использоваться определенный план исполнения или метод доступа к данным. В лекции 36 эта тема будет развита: вы узнаете о проблемах производительности и способах их разрешения.