Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
 Re: оптимизация  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Если возможностей его использования нет то можно написать псевдоаналог(простейший разумеется). Можно например с помощью триггера в котором будет реализована логика с помощью которой реализовать доп индексирование. Простейший пример - текст разбивается на слова, которые пишутся в линковочную индексированную таблицу с ссылкой на первичный текст(запись). В этом случае можно делать по списку слов не like %xxx%x а like xxx% а затем по первичному ключу связывать. Есть разные подходы.(можно триггером писать лог новых записей а доп. индексацию по (МУМУ) делать сервисом, правда в этом случае пул необработанных записей обрабатывать отдельно) Разные подходы есть.
25 апр 17, 13:44    [20432637]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
J.d
тут ктото сказал что полнотекстовый не подойдет так как ищет слова целиком.
Не слова целиком, а с начала слова.
25 апр 17, 13:45    [20432642]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Только еще версию MSSQL посмотрите, я не помню с какой он появился.
25 апр 17, 13:47    [20432654]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
rnk
Member

Откуда:
Сообщений: 126
J.d
alexeyvg,

а это подходит для случая когда вбили в поиске - "автотранс" а в результатах ожидают увидеть "общество с ограниченной ответственностью мосавтотранс"

?

Как я уже отмечал, если нужно искать в текстовом поле по окончанию, можно добавить перевёрнутое поле и проиндексировать. Этот же подход применим и в FTS, делаем поле name_rev, индексируем, и ищем "снартотва*". Но, скажем, найти "автотранс" в строке "мосавтотрансстрой" FTS не поможет никак.
25 апр 17, 13:50    [20432684]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
J.d
если да, я просто пошел изучать FTS и всем спасибо за ваше время))


Можете начать вот с этой DMV и проверить, по каким словам будет найдена фраза:

select * 
from sys.dm_fts_parser('FORMSOF( INFLECTIONAL, "общество с ограниченной ответственностью мосавтотранс")', 1049, null, 0)
25 апр 17, 13:54    [20432709]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Да уж, пример мосавтотранс и автотранс - увы не поможет. В этом случае нужно перебор всей строки делать а предварительная индексация по комбинации слов с разной размерностью возможна, но приведет к огромному количеству комбинация ну и в результате к своей бесполезности.
Для начала я бы все таки просмотрел словарь запросов по которым осуществляется поиск. Как минимум наверное стоило бы выделять наименование компании отдельно, возможно краткое название и полное. выполнять сначала предварительный быстрый поиск и потом уже полным перебором пока клиент смотрит предварительный список.
25 апр 17, 13:59    [20432733]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
МуМу,

>> стоило бы выделять наименование компании отдельно,

да хорошая идея. я думаю никто не ищет по "общество" все вводят кусок названия. а не правовую форму. в большинстве случаев
"общество с ограниченной ответственностью" составляет больше половины названия.

хотя рано или поздно кол-во записей захлестнет и эту фишку
25 апр 17, 15:14    [20433006]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
J.d,

Обратите внимание - практически никто не учитывает ваши критерии:
- поиск по любому фрагменту внутри строки
- нужно всего лишь N первых строк

Я вам не зря рекомендовал изменить запрос - 20432633
25 апр 17, 15:25    [20433053]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
invm,

да, спасибо я так (примерно) и сделал, забыл сказать, спасибо. получил прирост скорости в 5 раз. пока что всех устраивает. но каждый день таблица растет на 200К строк и боюсь это временное решение.

все равно спасибо
25 апр 17, 15:29    [20433058]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
invm,

только я сначала запихнул во временную таблицу(#) ид-шник. потом по where id in ( ... )

ну тоже самое
25 апр 17, 15:30    [20433063]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
J.d,

почему не так как именно у вас - потому что там еще пара join на учредов есть. всё это вытащил во второй запрос.
25 апр 17, 15:31    [20433069]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
J.d
alexeyvg,

а это подходит для случая когда вбили в поиске - "автотранс" а в результатах ожидают увидеть "общество с ограниченной ответственностью мосавтотранс"

?
Нет, находятся только целые слова и их формы. То есть, если мосавтотранс в словарях не Является формой автотранс, то не найдёт.

Увы, это ограничение всех стандартных средств полнотекстовой индексации.

Что бы искало по фрагменту слова, нужно делать свой полнотекстовый поиск.
Поищите реализацию индексации от Дмитрия Костылева.
25 апр 17, 15:41    [20433114]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
alexeyvg,

принял
25 апр 17, 16:02    [20433181]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
почему никто не посоветовал in-memory tables ?
я, лично, не работал с ними в контексте mssql.
для моего случая объем слишком большой?
25 апр 17, 16:04    [20433192]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
J.d
каждый день таблица растет на 200К строк и боюсь это временное решение.
Основное отличие от первоначального варианта - индекс не сканируется целиком. Сканирование прекращается как только отобраны искомые N строк. Поэтому прирост объема таблицы, в большинстве случаев, особого значения не имеет.
J.d
только я сначала запихнул во временную таблицу(#) ид-шник.
В данном случае это лишний шаг.
25 апр 17, 16:06    [20433198]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
invm,

ок понял вас, спасибо счас пересмотрю решение
25 апр 17, 16:07    [20433203]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Да, забыл еще отметить что данная задача хорошо распараллеливается. Если ресурсов много и важна скорость, время реакции то увеличивайте параллелизм.
25 апр 17, 18:03    [20433490]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Еще раз повторю, что важна статистика запросов и состава данных. В качестве предположения выскажу несколько идей. Например как я уже высказал ранее предположение что самым информативным можно будет выделить наименование компании. Далее необходимо смотреть на статистику компаний и запросов по компаниям. Буду высказывать свои предположения. Мне кажется что как правило название компании состоит из одного слова. Наверное в 90 % случаев. Названия "Петров и компаньоны" , "price waterhouse" и т.п. мне кажется наверное редкость для России.(хотя наверное могу ошибаться) Предполагая, что большинство компаний(в данных) и запросов состоят из одного слова можно провести дальнейший анализ. Далее важно понимать распределение длин слов в данных и в запросах. К примеру бы если знать, что запрос всегда будет из 5-и букв среди слова с максимумом в 20 букв- свою индексацию можно было бы реализовать элементарно. Приведу пример - если вы понимаете, что запрос в 90% случае составляет слово от 5-и до 9-и букв а максимальное слово поиска 20 символов(также 90% составляет в названии компаний одно слово).То простая комбинаторика нам подскажет реализовать линковочные таблицы с указателями вхождения комбинаций строк на исходные данные. При вводе строки поиска будет сразу анализироваться количество символов. Если они входят в данные 90% то происходит поиск по (продвинутому)индексированию, если нет то запускается обычный like. В любом случае необходимо плясать от статистики. Если будет равномерное распределение то данная оптимизация станет контрпродуктивной. Но что то мне подсказывает что это не так.
25 апр 17, 18:36    [20433545]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
МуМу
Member

Откуда:
Сообщений: 1134
То о-о. Мне накидали пример кода, он тривиален и уже понятно, что автору он никак не поможет. Выкладывать код?
25 апр 17, 18:39    [20433553]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
o-o
Guest
дело ваше.
по мне, так это отдельная тема.
просто отдельная тема о том, как вы организовали свой FTS.
кому-то может пригодится, просто надо оформить с правильным названием
типа "альтернатива FTS или как улучшить производительность like %...%"
и в самом посте проблему еще раз хорошо описать,
чтобы на эту тему поиском попадали те, кто именно это ищет.
25 апр 17, 18:46    [20433576]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
uaggster
Member

Откуда:
Сообщений: 827
J.d
aleksrov,

а что мне делать? выхода пока не вижу. система проседает.

Если быстро и на коленке - установите для поля бинарный коллейт, например Cyrillic_General_100_BIN
Если в строке хранятся символы в разном регистре - сделайте вычисляемое поле Upper([name]) collate Cyrillic_General_100_BIN, проиндексируйте его и ищете по нему.

Оно по прежнему будет сканировать весь индекс, но будет делать это в 2-4 раза быстрее.

Иногда это спасает.
26 апр 17, 10:33    [20434873]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
uaggster,

спасибо! принял!
27 апр 17, 12:37    [20439544]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
МуМу,

распарралеливать, вы имеете ввиду DOP или не на уровне бд а на уровне веб приложения?
27 апр 17, 12:38    [20439550]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
МуМу
Member

Откуда:
Сообщений: 1134
И то и другое. По умолчанию Max dop но бывают ньюансы. В любом случае full scan хорошо параллелится.
27 апр 17, 12:48    [20439599]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация  [new]
МуМу
Member

Откуда:
Сообщений: 1134
То(0).Но только учтите, при нехватке серверных ресурсов - распараллеливание не самая лучшая штука. Издержки к сожалению есть.
27 апр 17, 19:09    [20441523]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить