2016-12-08 1 views
1

У меня есть оператор SQL, который занимает очень много времени для выполнения, и мне действительно нужно было его как-то улучшить.Индекс базы данных, когда оператор SQL включает в себя предложение «IN»

select * from table where ID=1 and GROUP in 
(select group from groupteam where 
department= 'marketing') 

Вопрос в том, следует ли мне создавать индекс по идентификаторам столбцов и группе, это поможет? Или, если нет, я должен создать индекс на второй таблице в столбце DEPARTMENT? Или мне нужно создать два индекса для обеих таблиц?

Первая таблица имеет 249003. Вторая таблица имеет в общей сложности 900 строк, в то время как запрос в этой таблице возвращает только 2 строки. Вот почему я удивлен, что ответ так медленный.

Спасибо

+0

Это не так много записей для обработки базы данных. В общем, да, индекс поможет. Какой тип базы данных? –

+0

Да, вам нужен индекс для ID и GROUP. Или сначала выберите записи в таблице Temp. Выберите в #tmpGroups из groupteam, где department = 'marketing'. Затем присоединитесь к этой соблазнительной таблице. Выберите –

+0

. Hi используется вся база данных db2. – Dejan

ответ

2

Вы также можете использовать EXISTS, в зависимости от вашей базы данных так:

select * from table t 
where id = 1 
and exists (
    select 1 from groupteam 
    where department = 'marketing' 
     and group = t.group 
) 
  • Создание составного индекса по отдельным показателям на кафедре groupteam и группы
  • Создание составного индекса или отдельных индексов на таблицы id и group

Сделайте explain/analyze в зависимости от вашей базы данных, чтобы просмотреть как индексы используются вашим движком базы данных.

+0

Я согласен, но я предпочитаю и существует (выберите * .... Использование * более читаемо в соответствии с моим. И не лучше в производительности (его миф) http://stackoverflow.com/questions/6137433/ где-do-the-practice-exists-select-1-from-come-from – Esperento57

+1

Это очень хорошая ссылка, которую вы поделились. Спасибо, @ Esperento57. – zedfoxus

0

Попробуйте присоединиться вместо:

select * from table t 
JOIN groupteam gt 
ON d.group = gt.group 
where ID=1 AND gt.department= 'marketing' 

Индекс на tablegroup и id колонки и таблицы groupteamgroup колонка поможет тоже.

Смежные вопросы