Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Тоу Д. -> "Настройка SQL. Для профессионалов" -> 93

Настройка SQL. Для профессионалов - Тоу Д.

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 87 88 89 90 91 92 < 93 > 94 95 96 97 98 99 .. 161 >> Следующая


M JxR=O.1x0.03=0.003

Al 0.01 А2 JxR=O. 1 ХІ =0.1

Ў Ў

BI 08 В2 JxR=O.1x0.05=0.005 Рис. 6.21. Эффективные фильтры для выбора ведущей таблицы

Рисунок 6.22 приводит к точно такому же результату. He имеет значения, что в этот раз наименьший начальный коэффициент фильтрации не связан напрямую с фильтрующим соединением. Все узлы на фильтрованной стороне соединения получают преимущество фильтра соединения при выборе ведущей таблицы, а все фильтры на другой стороне соединения — нет. Ни у Al, ни у А2 нет фильтров, идущих от М, поэтому выберите первым узел Al, так как фильтр следующего шага для BI лучше. Порядок соединения будет таким же, как в предыдущем примере.

M 0.03

Al А2

Y Y

BI OOI В2 005

Рис. 6.22. Еще один пример с детальным коэффициентом соединения, меньшим 1,0

На рис. 6.23 узлы M и В2 получают одинаковое преимущество от фильтрующего соединения, поэтому просто сравните исходные коэффициенты фильтрации и выберите В2. Начиная с этой точки, порядок соединения будет полностью ограничен скелетом соединения — (В2. А2. М. Al. BI).

На рис. 6.24 снова сравниваются только фильтрованные узлы на одной стороне фильтрующего соединения, но заметили ли вы влияние на последующий порядок соединения?

Преимущество фильтрующего соединения появляется, только если вы выполните соединение в этом направлении. Так как вы начинаете с А2, соединение этого узла с M проводится обычным соединением вида «один ко многим», которое следует отложить на как можно более поздний срок. Таким образом, следует выполнить
Сложный пример

187

соединение вниз с В2 перед тем, как соединять вверх с М, даже несмотря на то, что у M лучше коэффициент фильтрации. Следовательно, порядок соединения (А2. В2, М. Al. BI).

M 0.03

Al А2

Ў T

BI В20.01

Рис. 6.23. В этом примере сравниваются фильтры только на одной стороне фильтрующего соединения

M 0.3

Al А20.02

T Y

BI В201

Рис. 6.24. В этом примере также сравниваются фильтры только на одной стороне фильтрующего соединения

Перед тем как продолжить чтение, попробуйте построить порядок соединения для рис. 6.25 самостоятельно.

M 0.3

Al 0.02 А205

T T

BI OJ В2

Рис. 6.25. Последний пример с детальным коэффициентом соединения, большим 1,0

Обратите внимание, что в данном случае корректировка коэффициентов фильтрации при выборе ведущей таблицы не играет роли в выборе фильтрованной стороны соединения. Все равно фильтр для Al остается наилучшим. Тогда с чего же начать? Теперь на сцену выходит фильтрующее соединение. Это соединение, имеющее вид «один ко многим», в действительности обычно превращается в «один к нулю». Поэтому, хотя на диаграмме оно выполняется снизу вверх, вам следует
188

6. Выбор наилучшего плана выполнения

предпочесть его обыкновенному соединению вниз с обычным коэффициентом соединения (для удобства не показанным), равным 1,0. При выборе следующей таблицы эффективный фильтр для M равен R ? J (0,3 ? 0,1 = 0,03), и он лучше, чем фильтр для BI, поэтому следующее соединение должно быть с М. Однако при сравнении А2 и BI нужно сравнивать простые, не скорректированные коэффициенты фильтрации, поскольку вы, в каком-то смысле, уже израсходовали преимущество фильтрующего соединения на М. Таким образом, полный порядок соединения (Al. М. BI. А2. В2).

Главные коэффициенты соединения, меньшие 1,0

У главных коэффициентов соединений, меньших 1,0, есть два возможных объяснения.

¦ Отношение с главной таблицей не применяется (или неизвестно) в некоторых случаях, когда внешний ключ для главной таблицы равен null.

¦ Отношение с главной таблицей в некоторых случаях повреждено, когда не равное null значение внешнего ключа указывает на недопустимую запись из основной таблицы. Так как единственная допустимая цель внешнего ключа — однозначно указывать на соответствующую главную запись, не равные null значения этого ключа, не связанные с главной таблицей, являются нарушением ссылочной целостности. Эти сбои ссылочной целостности неизбежны в нашем неидеальном мире, но идеальный ответ на такие ситуации — исправить их, или удалив детальные записи, которые стали лишними после того, как приложение удалило главные записи. Также можно исправить внешний ключ, заставив его указывать на допустимую главную запись или приравняв null. Ошибкой было бы исправлять SQL-код, чтобы он мог работать в обход испорченного отношения, которое вскоре должно быть исправлено. Поэтому в случае сбоев ссылочной целостности, вам следует игнорировать главные коэффициенты соединения, меньшие 1,0. Первый случай встречается часто, и вполне допустим в некоторых таблицах.

Например, если компания в предыдущем примере с таблицей Loans — это банк, то он может потребовать, чтобы в этой таблице хранились все займы, которые дает банк, а не только займы, сделанные для его сотрудников. В такой таблице Loans допустимое реальное значение поля Employee_ID будет встречаться редко, и практически всегда будет равным null. Однако в этом случае базе данных не нужно производить соединение, чтобы использовать этот ценный скрытый фильтр соединения, отбрасывающий строки. Если база данных уже достигла таблицы Loans, лучше сделать фильтр явным, указав в запросе условие, например, Empl oyee_ID IS NOT NULL. Таким образом, ядро выполнения отбросит не входящие в соединение строки, как только перейдет к таблице Loans. Можно сделать так, чтобы следующее соединение использовало другой фильтр ближе к началу плана выполнения, не ожидая соединения с Empl oyees.
Предыдущая << 1 .. 87 88 89 90 91 92 < 93 > 94 95 96 97 98 99 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100