Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000) / 13 сообщений из 13, страница 1 из 1
27.07.2020, 09:12
    #39984239
Pvase
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
Здравствуйте.
Есть таблица около 10 млн записей, в ней есть поля, Дата, КодПокупателя, КодТовара,Сумма,Количество и т.п. Но есть одно поле, в котором храниться описание товаров, оно длиной 3000. Можно как-то оптимизировать поиск по этому полю?
p.s.
Что уже сделано.
1 - для таблицы сделал ColumnStore индекс
2 - разместил базу в памяти с хеш индексом по колонке поиска.
Что получилось:
Выборка по таблице ColumnStore - запрос 9 минут 45 секунд
Выборка по таблице InMemοry - 9 минут 10 секунд.
Это очень много, подскажите, какие еще могут быть варианты решения данного вопроса?
...
Рейтинг: 0 / 0
27.07.2020, 09:53
    #39984251
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
Полнотекстовый поиск
...
Рейтинг: 0 / 0
27.07.2020, 21:36
    #39984492
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
Pvase
Это очень много, подскажите, какие еще могут быть варианты решения данного вопроса?
Зависит от требований к поиску.
...
Рейтинг: 0 / 0
28.07.2020, 00:54
    #39984532
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
Если поиск по like '%...%' то только дополнительными действиями (словарь, индексы вхождения,- не полноценный текстовый поиск, но некий аналог).

Относительно быстро работает like '...%' , если нужен поиск like '%...' то, похоже, имеет смысл сделать поле с реверсом и опять поиск по like '...%' по ревеснутому полю .

IMBO, есличо...
...
Рейтинг: 0 / 0
28.07.2020, 09:37
    #39984572
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
SIMPLicity_
Если поиск по like '%...%' то только дополнительными действиями (словарь, индексы вхождения,- не полноценный текстовый поиск, но некий аналог).

Относительно быстро работает like '...%' , если нужен поиск like '%...' то, похоже, имеет смысл сделать поле с реверсом и опять поиск по like '...%' по ревеснутому полю .

IMBO, есличо...

Если нужен поиск по like '%...%' - то либо полнотекстовый поиск, если ищут, в основном, по словам, или сделать UPPER поля, и перевести его бинарный коллэйт (статически, разумеется, а не в запросе).
По полям с бинарным коллейтом like '%...%' происходит раза в три быстрее.
...
Рейтинг: 0 / 0
28.07.2020, 12:50
    #39984601
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
Pvase,

если есть неатомарные поля, то такие поля преобразуют в атомарные, после чего выполняют поиск по таблице с атомарными значениями. Один из вариантов - механизм полнотекстного поиска, но он будет искать не произвольную строку, а по словам, которые начинаются с заданных символов с прочими модификаторами поиска.
Второй вариант - использовать самописный механизм разбора строки на атомарные единицы. При этом каждый элемент словаря связан со своей строкой. Например, буква А связана со строками 10,34,15, Б со строками 12,14,15 и так далее. Такое решение где-то упоминалось на форуме.

Кроме того, убедитесь, что у вас выполняется параллельный план запроса.
...
Рейтинг: 0 / 0
31.07.2020, 20:08
    #39985685
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
uaggster
SIMPLicity_
Если поиск по like '%...%' то только дополнительными действиями (словарь, индексы вхождения,- не полноценный текстовый поиск, но некий аналог).

Относительно быстро работает like '...%' , если нужен поиск like '%...' то, похоже, имеет смысл сделать поле с реверсом и опять поиск по like '...%' по ревеснутому полю .

IMBO, есличо...

Если нужен поиск по like '%...%' - то либо полнотекстовый поиск, если ищут, в основном, по словам, или сделать UPPER поля, и перевести его бинарный коллэйт (статически, разумеется, а не в запросе).
По полям с бинарным коллейтом like '%...%' происходит раза в три быстрее.


Сильно не практиковался. Уточните, пожалуйста, а " е " и " ё " будут идентичными в поиске при варианте " или сделать UPPER поля, и перевести его бинарный коллэйт (статически, разумеется, а не в запросе) " ?
...
Рейтинг: 0 / 0
02.08.2020, 22:57
    #39986003
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
SIMPLicity_, Нет, не будут. Чтобы е и ё были одинаковыми, сравнивать нужно в коллейшне cyrillic_general_ci_ai или cyrillic_general_cs_ai (Если нужно, чтобы прописные и строчные отличались).
Но тут никакого ускорения как раз и не будет.
...
Рейтинг: 0 / 0
03.08.2020, 10:00
    #39986056
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
uaggster
SIMPLicity_, Нет, не будут. Чтобы е и ё были одинаковыми, сравнивать нужно в коллейшне cyrillic_general_ci_ai или cyrillic_general_cs_ai (Если нужно, чтобы прописные и строчные отличались).
Но тут никакого ускорения как раз и не будет.


поясните плз выделенное
если это хранится в юникодных полях ?
...
Рейтинг: 0 / 0
03.08.2020, 12:02
    #39986094
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
Владислав Колосов
Второй вариант - использовать самописный механизм разбора строки на атомарные единицы.

Поддерживаю. Надо разбить на слова, прикрутить морфологический словарь, слова проиндексировать и всё запихать в таблицу вида id слова, форма слова, id товара. Поисковую фразу также преобразовать в id/форму слова и искать уже по этой таблице, а там поиск будет достаточно быстрый.
...
Рейтинг: 0 / 0
03.08.2020, 13:00
    #39986107
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
uaggster
SIMPLicity_, Нет, не будут. Чтобы е и ё были одинаковыми, сравнивать нужно в коллейшне cyrillic_general_ci_ai или cyrillic_general_cs_ai (Если нужно, чтобы прописные и строчные отличались).
Но тут никакого ускорения как раз и не будет.

Спасибо за уточнение. Так и думал. Хотя ни кто не мешает предварительно Ё менять на Е (мЁд и мЕд , конечно, это совершенно разные слова, но где-то такое совпадение может быть допустимым).
...
Рейтинг: 0 / 0
03.08.2020, 14:19
    #39986122
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
crutchmaster
Владислав Колосов
Второй вариант - использовать самописный механизм разбора строки на атомарные единицы.

Поддерживаю. Надо разбить на слова, прикрутить морфологический словарь, слова проиндексировать и всё запихать в таблицу вида id слова, форма слова, id товара. Поисковую фразу также преобразовать в id/форму слова и искать уже по этой таблице, а там поиск будет достаточно быстрый.
http://social.technet.microsoft.com/wiki/ru-ru/contents/articles/12921.full-text-ru-ru.aspx
...
Рейтинг: 0 / 0
03.08.2020, 21:19
    #39986249
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
iap
crutchmaster
пропущено...

Поддерживаю. Надо разбить на слова, прикрутить морфологический словарь, слова проиндексировать и всё запихать в таблицу вида id слова, форма слова, id товара. Поисковую фразу также преобразовать в id/форму слова и искать уже по этой таблице, а там поиск будет достаточно быстрый.
http://social.technet.microsoft.com/wiki/ru-ru/contents/articles/12921.full-text-ru-ru.aspx


Тогда уж сразу и это (STRING_SPLIT): https://docs.microsoft.com/ru-ru/sql/t-sql/functions/string-split-transact-sql?view=sql-server-ver15 ;)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000) / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]