Кто силен в оптимизации sql запросов
Такая проблема, в таблице много записей и надо выбрать
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
Не оптимизировало... какие способы еще есть?
Такая проблема, в таблице много записей и надо выбрать,...
Первое что пришло в голову:
WHERE x LIKE '%[^12345]'
WHERE x LIKE '%[^12345]'
Те же 15 сек...
Как вариант - создать функциональный индекс по выражению RIGHT(x,1), если ваша СУБД это позволяет.
Не совсем понимаю смысл оператора RIGHT(x, 1). Если это - получить символ с конца, то можно создать реверсивный индекс, опять-таки, если это поддерживается в вашей СУБД.
В таблице около 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.
М.б. еще как вариант выдать пользователю Персен, пусть выпьет, успокоится, подождет? :)
М.б. еще как вариант выдать пользователю Персен, пусть выпьет, успокоится, подождет? :)
Комедия))
Спасибо всем за участие