|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
Собственно, сабж. Добавить вычисляемый столбец reverse([field]), построить по нему индекс и искать по нему [reverse_field] like reverse(@param) + '%' ? Или есть еще варианты? MSSQLSERVER2019. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2022, 20:32 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster, хранить в бинарном виде, например или использовать бинарный порядок сортировки для столбца. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2022, 21:13 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster Добавить вычисляемый столбец reverse([field]), построить по нему индекс и искать по нему [reverse_field] like reverse(@param) + '%' ? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2022, 21:47 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
Дорого :-(. В таблице более 200 млн. записей. Может, есть вариант сопоставить "хвосту" 1-2 байтовый хэш, и соответственно, искать внутри хэша? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2022, 22:11 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster, ну как, если искать исключительно по хвосту, то отцы-основатели говорят, что необходимо создать таблицу или таблицы с хранением хвостов разной длины, какая потребуется. Вычисляемый хранимый столбец - это уже варианты на тему. Но отдельные таблицы имеют преимущества, как мне кажется. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2022, 22:56 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster , а шаблон поиска всегда трёхсимвольный? Ибо если это так, или если существует некий лимит длины - необязательно реверсить всё поле. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2022, 23:54 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster Дорого :-(. В таблице более 200 млн. записей. Может, есть вариант сопоставить "хвосту" 1-2 байтовый хэш, и соответственно, искать внутри хэша? Тут уж вам решать, что правильней, пожертвовать апдэйтами и диском ради скорости чтения, или наоборот. Можно и покрывающий индекс делать, и держать индексы в несколько раз больше размера таблицы, зависит от условий. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 09:55 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster Дорого :-(. В таблице более 200 млн. записей. Может, есть вариант сопоставить "хвосту" 1-2 байтовый хэш, и соответственно, искать внутри хэша? Если вычисляемое поле PERSISTED, то вычисляемые значения сохраняются в таблице. Таким образом, время на вычисление тратится в момент заполнения таблицы, а не во время выполнения LIKE. Я так думаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 11:29 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
iap uaggster Дорого :-(. В таблице более 200 млн. записей. Может, есть вариант сопоставить "хвосту" 1-2 байтовый хэш, и соответственно, искать внутри хэша? Если вычисляемое поле PERSISTED, то вычисляемые значения сохраняются в таблице. Таким образом, время на вычисление тратится в момент заполнения таблицы, а не во время выполнения LIKE. Я так думаю. Поциент хочет сэкономить? 1. Реверсируем столбец навсегда (по-месту). 2. Строим индекс. 3. Щастье возможно. 4. Ну, а когда (и если) понадобится "прямая последовательность" - реверсируем при выборке. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 17:14 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
iap uaggster Дорого :-(. В таблице более 200 млн. записей. Может, есть вариант сопоставить "хвосту" 1-2 байтовый хэш, и соответственно, искать внутри хэша? Если вычисляемое поле PERSISTED, то вычисляемые значения сохраняются в таблице. Таким образом, время на вычисление тратится в момент заполнения таблицы, а не во время выполнения LIKE. Я так думаю. Дык если по нему построить индекс, он и станет PERSISTED. По крайней мере рассчитанные значения сохранятся в индексе. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 20:35 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster iap пропущено... Дорого вычислять REVERSE или я неправильно понял? Если вычисляемое поле PERSISTED, то вычисляемые значения сохраняются в таблице. Таким образом, время на вычисление тратится в момент заполнения таблицы, а не во время выполнения LIKE. Я так думаю. Дык если по нему построить индекс, он и станет PERSISTED. По крайней мере рассчитанные значения сохранятся в индексе. Поэтому проблемы с REVERSE не вижу. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 20:45 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
Akina uaggster , а шаблон поиска всегда трёхсимвольный? Ибо если это так, или если существует некий лимит длины - необязательно реверсить всё поле. Да нет, совсем наоборот! Шаблон поиска как раз произвольный. Поле varchar(1000), заполнено некими номерами, причем 3..9 хвостовых символов имеют содержательное значение (там всякие отделы/годы закодированы). Поле, в среднем, заполнено на 10%. В таблице 0,5 млрд. записей (когда я говорил про 200, точнее, про 180 млн., это, оказывается, только активные записи были. Там еще, оказывается, погашеные есть, их в 2 раза больше, они в соседней таблице, искать надо везде). Номера неуникальны, но слабоповторяемы, процент дублей по номеру примерно 15%., причем максимальное количество дублей около 100, т.е. в основном номеров или 1, или, иногда 2, или крайне редко - десяток. Максимум повторов, как я сказал, в районе 100 входов. Причем есть определенная уверенность, что такое поведение - сохранится. Цель - быстро искать по шаблону %3..9 символов длиной. Причем это только один из вариантов поиска, еще ищут по полному совпадению и по началу n-символов%, так что индекс по номеру - есть, некластерный. Иметь такой же, по отреверсированному полю - получается затратно, думаю, да и бессмысленно. Думаю, сопоставить последним 9 символам какой то двубайтовый хэш, и построить индекс по нему. Тем более, что число различных 9-ти символьных комбинаций с хвоста - всего то около 150 тысяч. Вопрос, как такой хэш построить? Думаю CRC16 должен хорошо подойти. Никто не знает, как поизящнее посчитать, а лучше одной строкой? Ну, или что-нибудь типа того... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 21:39 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster, Какая вам польза от хеша последних 9 симовлов, если поиск идет не строго по 9 последним символам? Что вы будете делать с этим хешом при поиске, скажем, "%123"? Ограничте reverse поле 3-4 символами для начального отсечения основных подходящих вариантов, а из них обычным (не индексированным) поиском отфильтруите нужные по полной строке. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 21:47 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
Ну и искать, соответственно как: Where KEY_CRC16 = CRC16(@key) and key like '%' + @key ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 21:51 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
msLex uaggster, Какая вам польза от хеша последних 9 симовлов, если поиск идет не строго по 9 последним символам? Что вы будете делать с этим хешом при поиске, скажем, "%123"? Ограничте reverse поле 3-4 символами для начального отсечения основных подходящих вариантов, а из них обычным (не индексированным) поиском отфильтруите нужные по полной строке. Черт, я знал, что где то дырка. :-) А по трем символам строить бессмысленно, там есть комбинации, которым соответствует миллионов 20 входов. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 21:55 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster Ну и искать, соответственно как: Where KEY_CRC16 = CRC16(@key) and key like '%' + @key Как вы будете сравнивать crc от 9 символов с crc от 3-х? Хеши могут использоваться только для точного поиска. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 21:55 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster msLex uaggster, Какая вам польза от хеша последних 9 симовлов, если поиск идет не строго по 9 последним символам? Что вы будете делать с этим хешом при поиске, скажем, "%123"? Ограничте reverse поле 3-4 символами для начального отсечения основных подходящих вариантов, а из них обычным (не индексированным) поиском отфильтруите нужные по полной строке. Черт, я знал, что где то дырка. :-) А по трем символам строить бессмысленно, там есть комбинации, которым соответствует миллионов 20 входов. Поэкспериментируйте с длиной reverse поля для нахождения компромисса между размером и селективностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 21:57 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
msLex uaggster Ну и искать, соответственно как: Where KEY_CRC16 = CRC16(@key) and key like '%' + @key Как вы будете сравнивать crc от 9 символов с crc от 3-х? Хеши могут использоваться только для точного поиска. Да понял уже :-( Скорее всего, действительно отрежу с хвоста 8 символов, отреверсирую и сохраню как char в бинарном коллейте. И "хрен с ним, пусть тоскует" Хотя, чисто теоретически, если подобрать такую функцию, которая монотонно росла бы от количества символов и от позиции - можно было бы по интервалу искать. Ну т.е. если бы хеш(1) <= хеш(1яяяяяяяяя) <хеш(2) <= хеш(2я) и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 22:24 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster Скорее всего, действительно отрежу с хвоста 8 символов, отреверсирую и сохраню как char в бинарном коллейте. И "хрен с ним, пусть тоскует" Я даже не знаю, зачем отрезать, разве только таблица из одного поля, тогда хоть какой то смысл имеет. С бинарным коллейтом я бы поосторожней, выгода от этого какая? Правильно, никакой. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 22:31 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster Хотя, чисто теоретически, если подобрать такую функцию, которая монотонно росла бы от количества символов и от позиции - можно было бы по интервалу искать. Ну т.е. если бы хеш(1) <= хеш(1яяяяяяяяя) <хеш(2) <= хеш(2я) и т.д. Экономия места? Ну, будет вместо строки в 8 байт хэш в 4 байта, оно даст какой то выигрыш? ПРоцентов на 5 в размере? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 22:34 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
alexeyvg, емнип в бинарном выгода в том, что не используются для сравнения преобразования, а сравнивается "как есть". Где-то были примеры, производительность в 3-5 раз возрастает. Но точно уже не помню. В любом случае выигрыш был заметным. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2022, 22:37 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
uaggster Поле varchar(1000), заполнено некими номерами, причем 3..9 хвостовых символов имеют содержательное значение (там всякие отделы/годы закодированы). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 07:37 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
alexeyvg С бинарным коллейтом я бы поосторожней, выгода от этого какая? Правильно, никакой. В бинарном коллейте быстрее идет сравнение. Т.е. грубо при поиске обычным сканом бинарный коллейт может (и дает) прирост поизводительности раза в два. В случае с поиску по индексу пользы, конечно, будет значительно меньше. Хотя, если в поле какие либо коды, бинарный коллейт не принося ощутимых недостатков может дать немного производительности. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 09:48 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
msLex alexeyvg С бинарным коллейтом я бы поосторожней, выгода от этого какая? Правильно, никакой. В бинарном коллейте быстрее идет сравнение. Т.е. грубо при поиске обычным сканом бинарный коллейт может (и дает) прирост поизводительности раза в два. В случае с поиску по индексу пользы, конечно, будет значительно меньше. Хотя, если в поле какие либо коды, бинарный коллейт не принося ощутимых недостатков может дать немного производительности. Мне кажется, общая экономия будет труднозамеряема. По индексу то же самое, ччто и для фуллскана, если говорить только про покрывающий индекс (с лукапами уж точно без разницы, бинарный коллейт или нет) Владислав Колосов Где-то были примеры, производительность в 3-5 раз возрастает. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 10:47 |
|
Как ускорить like '%123'?
|
|||
---|---|---|---|
#18+
alexeyvg Это всё очевидно, но неужели скорость выборки записей по like увеличится в 2 раза даже при скане? Все, конечно, зависит от многих условий (например, все данные не закешированны и лежат на медленных дисках) но в общем и целом ускорение в 2 раз и более это не миф например на совсем тепличных условиях (когда все время выполнения это тот самый лайк) у меня на рабочем компе вот такие результаты Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 11:09 |
|
|
start [/forum/topic.php?fid=46&msg=40126208&tid=1683936]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
214ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 327ms |
0 / 0 |