Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Princess
Зарегистрирован: 05.10.2005 Сообщения: 48
|
Добавлено: Ср Окт 05 2005 10:08 Заголовок сообщения: Оптимизация запросов |
|
|
Люди, подскажите.
У меня 2 таблицы. Установлены индексы. При запуске запроса на внешнее объединение этих таблиц, индексы не используются и происходит полное сканирование таблиц.
Спасибо |
|
Вернуться к началу |
|
|
Anvano
Зарегистрирован: 24.03.2005 Сообщения: 58
|
Добавлено: Ср Окт 05 2005 15:14 Заголовок сообщения: |
|
|
А какая у тебя база данных, какая структура таблиц, по каким полям индексы и по каким полям происходит связывание таблиц мы сами догадываться должны? |
|
Вернуться к началу |
|
|
Princess
Зарегистрирован: 05.10.2005 Сообщения: 48
|
Добавлено: Вт Окт 11 2005 16:47 Заголовок сообщения: |
|
|
Структура
Таблица А: id, dt1, dt2
Taблица В: id, dt, a, b
индексы заданы по всем полям кроме B.b
Запрос:
SELECT A.dt1, A.dt2, B.a, B.b
FROM A, B
WHERE A.dt2 = B.dt
Данный запрос вызывает Table Access Full. Почему он не сканирует индексы? |
|
Вернуться к началу |
|
|
Anvano
Зарегистрирован: 24.03.2005 Сообщения: 58
|
Добавлено: Вт Окт 11 2005 17:53 Заголовок сообщения: |
|
|
В данном случае, если не задается никаких других условий, то по одной из таблиц в ЛЮБОМ случае будет фулл скан.
Потому что база полюбому должна выбрать данные из одной из таблиц а потом привязать к ней вторую по условию соединения.
В вашем запросе очень многое зависит
1) От размера таблиц (какая из них меньше)
2) От количества уникальных значений полей dt2 и dt
Если база Oracle , то пропишите хинты в запросе.
Пример 1. Если таблица А маленькая, а таблица B большая
SELECT /*+ ordered use_hash(B) index(B <название_индекса_по_полю_B.dt>) */
A.dt1, A.dt2, B.a, B.b
FROM A,B
WHERE A.dt2 = B.dt
В этом случае по таблице А будет фулл скан, а к ней по индексу завяжется таблица Б
Пример 2. Если таблица B маленькая, а таблица А большая, то заходим в запрос по таблице B:
SELECT /*+ ordered use_hash(A) index(А <название_индекса_по_полю_A.dt2>) */
A.dt1, A.dt2, B.a, B.b
FROM B, A
WHERE A.dt2 = B.dt
В этом случае фулл скан будет по таблице B, а к ней по индексу завяжется таблица A
В любом случае для вышеприведенного запроса по одной из таблиц будет произведен фуллскан, потому что не задано никаких дополнительных условий на отсев данных.
ЗЫ: Метод соединения Hash Join выбран в предположении что обе таблицы довольно приличного размера. Если первая талица очень маленькая, или будет задано дополнительное условие на отбор данных, то можно использовать обычный nested loop (хинт use_nl())
Последний раз редактировалось: Anvano (Ср Окт 12 2005 10:58), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
Princess
Зарегистрирован: 05.10.2005 Сообщения: 48
|
Добавлено: Ср Окт 12 2005 10:57 Заголовок сообщения: |
|
|
Спасибо, попробую. |
|
Вернуться к началу |
|
|
|