|
Программирование >> Полное сканирование таблицы
В следующих разделах я опишу два стиля диаграмм запросов - полные и упрощенные. Полные диаграммы включают все данные, которые потенциально могут относиться к проблеме настройки. Упрощенные диаграммы более качественные и не содержат данных, которые обычно не требуются. Я начну с описания полных диаграмм, так как понять упрощенные диаграммы, рассматривая их как полные диаграммы, из которых удалили подробности, легче, чем полные диаграммы как упрощенные с добавленными деталями. Полные диаграммы запросов в примере 5.1 показан простой запрос, иллюстрирующий все значимые элементы диаграммы запроса. Пример 5.1. Простой запрос с одним соединением SELECT O.DepartmentJame. E.Last Name. Е. Fi rstjame FROM Employees E. Departments D WHERE E.Department Id=D.Department Id AND E.ExemptJlag=Y AND D.US BasedJlag= V; Этот запрос переводится в диаграмму запроса, показанную на рис. 5.1. EOJ 20 Т0.98 Рис. 5.1. Полная диаграмма запроса для простого запроса Сначала я опишу значение каждого элемента диаграммы, а затем объясню, как создать диаграмму, используя в качестве стартовой точки SQL-код. Информация, отображаемая в диаграммах запросов в математических терминах то, что вы видте на рис. 5.1, является направленным графом. Это набор узлов и связей, причем связей часто обозначаются стрелками, указывающие направление. Узлы на этой диаграмме представлены буквами Е и D. Рядом с узлами и обоими концами каждой связи есть числа, которые указывают дополнительные свойства узлов и связей. В терминах запроса вы можете интерпретировать эти элементы диаграммы следующим образом. Узлы Узлы представляют таблицы или псевдонимы таблиц в разделе FROM - в нашем случае это псевдонимы Е и D. Вы можете сокращать названия таблиц или псевдонимов, как вам удобно, если только это не вызовет двусмысленности или недопонимания. Связи Связи представляют соединения между таблицами, а направленная связь обозначает, что соединение гарантированно получит уникальные значения в той таблице, на которую указывает связь. В данном случае Department ID - первичный (уникальный) ключ в таблице Departments, поэтому у связи есть стрелка на конце, указывающем на узел D. Так как Department ID не уникален в таблице Employees, на другом конце связи стрелки нет. Следуя моим обозначениям, всегда рисуйте связи, состоящие из одной стрелки, так, чтобы стрелка указывала вниз. Если вы всегда будете рисовать стрелки, направленные вниз, то вам будет намного проще читать планы, где главные таблицы всегда буд)Т расположены под детальными таблицами. В главах 6 и 7 я опишу правила большого пальца для поиска оптимальных планов исполнения при помощи диаграмм запроса. Так как эти правила обрабатывают соединения с главными таблицами иначе, нежели соединения с детальными таблицами, в них, чтобы удобно различать эти два типа, специально упоминаются соединения вниз и соединения вверх. Хотя вы можете догадаться, что Department ID - это первичный ключ для Departments, SQL не объявляет явно, какая сторона соединения является первичным ключом, а какая - внешним. Необходимо проверить индексы или объявленные ключи, чтобы удостовериться, что Department! D гарантированно уникален в таблице Departments. Подчеркнутые числа Подчеркнутые числа рядом с узлами обозначают долю строк каждой таблицы, удовлетворяющих условиям фильтрации для этой таблицы. Здесь под условиями понимаются не условия соединения, а условия, относящиеся только к конкретной таблице на диаграмме SQL. На рис. 5.1 10 % строк таблицы Employees удовлетворяют условию ExemptFl ag= Y, и 50 % строк таблицы Depa rtments удовлетворяют условию US Based Flag=Y. Я называю эти доли коэффициентами фильтрации. Часто для одной или нескольких таблиц вообще не указаны условия фильтрации. В этом случае для коэффициента фгшьтрации (R) я использую значение 1,0, так как 100 % строк удовлетворяют (несуществующим) условиям фильтрации для этой таблицы. Также в подобных случаях я обычно вообще не указываю коэффициент фильтрации на диаграмме. Отсутствие этого числа обозначает R = 1,0 для данной таблицы. Коэффициент фильтрации не может быть больше 1,0. Зачастую можно приблизгггельно угадать значение коэффициентов фильтрации, зная, что представляют таблицы и столбцы. Если вам доступны распределения реальных данных, вы можете найти точные значения коэффициентов фгшьтрации, просто получив и проанализировав эти данные. Рассматривайте каждую фгшьтрованную таблицу с операторами фильтрации, относящимися только к этой таблице, как однотабличный запрос, и ищите селективность условий фильтров так, как я рассказывал в главе 2 в разделе Вычисление селективности . Во время фазы разработки приложения вы не можете всегда точно знать, каких коэффициентов фильтрации следует ожидать во время работы приложения на реальных объемах данных. В этом случае производите оценку, основываясь на знании работающего приложения, а не на крохотных искусственных объемах данных в тестовых базах данных. Неподчеркнутые числа Неподчеркнутые числа рядом с обоими концами связи представляют среднее количество строк, найденных в таблице на этом конце соединения для соответствующей строки на другом конце соединения. Я называю их коэффициентами соединения. Коэффициент соединения в начале соединения - это детальный коэффициент соединения, а на конце соединения (со стрелкой) - главный коэффициент соединения. Главные коэффициенты соединения всегда меньше или равны 1,0, так как уникальный ключ гарантирует обнаружение нескольких главных строк для одной детальной. Часто встречается случай, когда в детальной таблице внешний ключ обязателен и ссылочная целостность данных идеальна (что гарантирует существование подходящей главной строки), тогда главный коэффициент соединения равен в точности 1,0. Детальные коэффициенты соединения могут быть равны любому неотрицательному числу. Они могут быть меньше 1,0, так как некоторые отношения главной и детальной таблиц разрешают существование нуля, одной или многих детальных строк, причем чаще всего встречается случай один к нулю . В этом примере обратите внимание, что для средней строки Employees есть соответствующая строка (с которой она связана) в Departments в 98 % случаев, тогда как средняя строка Departments соответствует (связывается с) 20 строкам Employees. Хотя вы можете приблизительно угадать коэффициенты соединения, зная, что собой представляют таблицы, старайтесь, когда это возможно, получать эти значения из полных, реальных распределений данных. Так же, как и с коэффициентами фильтрации, вам может потребоваться вычисление коэффициентов соединения во время фазы разработки приложения. Что не входит в диаграммы запросов Понимать, что не входит в диаграммы запросов, так же важно, как знать, что они включают. В следующих разделах описаны несколько элементов, которые в диаграммы не входят, и дано этому объяснение. Списки выбора Диаграммы запросов полностью исключают любые упоминания списков столбцов и выражений, которые выбирает запрос (то есть все, что находрггся между SELECT и FROM). Производительность запроса практически полностью определяется тем, какие строки выбираются из базы данных, и каким образом вы их получаете. Что вы делаете с этими строками, какие столбцы возвращаются, и какие выражения вы подсчитываете - это практически несущественно для производительности. Главное, но редкое исключение из этого правила - когда вы изредка выбираете так мало столбцов из таблицы, что база данных может вьшолнть запрос, используя только данные из индекса, совершенно не обращаясь к основной таблице. Иногда доступ только к индексу может существенно сэкономить ресурсы, но он мало влияет на решения, которые вы принимаете относительно оставшейся части плана исполнения. Решать, нужно ли попробовать только индексный доступ, следует в последний момент процесса настройки и только если наилучший план без применения этой стратегии оказывается слишком медленным.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |