|
Программирование >> Полное сканирование таблицы
соединение вниз с В2 перед тем, как соединять вверх с М, даже несмотря на то, что у М лучше коэффициент фильтрации. Следовательно, порядок соединения (А2, 82. М. А1. 81). МО.ОЗ В1 82001 Рис. 6.23. В этом примере сравниваются фильтры только на одной стороне фильтрующего соединения МО.З А20.02 82 01 Рис. 6.24. В этом примере также сравниваются фильтры только на одной стороне фильтрующего соединения Перед тем как продолжить чтение, попробуйте построить порядок соединения для рис. 6.25 самостоятельно. А10.02 Л205 В1 0.1 Рис. 6.25. Последний пример с детальным коэффициентом соединения, большим 1,0 Обратите внимание, что в данном случае коррехсгировка коэффициентов фильтрации при выборе ведущей таблицы не играет роли в выборе фильтрованной стороны соединения. Все равно фильтр для А1 остается наилучшим. Тогда с чего же начать? Теперь на сцену выходит фильтрующее соединение. Это соединение, имеющее вид один ко многим , в действительности обычно превращается в один к нулю . Поэтому, хотя на диаграмме оно выполняется снизу вверх, вам следует ПРИМЕЧАНИЕ Можно ожидать, что программное обеспечения базы данных самостоятельно умеет понимать, что внутреннее соединение подразумевает условие не null* для внешнего ключа, который может принимать значение null. Базы данных могут автоматически применять это предполагаемое условие при первой же возможности, но я никогда не видел, чтобы они это делали. предпочесть его обыкновенному соединению вниз с обычным коэффициентом соединения (для удобства не показанным), равным 1,0. При выборе следующей таблицы эффективный фильтр для М равен R ? J (0,3 ? 0,1 = 0,03), и он лучше, чем фильтр для В1, поэтому следующее соединение должно быть с М. Однако при сравнении А2 и В1 нужно сравнивать простые, не скорректированные коэффициенты фильтрации, поскольку вы, в каком-то смысле, уже израсходовали преимущество фильтрующего соединения на М. Таким образом, полный порядок соединения (А1. М. В1. А2. В2). Главные коэффициенты соединения, меньшие 1,0 у главных коэффициентов соединений, меньших 1,0, есть два возможных объяснения. Отношение с главной таблицей не применяется (или неизвестно) в некоторых случаях, когда внешний 1слюч для главной таблицы равен null. Отношение с главной таблицей в некоторых слзаях повреждено, когда не равное null значение внешнего ключа указывает на недопустимую запись из основной таблицы. Так как единственная допустимая цель внешнего ключа - однозначно указывать на соответствующую главную запись, не равные null значения этого ключа, не связанные с главной таблицей, являются нарушением ссылочной целостности. Эти сбои ссылочной целостности неизбежны в нашем неидеальном мире, но идеальный ответ на тшсие ситуации - исправить их, или удалив детальные записи, которые стали лишними после того, как приложение удалило главные записи. Также можно исправить внешний ключ, заставив его указывать на допустимую главную запись или приравняв null. Ошибкой было бы исправлять SQL-код, чтобы он мог работать в обход испорченного отношения, которое вскоре должно быть исправлено. Поэтому в слзае сбоев ссылочной целостности, вам следует игнорировать главные коэффициенты соединения, меньшие 1,0. Первый случай встречается часто, и вполне допустим в некоторых таблицах. Нап()имер, если компания в предыдущем примере с таблицей Loans - это банк, то он может потребовать, чтобы в этой таблице хранились все займы, которые дает банк, а не только займы, сделанные для его сотрудников. В такой таблице Loans допустимое реальное значение поля Employee ID будет встречаться редко, и практически всегда будет равным null. Одншсо в этом случае базе данных не нужно производить соединение, чтобы использовать этот ценный скрытый фильтр соединения, отбрасывающий строки. Если база данных уже достигла таблицы Loans, лучше сделать фильтр явным, указав в запросе условие, например, Employee ID IS NOT NULL. Таким образом, ядро вьтолнения отбросит не входящие в соединение строки, как только перейдет к таблице Loans. Можно сделать так, чтобы следующее соединение использовало другой фильтр ближе к началу плана вьшолнения, не ожидая соединения с Empl oyees. В следующих примерах предположите, что главный коэффициент соединения, меньший 1,0, возникает только из-за иногда равных null внешних ключей, а не из-за сбоев в ссылочной целостности. Выберите ведущую таблицу, выполняя правила в этом разделе. Если ведущая таблица соединяется с дополнительной главной таблицей сверху, явно укажите условие не null в запросе и поместите селективность этого условия в коэффициент фильтрации детального узла. Рассмотрим диаграмму SQL на рис. 6.26. М0.1 А10.01 А2 0.1 j В10.8 82 0.2 ВЗ Рис. 6.26. Запрос с фильтрующим главным соединением Сначала посмотрим: влияет ли главный коэффициент фильтрации на выбор ведущей таблицы? Обе стороны соединения от А1 к В1 получают преимущество от этого скрытого фильтра соединения, и у А1 лучше начальный коэффициент фильтрации. Узлы, присоединенньге к В1 снизу, также получили бы преимущество, но под В1 нет узлов. Ни у одного другого узла нет конкурирующего коэффициента фильтрации, поэтому начнем с А1, как если бы скрьггого фильтра не было. Чтобы получить максимальное преимущество от такого начала, явно укажите условие не null для внешнего ключа А1, который указывает на В1, добавив следующий оператор: Al.ForeignKeyloBl IS NOT NULL Это явное добавление оператора в SQL-код позволяет базе данных выполнить первое соединение с другой таблицей, используя только долю, равную 0,01 х 0,1 = - 0,001 строк из А1. Если в фильтре ведущего индекса участвует столбец ForeignKeyToBl, база данных может вообще не считывать ненужные строки из А1. Что же присоединять дальше? Так как база данных уже использовала скрытый фильтр (теперь не скрытый) в явном условии А1. ForeignKeyToBl IS NOT NULL, то этот фильтр сгорел , поэтому сравнивайте В1 с В2, гак если бы фильтрующего соединения вообще не было. ПРИМЕЧАНИЕ В действительности после применения условия не nulU фильтрующего соединения больше не существует. Строки, с которых база данных начинает до выполнения этих соединений, успешно присоединяются к В1, поскольку строки с внешними ключами, равными null, уже отброшены. Сравнивая 81 и 02 по их простым коэффициентам фильтрации, сначала выберите 82, получив в итоге порядок соединения (А1. 82. 81. М. А2. 83). Теперь рассмотрите диаграмму на рис. 6.27 и попробуйте обработать ее самостоятельно перед тем, как читать дальше. И снова фильтрующее соединение не оказывает никакого влияния на выбор ведущей таблицы, так как коэффициент фильтрации для М намного лучше даже
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |