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

Откуда:
Сообщений: 13
MSSQL 2005, 1 200 000 записей в таблице. Поиск по полю Title nvarchar(200) LIKE '%something%' выполняется до 25-30 секунд. Посоветуйте как улучшить или ткните в тему где это описано. Спасибо.

Собственно таблица:

CREATE TABLE [dbo].[Word_Word](
[WordID] [int] IDENTITY(1,1) NOT NULL,
[ScriptID] [int] NOT NULL,
[ScriptVersion] [int] NOT NULL,
[ScriptCode] [nvarchar](100) NOT NULL,
[Title] [nvarchar](200) NOT NULL,
[ScriptHash] [varbinary](32) NOT NULL,
CONSTRAINT [PK_Word_Word] PRIMARY KEY CLUSTERED
(
[WordID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

CREATE STATISTICS [_dta_stat_111339461_2_7] ON [dbo].[Word_Word]([ScriptID], [ScriptHash])

CREATE NONCLUSTERED INDEX [FK_Word_Title] ON [dbo].[Word_Word]
(
[Title] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
1 июл 11, 19:43    [10909035]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Тут
1 июл 11, 19:47    [10909057]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
Ewung
Guest
Средствами БД - индекс указан.
Какой процессор и сколько ОЗУ на сервере?
1 июл 11, 19:53    [10909090]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Ewung
Средствами БД - индекс указан.
Какой процессор и сколько ОЗУ на сервере?
А чем здесь поможет индекс?
1 июл 11, 20:12    [10909167]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
batic
Member

Откуда: Миллионер из трущоб
Сообщений: 4
drserg
Поиск по полю Title nvarchar(200) LIKE '%something%' выполняется до 25-30 секунд. Посоветуйте как улучшить или ткните в тему где это описано. Спасибо.


В вашем случае улучшить может только бита - берете в руки и идете к разработчикам менять архитектуру запросов - приводить их в соответствие к базовым нормам промышленных СУБД.
1 июл 11, 20:21    [10909212]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
batic
drserg
Поиск по полю Title nvarchar(200) LIKE '%something%' выполняется до 25-30 секунд. Посоветуйте как улучшить или ткните в тему где это описано. Спасибо.


В вашем случае улучшить может только бита - берете в руки и идете к разработчикам менять архитектуру запросов - приводить их в соответствие к базовым нормам промышленных СУБД.


и как "базовые нормы промышленных СУБД" помогут найти строки по подстроке?
1 июл 11, 20:24    [10909219]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
drserg
Member

Откуда:
Сообщений: 13
DeColo®es,

Спасибо большое. Полезный пост. Буду пробовать.

Правда беспокоит мысль: сколько будет записей если 1.2 миллиона строк разбить на слова. В среднем 4-5 слов в записи - получится до 6 миллионов записей. Даст ли это ускорение?

В любом случае очень благодарен за ссылку!

Ewung

Процессор и память не очень - Intel Core 2 Quad - Q9400, 2.67GHz, 4 Gb Ram. Возможно это тоже имеет значение - Windows 2003 DC Edition.
1 июл 11, 21:51    [10909547]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
drserg
Member

Откуда:
Сообщений: 13
Еще вдогонку - текст не только русский. Есть текст на 6-8 языках.
1 июл 11, 21:54    [10909564]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
batic
Member

Откуда: Миллионер из трущоб
Сообщений: 4
Winnipuh

и как "базовые нормы промышленных СУБД" помогут найти строки по подстроке?


Как минимум принудить (посредством биты, если необходимо) горе-авторов менять архитектуру для уместности запросов LIKE 'something% вместо LIKE '%something%
1 июл 11, 22:10    [10909638]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
drserg
Member

Откуда:
Сообщений: 13
Прошу прощения, но возник дополнительный вопрос. sp_spaceused возвращает размер таблицы 57312 Кб. Таблица меняется кране редко. Возможно лучше загрузить ее в память и там фильтровать?
1 июл 11, 23:14    [10909899]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
drserg
Прошу прощения, но возник дополнительный вопрос. sp_spaceused возвращает размер таблицы 57312 Кб. Таблица меняется кране редко. Возможно лучше загрузить ее в память и там фильтровать?
Она и так там вся окажется после первого же вашего like '%...'.
1 июл 11, 23:46    [10910041]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
drserg
Даст ли это ускорение?
Конечно, для ускорения способ и придуман.
По одному слову вообще будет искать моментально.
2 июл 11, 00:40    [10910251]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
alexeyvg
drserg
Даст ли это ускорение?
Конечно, для ускорения способ и придуман.
По одному слову вообще будет искать моментально.

таблица будет в памяти, но like '%... (то есть не с первой буквы) - будет по любому вызывать полный скан.
2 июл 11, 01:37    [10910410]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
...так же как и все where left(right(field, 8), 3)
... или WHERE UPPER(...) WHERE CONVERT(...), RTRIM(), cast, и т.д.
И прочее баловство со строками.
Оно всегда будет вызывать полный скан.

Реально ускорить на большом наборе - МОЖНО.
DeColo®es уже рассказал - КАК именно.
2 июл 11, 01:42    [10910425]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Makar4ik
alexeyvg
пропущено...
Конечно, для ускорения способ и придуман.
По одному слову вообще будет искать моментально.

таблица будет в памяти, но like '%... (то есть не с первой буквы) - будет по любому вызывать полный скан.
Ну вы прочитали ссылку то, которую DeColo®es дал???

Не будет там скана, чистый поиск по индексу.
2 июл 11, 10:29    [10910831]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
[quot alexeyvgНу вы прочитали ссылку то, которую DeColo®es дал???
Не будет там скана, чистый поиск по индексу.[/quot]ссылку по ЕГО алгоритму, или по тупому like'%*** ???
И то, и другое.
2 июл 11, 10:41    [10910849]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
alexeyvg,

я некорректно ответил на предыдущий вопрос.
Я имел в виду тупой like '%*****
2 июл 11, 10:44    [10910854]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
drserg
Member

Откуда:
Сообщений: 13
Makar4ik,

Да, спасибо. Ссылку прочитал, уже делаю. О результатах отпишусь.
2 июл 11, 15:38    [10911522]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
Gleb_L
Member

Откуда:
Сообщений: 1
если уж самостоятельно индексировать по словам содержимое полей - то имхо можно дальше не заморачиваться с хранением каждого слова с N-й по последнюю букву - т.к. LIKE '%pattern%' по словарю даже сканом пойдет быстро - из-за того, что средняя длина слов небольшая, и fail match будет находится очень быстро, а словарь разместится в памяти после первого запроса (и займет там мало места).
Однако, ни этот способ, ни тот, что дан в готдотнете не решает проблемы поиска типа ... LIKE '%резидент россии%' - то есть с пробелом внутри лайка.
4 июл 11, 10:39    [10916790]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Ну почему же... Поможет:

SELECT t.*
FROM FT_Search('РЕЗИДЕНТ РОССИИ') i
INNER JOIN MyTable t 
    on t.RecID = i.ID
    and t.Descr like '%РЕЗИДЕНТ РОССИИ%'
4 июл 11, 11:55    [10917395]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
drserg
Member

Откуда:
Сообщений: 13
DeColo®es,

Применение Вашего способа дало ускорение до 3-5 секунд вместо 25-30. Спасибо большое!
4 июл 11, 14:06    [10918374]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
drserg,

Всегда пожалуйста.
Но 3-5 секунд - это многовато.
Более одной секунды у меня никогда поиск не занимал, а в тесте бывало до 100М записей по полтора десятка слов.

Сейчас проверил на 7,6М записей (средняя длина 67 символов, в среднем 8 слов на строку).
Время - 0,016 секунды.
4 июл 11, 18:06    [10920247]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Единственное - у меня строки varchar, но это максимум в 2 раза утяжелит.
4 июл 11, 18:07    [10920256]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
drserg
Member

Откуда:
Сообщений: 13
DeColo®es,

Может на нашем сервере памяти маловато и процессор слабенький? В принципе такая скорость уже более-менее устраивает.

Еще раз спасибо!
5 июл 11, 12:33    [10923686]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить LIKE поиск по полю nvarchar  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
В моем случае потребовалось чтение (при условии изначально пустого буфера) примерно 8Мб с диска и столько же зарезервированной памяти - это в основном страницы индексов.
Ну а процессор тоже был загружен не более 15мсек - а настолько медленных процах, чтобы он был медленнее моего в тысячи раз сам SQL Server даже не встанет.
Так что вряд ли дело в ресурсах железки - скорее где-то индекс забыли построить.
Либо сервер в этом момент был ну очень занят чем-то еще.
5 июл 11, 13:41    [10924456]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить