|
Программирование >> Полное сканирование таблицы
тировки и операторов, обеспечивающих уникальность сортировки, которые удаляют дубликаты. С ними вы встречаетесь часто, но назначение этих функций интуитивно понятно и они не столь важны для производительности. Однако есть и важная для нас тонкость, с которой вы также часто будете иметь дело. Она относится к подзапросам. Я продемонстрирую ее в следующем примере: SELECT E.First Name. Е.Nickname. E.Last Name. E.Phone Number. L.Description FROM Employees E INNER JOIN Locations L DN E.Location ID=L.Location ID WHERE (E.First Name= ? OR E.Nickname= ?) AND EXISTS (SELECT 1 FROM Wage Payments P WHERE P.Employee ID=E.Employee ID AND P.Payment Date > CURRENT DATE - 31 DAYS): Оставьте все таблицы пустыми. Создайте следующие индексы. Empl oyees (First Nanie) Employees(Nickname) Locations(Location ID) Wage Payments(Employee ID) Будет создан следующий план выполнения: StmtText SELECT E.FirstJame. E.Nickname, E.Lastjame. E.Phone Number. L.Description FROM Employees E. Locations L WHERE (E.First Name=Kathy OR E.N1ckname=Kathy) AND E.Location ID=L.Location ID AND EXISTS (SELECT null FROM Wage Payments P WHERE P.EmployeeJD=E.Employee ID AND P.Payment Date > DATEADD(DAY.-31.GETDATE( ))): (1 row(s) affected) StmtText (--Nested Loops(Left Semi Join) --Filter(WHERE:([E].[FirstJame]=Kathy OR [E].[Nickname]=Kathy)) (--Bookmark Lookup(...(...[Employees] AS [E])) (--Nested Loopsdnner Join) (--Table Scan(...(...[Locations] AS [L])) j - -Index Seek(... [Employees]. [EmployeeLocationID] (wrapped line) AS [E]). SEEK:([E].[LocationJD]=[L].[Location ID]) ORDERED) (--Filter(WHERE:([P].[Payment Date]>dateadd(4. -31. getdate( )))) (--Bookmark Lookup(...(...[Wage Payments] AS [P])) (--Index (wrapped line) Seek(...(...[Wage Payments].[Wage Payment Employee ID] (wrapped line) AS [P]). SEEK:([P].[EmployeeJD]=[E].[EmployeeJD]) ORDERED) (9 row(s) affected) Этот план выполнения демонстрирует полное сканирование таблицы Locations как ведущей таблицы, так как к ней производится первое обращение на самом глубоком уровне вложенности. Затем SQL Server выполняет вложенные циклы по индексу по внещнему ключу Employee Location ID, чтобы присоединить Employees. После обработки таблицы Empl oyees SQL Server отбрасывает строки, не удовлетворяющие условию для полей Fi rst Name и Ni ckname. Далее выполняется специальное соединение, называемое полусоединением, чтобы достигнуть коррелированного подзапроса на присоединение подходящих записей из Employee ID с использованием индекса Wage Payment Employee ID. При помощи идентификаторов строк из этого индекса производится обращение к Wage Payments, после чего условие последнего фильтра по Payment Date отбрасывает старые строки, не удовлетворяющие подзапросу EXISTS. Соединение с коррелированным подзапросом EXISTS показано в самом первом шаге, который описан как Left Semi Joi п. Этот результат не является оптимальным планом выполнения для заполненных таблиц, но так как тестирование проводилось на пустых таблицах, я бы и не ожидал появления плана исполнения, подходящего для больших объемов данных. Управление планами выполнения в этой главе рассматриваются два способа настройки планов выполнения. Мы рассмотрим универсальные техники, которые работают в любых базах данных, и способы работы, подходящие для конкретных серверов баз данных. Индивидуальные техники хорошо описаны в соответствующей документации, поэтому вы, возможно, уже знакомы с ними. В общем случае для получения в точности желаемого плана вьшолнения вам понадобятся оба варианта способов настройки. В этой главе предусмотрены отдельные разделы, посвященные техникам настройки, присущим различным серверам баз данных, причем одинаковая информация в них может повторяться. Поэтому вы можете пропустить разделы, которые вас не интересуют. Для управления планами вьшолнения было придумано множество сложных инструментов. Эта глава сосредоточена на простейших способах управления планами, с акцентом на получение планов таких типов, которые вам понадобятся для оптимизации реального SQL. Я обнаружил, что если заранее знать, какой план вьшолнения вы хотите получить, то процесс существенно упрощается и требует лишь простейших инструментов. Универсальные техники управления планами В этом разделе описано несколько независимых от используемого сервера баз данных техник управления планами вьшолнения. Эти методы удобно использовать для следующих целей. Использовать правильный индекс. Запретить использование неподходящих индексов. Использовать желаемый порядок соединения. Запретить соединения в неправильном порядке; Выбрать порядок вьшолнения внешних запросов и подзапросов. Предоставить оптимизатору верные данные для анализа. Нагрузить стоимостный оптимизатор плохими данными. Эти способы часто являются хорошей альтернативой специальным методам для достижения желаемых планов вьшолнения. Если у вас есть выбор, какую технику
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |