Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Оптимизация запросов

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных
Предыдущая тема :: Следующая тема  
Автор Сообщение
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    Заголовок сообщения: Ответить с цитатой

Спасибо, попробую.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...