Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
tpg Member Откуда: Novosibirsk Сообщений: 23902 |
Есть ещё Full text search |
22 дек 03, 11:20 [468997] Ответить | Цитировать Сообщить модератору |
Long Member Откуда: Rostov Сообщений: 38 |
2(tpg) Есть, но насколько я знаю, он ориентирован только на поиск по словам целиком, но не по фрагментам слов. |
22 дек 03, 11:22 [469004] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31771 |
Для третьего варианта могу предложить только такой (конечно, полный бред, но работать будет :-) )
Сделать таблицу алиасов с значнниями всех вариантов с произвольного символа и до конца. Таблица будет большая, но искать будет быстро. Для с/н GN432S943CU в этой таблице будут записи: GN432S943CU N432S943CU 432S943CU 32S943CU 2S943CU S943CU 943CU 3CU CU U |
22 дек 03, 11:41 [469037] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31771 |
ЗЫ.
И вариант 2 по ней можно искать, никаких реверсов не надо будет... |
22 дек 03, 11:42 [469040] Ответить | Цитировать Сообщить модератору |
Long Member Откуда: Rostov Сообщений: 38 |
2(alexeyvg) Ну вообще вариант конечно. А искать как лучше? Одним запросом через 'или' по всем колонкам? |
22 дек 03, 11:47 [469053] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31771 |
В каком смысле "Одним запросом через 'или' по всем колонкам"?
Я имел в виду сделать одну таблицу алиасов с ссылкой на таблицу, содержащую SN. В принципе, если ввести ограничение на длинну, можно денормализовать, введя нужное к-во колонок в основную таблицу и ища по или. Но это всё замедлит до первоначального варианта, т.к. индексы использоваться не будут. |
22 дек 03, 13:09 [469243] Ответить | Цитировать Сообщить модератору |
Fazan
Guest |
Встречался такой вариант:
В таблицу было добавлено поле, в котором хранились символы, входящие в слово (в данном случае - в серийный номер), в отсортированном виде. То есть: ZZXYXY -> XXYYZZ. Искомое слово преобразуется к такому же виду. Количество вариантов при поиске может значительно сократиться. На такое поле можно навесить индекс. |
22 дек 03, 15:49 [469609] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |