Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Построение индекса для звпросов с использованием оператора OR / 5 сообщений из 5, страница 1 из 1
13.05.2014, 18:33
    #38640172
roman_lenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индекса для звпросов с использованием оператора OR
День добрый!

Поделитесь секретами построения оптимальных индексов для запросов в которых используется оператор OR. Например, есть какае-то упрощённая таблица с кластерным индексом по полю age:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Table{

    varchar name,

    int age
};

create clustered index AGE on Table(age);



Если выполнять простой запрос вида:

Код: sql
1.
select name from Table where age = 25;



то тут всё просто: СУБД просто найдёт страницу индекса (Index Seek) где age = 25 и вернёт оттуда значения.

Но если есть запрос:

Код: sql
1.
select name from Table where age = 25 OR 33;



То задача усложняется — какой путь выберет СУБД — я не знаю. СУБД, возможно, разделит указанный выше запрос на два:

Код: sql
1.
2.
select name from Table where age = 25;
select name from Table where age = 33;



и выполнит их по отдельности в 2-х различных системных потоках (Threads) и это компенсирует необходимость выполнять 2 запроса последовательно. Но, скорее всего, СУБД выполнит Index Scan — т.е., сканирование всей таблицы целиком, что не есть хорошо...

В общем, что посоветуете? — что делать с этими операторами OR?
...
Рейтинг: 0 / 0
13.05.2014, 18:41
    #38640180
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индекса для звпросов с использованием оператора OR
roman_lenkoВ общем, что посоветуете?
Лично я посоветую идти в раздел своей СУБД, поскольку индексы и способы выполнения
запросов сильно индивидуальная вещь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.05.2014, 18:42
    #38640183
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индекса для звпросов с использованием оператора OR
roman_lenkoНо, скорее всего, СУБД выполнитЧто гадать? Возьмите конкретную СУБД и попробуйте.
В любом случае, конкретные ответы могут быть применимы только к конкретным СУБД.

Кстати, я бы посоветовал вместо OR использовать IN.
Код: sql
1.
age IN (25,33)

Мне кажется, что так в абстрактно-потолочной СУБД шансы на использование индекса будут выше.
...
Рейтинг: 0 / 0
13.05.2014, 18:49
    #38640191
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индекса для звпросов с использованием оператора OR
miksoftКстати, я бы посоветовал вместо OR использовать IN.
Код: sql
1.
age IN (25,33)

Мне кажется, что так в абстрактно-потолочной СУБД шансы на использование индекса будут выше.

Ну если уж так говорить, то тогда вообще лучше использовать 2 запроса с union - тут у абстрактно-потолочной СУБД шансов потерять индекс вообще не останется :)
...
Рейтинг: 0 / 0
13.05.2014, 18:53
    #38640195
roman_lenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индекса для звпросов с использованием оператора OR
Блин — действительно, следовало бы задать это в разделе MSSQL — не додумался сразу. Жаль создавать дубликат темы, но прийдётся. За советы спасибо — натолкнуло на раздумия.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Построение индекса для звпросов с использованием оператора OR / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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