|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
Здравствуйте. Есть таблица около 10 млн записей, в ней есть поля, Дата, КодПокупателя, КодТовара,Сумма,Количество и т.п. Но есть одно поле, в котором храниться описание товаров, оно длиной 3000. Можно как-то оптимизировать поиск по этому полю? p.s. Что уже сделано. 1 - для таблицы сделал ColumnStore индекс 2 - разместил базу в памяти с хеш индексом по колонке поиска. Что получилось: Выборка по таблице ColumnStore - запрос 9 минут 45 секунд Выборка по таблице InMemοry - 9 минут 10 секунд. Это очень много, подскажите, какие еще могут быть варианты решения данного вопроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 09:12 |
|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
Полнотекстовый поиск ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 09:53 |
|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
Pvase Это очень много, подскажите, какие еще могут быть варианты решения данного вопроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 21:36 |
|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
Если поиск по like '%...%' то только дополнительными действиями (словарь, индексы вхождения,- не полноценный текстовый поиск, но некий аналог). Относительно быстро работает like '...%' , если нужен поиск like '%...' то, похоже, имеет смысл сделать поле с реверсом и опять поиск по like '...%' по ревеснутому полю . IMBO, есличо... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 00:54 |
|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
SIMPLicity_ Если поиск по like '%...%' то только дополнительными действиями (словарь, индексы вхождения,- не полноценный текстовый поиск, но некий аналог). Относительно быстро работает like '...%' , если нужен поиск like '%...' то, похоже, имеет смысл сделать поле с реверсом и опять поиск по like '...%' по ревеснутому полю . IMBO, есличо... Если нужен поиск по like '%...%' - то либо полнотекстовый поиск, если ищут, в основном, по словам, или сделать UPPER поля, и перевести его бинарный коллэйт (статически, разумеется, а не в запросе). По полям с бинарным коллейтом like '%...%' происходит раза в три быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 09:37 |
|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
Pvase, если есть неатомарные поля, то такие поля преобразуют в атомарные, после чего выполняют поиск по таблице с атомарными значениями. Один из вариантов - механизм полнотекстного поиска, но он будет искать не произвольную строку, а по словам, которые начинаются с заданных символов с прочими модификаторами поиска. Второй вариант - использовать самописный механизм разбора строки на атомарные единицы. При этом каждый элемент словаря связан со своей строкой. Например, буква А связана со строками 10,34,15, Б со строками 12,14,15 и так далее. Такое решение где-то упоминалось на форуме. Кроме того, убедитесь, что у вас выполняется параллельный план запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 12:50 |
|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
uaggster SIMPLicity_ Если поиск по like '%...%' то только дополнительными действиями (словарь, индексы вхождения,- не полноценный текстовый поиск, но некий аналог). Относительно быстро работает like '...%' , если нужен поиск like '%...' то, похоже, имеет смысл сделать поле с реверсом и опять поиск по like '...%' по ревеснутому полю . IMBO, есличо... Если нужен поиск по like '%...%' - то либо полнотекстовый поиск, если ищут, в основном, по словам, или сделать UPPER поля, и перевести его бинарный коллэйт (статически, разумеется, а не в запросе). По полям с бинарным коллейтом like '%...%' происходит раза в три быстрее. Сильно не практиковался. Уточните, пожалуйста, а " е " и " ё " будут идентичными в поиске при варианте " или сделать UPPER поля, и перевести его бинарный коллэйт (статически, разумеется, а не в запросе) " ? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2020, 20:08 |
|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
SIMPLicity_, Нет, не будут. Чтобы е и ё были одинаковыми, сравнивать нужно в коллейшне cyrillic_general_ci_ai или cyrillic_general_cs_ai (Если нужно, чтобы прописные и строчные отличались). Но тут никакого ускорения как раз и не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2020, 22:57 |
|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
uaggster SIMPLicity_, Нет, не будут. Чтобы е и ё были одинаковыми, сравнивать нужно в коллейшне cyrillic_general_ci_ai или cyrillic_general_cs_ai (Если нужно, чтобы прописные и строчные отличались). Но тут никакого ускорения как раз и не будет. поясните плз выделенное если это хранится в юникодных полях ? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2020, 10:00 |
|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
Владислав Колосов Второй вариант - использовать самописный механизм разбора строки на атомарные единицы. Поддерживаю. Надо разбить на слова, прикрутить морфологический словарь, слова проиндексировать и всё запихать в таблицу вида id слова, форма слова, id товара. Поисковую фразу также преобразовать в id/форму слова и искать уже по этой таблице, а там поиск будет достаточно быстрый. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2020, 12:02 |
|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
uaggster SIMPLicity_, Нет, не будут. Чтобы е и ё были одинаковыми, сравнивать нужно в коллейшне cyrillic_general_ci_ai или cyrillic_general_cs_ai (Если нужно, чтобы прописные и строчные отличались). Но тут никакого ускорения как раз и не будет. Спасибо за уточнение. Так и думал. Хотя ни кто не мешает предварительно Ё менять на Е (мЁд и мЕд , конечно, это совершенно разные слова, но где-то такое совпадение может быть допустимым). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2020, 13:00 |
|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
crutchmaster Владислав Колосов Второй вариант - использовать самописный механизм разбора строки на атомарные единицы. Поддерживаю. Надо разбить на слова, прикрутить морфологический словарь, слова проиндексировать и всё запихать в таблицу вида id слова, форма слова, id товара. Поисковую фразу также преобразовать в id/форму слова и искать уже по этой таблице, а там поиск будет достаточно быстрый. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2020, 14:19 |
|
MS SQL 2019 поиск в таблице по строковой колонке длиной varchar(3000)
|
|||
---|---|---|---|
#18+
iap crutchmaster пропущено... Поддерживаю. Надо разбить на слова, прикрутить морфологический словарь, слова проиндексировать и всё запихать в таблицу вида id слова, форма слова, id товара. Поисковую фразу также преобразовать в id/форму слова и искать уже по этой таблице, а там поиск будет достаточно быстрый. Тогда уж сразу и это (STRING_SPLIT): https://docs.microsoft.com/ru-ru/sql/t-sql/functions/string-split-transact-sql?view=sql-server-ver15 ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2020, 21:19 |
|
|
start [/forum/topic.php?fid=46&msg=39984251&tid=1685819]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 161ms |
0 / 0 |