Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизация выборки записей по фрагменту строки в строковом поле  [new]
Long
Member

Откуда: Rostov
Сообщений: 38
Добрый день!
Есть таблица серийных номеров. Большая, колво записей уже более 4млн.
Поле SN - varchar(20), по нему построен индекс.
По ней надо осуществлять несколько вариантов поиска.
Вариант 1, самый простой: поиск по первым символам СН, в запросе условие SN like 'ХХХ%', время выполнения запроса менее 1 сек.
Вариант 2: поиск по последним символам: SN like '%XXX'
Вариант 3: поиск по вхождению подстроки: SN like '%XXX%'

Как можно оптимизировать 2ой и 3ий варианты?
Насчет второго ещё есть мысли, сделать либо индексированную view с полем reverse(SN) и индексом по нему, либо просто в лоб добавить в таблицу колонку с reverse(SN) и индекс по ней. Хотя не знаю, какой из этих вариантов оптимальнее. А может есть другое решение?
А вот насчет третьего варианта даже не представляю, что можно придумать.
22 дек 03, 11:16    [468987]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация выборки записей по фрагменту строки в строковом поле  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Есть ещё Full text search
22 дек 03, 11:20    [468997]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация выборки записей по фрагменту строки в строковом поле  [new]
Long
Member

Откуда: Rostov
Сообщений: 38
2(tpg) Есть, но насколько я знаю, он ориентирован только на поиск по словам целиком, но не по фрагментам слов.
22 дек 03, 11:22    [469004]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация выборки записей по фрагменту строки в строковом поле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31771
Для третьего варианта могу предложить только такой (конечно, полный бред, но работать будет :-) )

Сделать таблицу алиасов с значнниями всех вариантов с произвольного символа и до конца. Таблица будет большая, но искать будет быстро.

Для с/н GN432S943CU в этой таблице будут записи:
GN432S943CU
N432S943CU
432S943CU
32S943CU
2S943CU
S943CU
943CU
3CU
CU
U
22 дек 03, 11:41    [469037]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация выборки записей по фрагменту строки в строковом поле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31771
ЗЫ.
И вариант 2 по ней можно искать, никаких реверсов не надо будет...
22 дек 03, 11:42    [469040]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация выборки записей по фрагменту строки в строковом поле  [new]
Long
Member

Откуда: Rostov
Сообщений: 38
2(alexeyvg) Ну вообще вариант конечно. А искать как лучше? Одним запросом через 'или' по всем колонкам?
22 дек 03, 11:47    [469053]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация выборки записей по фрагменту строки в строковом поле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31771
В каком смысле "Одним запросом через 'или' по всем колонкам"?

Я имел в виду сделать одну таблицу алиасов с ссылкой на таблицу, содержащую SN.

В принципе, если ввести ограничение на длинну, можно денормализовать, введя нужное к-во колонок в основную таблицу и ища по или. Но это всё замедлит до первоначального варианта, т.к. индексы использоваться не будут.
22 дек 03, 13:09    [469243]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация выборки записей по фрагменту строки в строковом поле  [new]
Fazan
Guest
Встречался такой вариант:
В таблицу было добавлено поле, в котором хранились символы, входящие в слово (в данном случае - в серийный номер), в отсортированном виде.
То есть: ZZXYXY -> XXYYZZ.
Искомое слово преобразуется к такому же виду.
Количество вариантов при поиске может значительно сократиться.
На такое поле можно навесить индекс.
22 дек 03, 15:49    [469609]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить