2013-05-13 2 views
2

Я пытаюсь выяснить способ оптимизации ниже SQL-запрос:Оптимизировать где предложение SQL

select * from SOME_TABLE 
where (col1 = 123 and col2 = 'abc') 
    or (col1 = 234 and col2 = 'cdf') 
    or (col1 = 755 and col2 = 'cvd') ---> I have around 2000 'OR' statements in a single query. 

В настоящее время этот запрос занимает много времени для выполнения, так есть в любом случае, чтобы сделать этот пробег запроса быстрее?

+3

Опубликовать план объяснения. Без этого это догадки. –

ответ

3
  • Создать таблицу CREATE TABLE lookup (col1 INT, col2 VARCHAR(3), PRIMARY KEY(col1, col2), KEY(col2)) ORGANIZATION INDEX подстановок или что-то соответствует вашим потребностям
  • Убедитесь, что индексы на исходной таблице (col1 и col2)
  • заполнить таблицу поиска с 2000 комбинаций

Теперь запрос

SELECT 
    mytable.* 
FROM mytable 
INNER JOIN lookup ON mytable.col1=lookup.col1 AND mytable.col2=lookup.col2 
+0

+1 хотя кажется, что ему нужна временная таблица. – haki

2

Сложно сказать, не видя план запроса, но я бы предположил, что это разрешает FTS с большим количеством CPU, выполняющим логику ИЛИ.

Если общий шаблон col1 = x и col2 = y, попробуйте создать таблицу с вашими парами 2000 и вместо этого присоедините. Если ваши 2000 пар поступают из других таблиц, укажите оператор select, который извлекает их прямо в ваш оператор SELECT.

Также убедитесь, что у вас есть все ваши уникальные ограничения и NOT NULL, поскольку это будет иметь значение. Рассмотрим индекс на col1 & col2, хотя не удивляйтесь, если он его не использует.

Не уверен, что это собирается сделать трюк, но опубликуйте более подробную информацию, если нет.

0

Выберите только нужные столбцы, не все (*) ... Но конечно, вы это знаете. Но если у вас более 2000 OR в вашем SQL-заявлении, возможно, пришло время его изменить! Если вы расскажете нам больше о своей базе данных, мы поможем вам лучше.

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