powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Почему так создается план?
6 сообщений из 6, страница 1 из 1
Почему так создается план?
    #32097784
Alexander Rudenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть у меня запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT BOOK_SENTENCES.SEN_VALUE
FROM ROWSTOWORDS
   INNER JOIN WORDS ON (ROWSTOWORDS.WORD_ID = WORDS.WORD_ID)
   INNER JOIN BOOK_SENTENCES ON (ROWSTOWORDS.ROW_ID = BOOK_SENTENCES.SENTENCE_ID)

 WHERE
  (words.WORD_VALUE = 'ящик')


по нему строится план:
Код: plaintext
PLAN JOIN (WORDS INDEX (WORDS_IDX1),ROWSTOWORDS INDEX (ROWSTOWORDS_IDX3),BOOK_SENTENCES INDEX (BOOK_SENTENCES_IDX2))


Тепрь меняем "=" на " LIKE ":
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT BOOK_SENTENCES.SEN_VALUE
FROM ROWSTOWORDS
   INNER JOIN WORDS ON (ROWSTOWORDS.WORD_ID = WORDS.WORD_ID)
   INNER JOIN BOOK_SENTENCES ON (ROWSTOWORDS.ROW_ID = BOOK_SENTENCES.SENTENCE_ID)

 WHERE
  (words.WORD_VALUE LIKE 'ящик%') 


Получаем план:
Код: plaintext
PLAN JOIN (BOOK_SENTENCES NATURAL,ROWSTOWORDS INDEX (ROWSTOWORDS_IDX1),WORDS INDEX (XPKWORDS,WORDS_IDX1))


Как мне избавиться от этого NATURAL ?
...
Рейтинг: 0 / 0
Почему так создается план?
    #32097921
Hi

Like использует прямой перебор. Используй Starting with, где это возможно.
Правда, в Yaffil LIKE умеет при возможности использовать индекс.

WBR,
Alexey
...
Рейтинг: 0 / 0
Почему так создается план?
    #32098294
Alexander Rudenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу LIKE :

Имеем запрос:

Код: plaintext
1.
2.
SELECT WORDS.WORD_ID, WORDS.WORD_VALUE
FROM WORDS
WHERE word_value LIKE 'ящи%'


Получаем план:

Код: plaintext
PLAN (WORDS INDEX (WORDS_IDX1))


как я понял используются индексы.
...
Рейтинг: 0 / 0
Почему так создается план?
    #32098470
Привет!

Да, правильно - не туда смотрю :)

Попробуй так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT BOOK_SENTENCES.SEN_VALUE
FROM ROWSTOWORDS
   INNER JOIN WORDS ON (ROWSTOWORDS.WORD_ID = WORDS.WORD_ID)
   INNER JOIN BOOK_SENTENCES ON (ROWSTOWORDS.ROW_ID = BOOK_SENTENCES.SENTENCE_ID)

 WHERE
  (words.WORD_VALUE LIKE 'ящик%') 
and BOOK_SENTENCES.SENTENCE_ID> 0   /*это фиктивное условие, чтобы оптимизатор подтолкунть к использованию индекса*/  
...
Рейтинг: 0 / 0
Почему так создается план?
    #32098487
Alexander Rudenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
От такого фиктивного условия сервер вообще загибается.
Он пытается сначала применить фиктивное словие и по выбранному словию отсеять лишние записи.

План:
Код: plaintext
PLAN JOIN (ROWSTOWORDS INDEX (ROWSTOWORDS_IDX1),WORDS INDEX (XPKWORDS,WORDS_IDX2),BOOK_SENTENCES INDEX (BOOK_SENTENCES_IDX2,BOOK_SENTENCES_IDX1))
...
Рейтинг: 0 / 0
Почему так создается план?
    #32098710
Привет!

Черт его знает - база то твоя :)
Если автоматическая реакция не срабатывает, то только ты сам можешь покрутить возможные варианты...

Попробуй поменять порядок INNER JOIN, попробуй вынести условие из WHERE в JOIN, попробуй ручной план.

Почитай теорию планирования - www.krista.ru/ib

Если уж совсем невмоготу - подпишись на техподдержку на ibase.ru, тогда люди будут думать над твоей проблемой за плату :)

WBR,
Alexey
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Почему так создается план?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]