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

Откуда:
Сообщений: 20
Доброго времени суток. есть некоторая проблема в производительности в клиентском поиске.
Ситуация такова: есть главная таблица, в ней есть ID и куча полей, которые мне потом понадобятся;
есть вторичная таблица (main_piece_detail), в ней есть тот же ID и строковое поле (usl_piece), аналогичное первой таблице, только в нем нет "небуквенных" символов (по этому полю производится поиск).
есть функция (скалярная) varchar(254) fn_rm_non_num_ch(@s varchar(254)), которая удаляет "небуквенные" символы из входной строки.
В основной и вторичной таблице порядка 100 тыс записей (на тестовом сервере)

Есть ряд функций (сравнивал производительность)
изначальный алгоритм был таков:
CREATE FUNCTION [dbo].[fn_search_usl]
(	
	@usl_full varchar(254)
)
RETURNS TABLE 
AS
RETURN 
(
  select id
  from main_piece_detail
  where usl_piece like '%' + dbo.fn_rm_non_num_ch(@usl_full) + '%'
)

эта функция работает порядка 16 секунд
ALTER FUNCTION [dbo].[FunctionName] 
(
	-- Add the parameters for the function here
	@usl_full varchar(254)
)
RETURNS 
@Res TABLE 
(
	id int
)
AS
BEGIN
	-- Fill the table variable with the rows for your result set
	declare @src varchar (254);
  set @src = '%' + dbo.fn_rm_non_num_ch(@usl_full) + '%';
  insert into @res
  select id
  from main_piece_detail
  where usl_piece like @src
	RETURN 
END
а эта функция при тех же входных параметрах выполняется 1 секунду

дальше я пошел на переделки исходного кода и сделал такое:

RETURN 
(
  select id
  from dbo.fn_search_usl_long('%' + dbo.fn_rm_non_num_ch(@usl_full) + '%')
)


FUNCTION [dbo].[fn_search_usl_long]
(	
	@usl_full varchar(254)
)
RETURNS TABLE 
AS
RETURN 
(
  select id
  from main_piece_detail
  where usl_piece like @usl_full
)
но эта комбинация выполняется так же 14-16 секунд

есть предположение, что удаление символов (fn_rm_non_num_ch) происходит для каждой строчки в селекте, а не считается заранее.
лайк с константными данными работает в пределах 1 секунды.
Как мне увеличить производительность? (если честно, то мне и одной секунды много)
1 ноя 11, 17:37    [11534799]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый поиск по таблице или как правильно передать параметры в функцию  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Baxster
но эта комбинация выполняется так же 14-16 секунд

есть предположение, что удаление символов (fn_rm_non_num_ch) происходит для каждой строчки в селекте, а не считается заранее.
А вы потрейсите, что гадать то...

Не должно в последнем случае вызываться fn_rm_non_num_ch для каждой строки.
1 ноя 11, 17:45    [11534867]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый поиск по таблице или как правильно передать параметры в функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
А что внутри dbo.fn_rm_non_num_ch?
1 ноя 11, 17:49    [11534895]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый поиск по таблице или как правильно передать параметры в функцию  [new]
Baxster
Member

Откуда:
Сообщений: 20
вот два плана выполнения. первый при использовании самой последней комбинации, второй при FuncName

К сообщению приложен файл. Размер - 41Kb
1 ноя 11, 17:57    [11534957]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый поиск по таблице или как правильно передать параметры в функцию  [new]
Baxster
Member

Откуда:
Сообщений: 20
вот второй план:

К сообщению приложен файл. Размер - 55Kb
1 ноя 11, 17:57    [11534960]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый поиск по таблице или как правильно передать параметры в функцию  [new]
Baxster
Member

Откуда:
Сообщений: 20
iap
А что внутри dbo.fn_rm_non_num_ch?


ALTER FUNCTION [dbo].[fn_rm_non_num_ch] 
(
	@s varchar(254)
)
RETURNS varchar(254)
AS
BEGIN
	-- Declare the return variable here
	DECLARE @Result varchar(254), @i int
	SET @Result = @s

	set @i = patindex('%[^a-zA-Z0-9А-Яа-я]%', @Result)
	while @i > 0
	begin
		set @Result = replace(@Result, substring(@Result, @i, 1), '')
		set @i = patindex('%[^a-zA-Z0-9А-Яа-я]%', @Result)
	end

	RETURN @Result
END

она выполняется очень быстро, так что на нее никаких нареканий не имею
она удаляет лишние символы
1 ноя 11, 17:59    [11534977]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый поиск по таблице или как правильно передать параметры в функцию  [new]
Baxster
Member

Откуда:
Сообщений: 20
кто-нибудь знает в чем проблема?
7 ноя 11, 09:18    [11556204]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить