Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Кто силен в оптимизации sql запросов

5.4K
15 марта 2010 года
cursor
114 / / 05.01.2008
Здравствуйте.
Такая проблема, в таблице много записей и надо выбрать
 
Код:
select x from table
where RIGHT(x,1) not in ('1','2','3','4','5')
group by x order by x

Выборка на 15 сек.
Подумал преобразовать RIGHT(x,1) not in ('1','2','3','4','5') в CAST(RIGHT(x,1) as decimal) и быстренько получать false, но сервер выкидывает запрос с ошибкой error convert varchar to decimal или же expression of non-boolean type specified.
Как это можно обернуть в простой результат false? И в случае успешности в true

UPDATE
ответ isnumeric(right(x,1))=0
Не оптимизировало... какие способы еще есть?
5
15 марта 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: cursor
Здравствуйте.
Такая проблема, в таблице много записей и надо выбрать,...


Первое что пришло в голову:

 
Код:
SELECT x FROM table
WHERE x LIKE '%[^12345]'
5.4K
15 марта 2010 года
cursor
114 / / 05.01.2008
Цитата: hardcase

 
Код:
SELECT x FROM table
WHERE x LIKE '%[^12345]'


Те же 15 сек...

8.2K
15 марта 2010 года
Ora-cool
211 / / 20.09.2007
У вас в любом случае выполняется полный перебор, т.к. даже если индекс по полю x создан, то он не может быть использован, т.к. значения в нем отсортированы по 1-й букве значения поля.
Как вариант - создать функциональный индекс по выражению RIGHT(x,1), если ваша СУБД это позволяет.
Не совсем понимаю смысл оператора RIGHT(x, 1). Если это - получить символ с конца, то можно создать реверсивный индекс, опять-таки, если это поддерживается в вашей СУБД.
253
15 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
ИМХО проще и быстрее всего сделать ещё одно поле типа CHAR, куда помещать все конечные символы поля x - а если ещё на него навесить индекс, то всё должно просто летать.
385
16 марта 2010 года
SomewherSomehow
477 / / 25.07.2004
Сколько строк в таблице? Какой длинны и типа поле x?
5.4K
17 марта 2010 года
cursor
114 / / 05.01.2008
Цитата: SomewherSomehow
Сколько строк в таблице? Какой длинны и типа поле x?


В таблице около 16 миллионов строк, поле x длинной 3-6 символов.

Цитата:
ИМХО проще и быстрее всего сделать ещё одно поле типа CHAR, куда помещать все конечные символы поля x - а если ещё на него навесить индекс, то всё должно просто летать.


Система разрабатывается сторонними производителями. А я хочу подправить интерфейс

8.2K
17 марта 2010 года
Ora-cool
211 / / 20.09.2007
Цитата: cursor
В таблице около 16 миллионов строк, поле x длинной 3-6 символов.

Система разрабатывается сторонними производителями. А я хочу подправить интерфейс



Без изменения схемы данных, увы, не обойтись.

253
17 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата: cursor
В таблице около 16 миллионов строк, поле x длинной 3-6 символов.


Такой огромной таблицей без ещё одного поля (см. мой пост выше) и индексом на нём вы, ИМХО, подвесите весь сервер счастливо и надолго.

385
17 марта 2010 года
SomewherSomehow
477 / / 25.07.2004
Цитата: cursor
В таблице около 16 миллионов строк, поле x длинной 3-6 символов.

Система разрабатывается сторонними производителями. А я хочу подправить интерфейс



Данных действительно прилично. В таком случае вряд ли можно грешить на функцию RIGHT. Чтобы убедитсья можешь сделать select x и RIGHT(x,1) - время существенно не изменится. Это что касается функции.

Теперь что касается поиска. Для поиска по такой таблице просто необходим индекс.
Причем, если сделать его по столбцу x, и в предложении where испоьзовать функции left, right, like '%something' то оптимизатор будет использовать его не эффективно (index scan), если использовать like 'something%' оптимизатор сможет задействовать поиск по индексу (index seek) и запрос будет работать быстро. К сожалению реверсивных индексов, как предложил Ora-cool в MSSQL нет, по этому самый лучший способ, на мой взгляд, предложил Proger_XP несколькими постами выше.

Если нет возможности изменять схему данных, м.б. попробовать, как варианты
1. Ограничить выборку из таблицы по каким-либо другим полям, по которым есть индексы?
2. Настроить репликацию в свою таблицу, в которой уже можно делать все что вздумается?

Больше пока идей нету...

Upd.
М.б. еще как вариант выдать пользователю Персен, пусть выпьет, успокоится, подождет? :)

5.4K
18 марта 2010 года
cursor
114 / / 05.01.2008
Цитата: SomewherSomehow

М.б. еще как вариант выдать пользователю Персен, пусть выпьет, успокоится, подождет? :)


Комедия))
Спасибо всем за участие

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог