Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизировать запрос, убрать IN, если можно 
:(
    Опции темы
Akella
  Дата 10.2.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Код

select * from apart
where
   (ID in (select id_apart from PHONES where TEL in ('7403050', '683023', '640566')))
OR
  (ID = 1858)


Как бы извратиться так, чтобы убрать конструкцию IN? Просто Firebird не использует индексы для IN

Добавлено через 1 минуту и 24 секунды
Условие
Код

in ('7403050', '683023', '640566')


составляется динамически на клиенте
PM MAIL   Вверх
skyboy
Дата 10.2.2009, 15:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Код

SELECT *
FROM apart
WHERE apart.id = 1858
UNION ALL
SELECT apart.*
FROM apart
INNER JOIN phones
ON phones.id_apart = apart.id
WHERE phones.tel in ('7403050', '683023', '640566')

или в "phones.tel in ..." индекс тоже не будет использоваться? 
PM MAIL   Вверх
Akella
Дата 10.2.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Таблицы такие:
apart: ID, и ещё куча полей

phones: id, tel, id_apart

phones.id_apart и apart.ID связаны внешним ключом


PM MAIL   Вверх
December
Дата 10.2.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 1
Всего: 57



Не проверял, но inner join должен помочь
Код

select * from apart, PHONES
where
apart.ID = PHONES.id_apart 
AND (
     PHONES.TEL = '7403050'
  OR PHONES.TEL = '683023'
  OR PHONES.TEL = '640566'
  OR apart.ID = 1858
)



--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Akella
Дата 10.2.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



smile супер

Добавлено через 17 секунд
парни, спасибо,

Добавлено через 4 минуты и 10 секунд
December, твой код, также отработал, как и мой:
Цитата

План
PLAN (PHONES INDEX (FK_PHONES_APART))
PLAN JOIN (APART NATURAL, PHONES INDEX (FK_PHONES_APART))

Адаптированный план
PLAN (PHONES INDEX (FK_PHONES_APART)) PLAN JOIN (APART NATURAL, PHONES INDEX (FK_PHONES_APART))

------ Performance info ------
Prepare time = 16ms
Execute time = 1s 765ms
Avg fetch time = 588,33 ms
Current memory = 995 036
Max memory = 1 014 504
Memory buffers = 2 048
Reads from disk to cache = 3 809
Writes from cache to disk = 0
Fetches from cache = 679 514




skyboy, твой вообще быстро:
Цитата

План
PLAN (PHONES INDEX (FK_PHONES_APART))
PLAN (PHONES INDEX (FK_PHONES_APART))
PLAN (APART INDEX (PK_APART))
PLAN JOIN (PHONES INDEX (PHONES_IDX_TEL, PHONES_IDX_TEL, PHONES_IDX_TEL), APART INDEX (PK_APART))

Адаптированный план
PLAN (PHONES INDEX (FK_PHONES_APART)) PLAN (PHONES INDEX (FK_PHONES_APART)) PLAN (APART INDEX (PK_APART)) PLAN JOIN (PHONES INDEX (PHONES_IDX_TEL, PHONES_IDX_TEL, PHONES_IDX_TEL), APART INDEX (PK_APART))

------ Performance info ------
Prepare time = 0ms
Execute time = 16ms
Avg fetch time = 4,00 ms
Current memory = 933 740
Max memory = 935 636
Memory buffers = 2 048
Reads from disk to cache = 9
Writes from cache to disk = 0
Fetches from cache = 58



PM MAIL   Вверх
Akella
Дата 10.2.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



А вот Alex подсказал:
Код

select a.*

from PHONES p
left join apart a on p.id_apart = a.id
where TEL in ('7403050', '683023', '640566')

тоже результат отличный
Цитата

План
PLAN (PHONES INDEX (FK_PHONES_APART))
PLAN JOIN (P INDEX (PHONES_IDX_TEL, PHONES_IDX_TEL, PHONES_IDX_TEL), A INDEX (PK_APART))

Адаптированный план
PLAN (PHONES INDEX (FK_PHONES_APART)) PLAN JOIN (P INDEX (PHONES_IDX_TEL, PHONES_IDX_TEL, PHONES_IDX_TEL), A INDEX (PK_APART))

------ Performance info ------
Prepare time = 0ms
Execute time = 16ms
Avg fetch time = 5,33 ms
Current memory = 740 680
Max memory = 743 236
Memory buffers = 2 048
Reads from disk to cache = 12
Writes from cache to disk = 0
Fetches from cache = 47

PM MAIL   Вверх
skyboy
Дата 10.2.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Цитата(Akella @  10.2.2009,  14:51 Найти цитируемый пост)
left join

зачем left join, если ты даже убрал условие apart.id = 1858 и тебе за глаза хватило бы inner join?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.3876 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.