Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите оптимизировать запрос  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
есть таблица с поисковыми запросами пользователей:
create table [dbo].[T_SearchQueries](
	[id] int identity(1,1) not null,
	[SourceID] int not null,
	[UserName] varchar(32) not null,
	[Query] varchar(128) not null,
	[Date] date not null,
	constraint [PK_T_SearchQueries] primary key clustered ([id]))
create nonclustered index [idx_UserName] on [dbo].[T_SearchQueries]([UserName])

есть словарь уникальных слов, куда попадают все слова из пользовательского запроса:
create table [dbo].[T_Dictionary](
	[id] int not null,
	[Word] varchar(64),
	constraint [PK_T_Dictionary] primary key clustered ([id])
)
create unique nonclustered index [idx_Word] on [dbo].[T_Dictionary]([Word])

есть таблица, где хранится информация о встречаемости слов из словаря в таблице поисковых запросов:
create table [dbo].[T_WordIdx](
	[word_id] int not null,
	[phrase_id] int not null
)
create nonclustered index [idx_Word] on [dbo].[T_WordIdx]([word_id],[phrase_id])


Когда я ищу по одному слову, отрабатывает моментально:
select [UserName], count(*)[Count] from [T_SearchQueries]
where [id] in (select [phrase_id] from [T_WordIdx] where [word_id] in (select [id] from [T_Dictionary] where [Word] like 'оборудовани%'))
group by [UserName]

а когда я ищу по нескольким словам, начинаются сильные тормоза:
select [UserName], count(*)[Count] from [T_SearchQueries]
where [id] in (select [phrase_id] from [T_WordIdx] where [word_id] in (select [id] from [T_Dictionary] where [Word] like 'оборудовани%'))
and [id] in (select [phrase_id] from [T_WordIdx] where [word_id] in (select [id] from [T_Dictionary] where [Word] like 'офисно%'))
and [id] in (select [phrase_id] from [T_WordIdx] where [word_id] in (select [id] from [T_Dictionary] where [Word] like 'купит%'))
group by [UserName]

помогите оптимизировать запрос плиз.
13 авг 15, 10:55    [18011807]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4846
=Сергей=,

Full Text Search

https://msdn.microsoft.com/en-us/library/ms142571.aspx
https://www.simple-talk.com/sql/learn-sql-server/understanding-full-text-indexing-in-sql-server/
13 авг 15, 11:00    [18011842]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Maxx_UA
Guest
Или вот такая реализация
Custom FTS
13 авг 15, 11:07    [18011882]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Друзья, я знаю о существовании FTS, но не могу изменить имеющуюся систему индексации и попросил помочь с оптимизацией запросов.
13 авг 15, 11:50    [18012139]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
komrad
Member

Откуда:
Сообщений: 5702
=Сергей=
Друзья, я знаю о существовании FTS, но не могу изменить имеющуюся систему индексации и попросил помочь с оптимизацией запросов.

так ?

select [UserName], count(*)[Count] from [T_SearchQueries]
where [id] in (select [phrase_id] from [T_WordIdx] where [word_id] in (select [id] from [T_Dictionary] where [Word] like 'оборудовани%' or [Word] like 'офисно%' or [Word] like 'купит%' ))
group by [UserName]
13 авг 15, 12:09    [18012269]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4846
=Сергей=
Друзья, я знаю о существовании FTS, но не могу изменить имеющуюся систему индексации и попросил помочь с оптимизацией запросов.


Тогда попробуйте начать с того, что обновить статистики для этих таблиц
13 авг 15, 12:09    [18012272]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
komrad
так ?

нет, ваш запрос вернёт все поисковые запросы, в которых были слова 'оборудовани%' ИЛИ 'офисно%' ИЛИ 'купит%',
а нужно чтоб 'оборудовани%' И 'офисно%' И 'купит%'
13 авг 15, 13:37    [18012916]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
=Сергей=
komrad
так ?

нет, ваш запрос вернёт все поисковые запросы, в которых были слова 'оборудовани%' ИЛИ 'офисно%' ИЛИ 'купит%',
а нужно чтоб 'оборудовани%' И 'офисно%' И 'купит%'
Так быть не может в принципе.
Фраза не может начинаться с 'оборудовани%', 'офисно%' и 'купит%' одновременно.
13 авг 15, 13:38    [18012930]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Konst_One
Member

Откуда:
Сообщений: 11615
iap
=Сергей=
пропущено...

нет, ваш запрос вернёт все поисковые запросы, в которых были слова 'оборудовани%' ИЛИ 'офисно%' ИЛИ 'купит%',
а нужно чтоб 'оборудовани%' И 'офисно%' И 'купит%'
Так быть не может в принципе.
Фраза не может начинаться с 'оборудовани%', 'офисно%' и 'купит%' одновременно.


у ТС слова так начинются, а по их сочетанию он ищет фразу
13 авг 15, 13:42    [18012945]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
=Сергей=,

можно распарсить каждую строку по заданному множеству разделителей
и оставить только результаты парсинга по условию существования всех
заданных шаблонами для LIKE слов.
13 авг 15, 13:43    [18012954]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Jaffar
Member

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

такая тема уже поднималась лет 5 назад.
решение было таким:

берем табличную переменную и вставляем в нее все возможные сочетания слов - для 3 слов - это будет 6 комбинаций
т.е.

напр:  А, B, C

ABC
ACB
BAC
BCA
.....

потом просто Join по like


declare @__TEMP table(Str_like varchar(255) primary key)


....

вот ссылочка на тему - там а 3 стр. я привожу пряма код как это сделать.
https://www.sql.ru/forum/726747-2/nechetkoe-sravnenie
13 авг 15, 14:46    [18013385]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
Jaffar
такая тема уже поднималась лет 5 назад
Такая тема поднималась десятки раз.
И для произвольного количества слов, а не только для 3.
Только надо поискать.
Ну, можно, например, задать перед поиском, что iap участвовал в теме что ли...
13 авг 15, 14:53    [18013446]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Jaffar
Member

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

точно участвовали в теме 5 лет назад.
14 авг 15, 06:21    [18016033]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить