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

Откуда:
Сообщений: 190
Здравствуйте.
У меня есть процедура которая отбирает некоторый набор строк. Для каждой отобранной строки вызывается функция которая сравнивает две строки некоторой таблицы. Вот код сравнения двух строчек таблицы:

with clients as ( select *
	          from MedPreAuthNumbers
	          where @fromDate between [Med Pre Auth Beg Date] and [Med Pre Auth End Date]
	                     and
	                     @toDate between [Med Pre Auth Beg Date] and [Med Pre Auth End Date]
	                     and
	                     @toDate >= @fromDate
	                     and
	                     [CLIENT#] in (@client1_id,@client2_id)
	                     and
	                     (@statusCheck is NULL or @statusCheck = 0 or [Status] IN ('A','IP'))
	                         ),
       client1 as ( select *
	          from clients
	          where [CLIENT#]  = @client1_id 
	                        ),
      client2 as ( select *
	         from clients
	         where [CLIENT#]  = @client2_id 
	                        )	                     	                        	                        
select @result = count(*) 
from client1 c1 
inner join client2 c2 on    c1.PayerId = c2.PayerId 
                            and
		            c1.[G1am] = c2.[G1am]
	                    and
	                    c1.[G2am] = c2.[G2am]
	                    and
	                    c1.[G3am] = c2.[G3am]
	                    and
	                    c1.[G4am] = c2.[G4am]
	                    and
	                    c1.[G5am] = c2.[G5am]
	                    and
	                    c1.[G6am] = c2.[G6am]
	                    and
	                     c1.[G7am] = c2.[G7am]
	                    and
	                    c1.[G1pm] = c2.[G1pm]
	                     and
	                     c1.[G2pm] = c2.[G2pm]
	                     and
	                     c1.[G3pm] = c2.[G3pm]
	                     and
	                     c1.[G4pm] = c2.[G4pm]
	                     and
	                     c1.[G5pm] = c2.[G5pm]
	                     and
	                     c1.[G6pm] = c2.[G6pm]
	                     and
	                     c1.[G7pm] = c2.[G7pm]
	                     and
	                     c1.[Group Weekday Proc Code] = c2.[Group Weekday Proc Code]
	                     and
	                     c1.[Group WeekEnd Proc Code] = c2.[Group WeekEnd Proc Code]


Сам запрос ( ... select * from MedPreAuthNumbers ...) выполняется быстро (в сумме процедура только с этим запросом - 36 сек.).
Но если добавляется сравнение по колонкам (.... c2 on c1.PayerId = c2.PayerId and c1.[G1am] = c2.[G1am] ....) - то выполнение занимает больше 2 минут. Разницы при использовании where или join нет. Отсюда и вопросы:

1. Почему сравнение занимает так много времени ? Как можно ускорить запрос ? План запроса показывает что везде используются индексы для поиска.
2. Может строки можно сравнить как то иначе ?

На данный момент использую сравнение в цикле.
declare clientsCursor1 cursor local for
	select * from @clients
	where client_id = @client1_id
	 ......   
while @@fetch_status = 0
begin 
		
	declare clientsCursor2 cursor local for
	select * from @clients
	where client_id = @client2_id	
	....	    
	while @@fetch_status = 0
	begin
			
	        if( @G1am_1 = @G1am_2
	            and
	            @G2am_1 = @G2am_2
	            and
	            ....) 
		begin
			set @result = 1
			break
		end
			
		....		
               end    
		    
     .....	
end	

Вариант с курсорами оказался самым быстрым. Но такое решение не очень нравится и всё рано занимает более минуты.
Заранее благодарю за ответы.
9 апр 12, 13:19    [12387204]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение строк. Тормозит запрос.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
S_A_V_e
2. Может строки можно сравнить как то иначе ?
Через hashbytes считаете какой-нибудь md5 от вашей строки, пихаете в поле. Далее, если хеш не свопадает, то и строки разные.
9 апр 12, 13:28    [12387269]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение строк. Тормозит запрос.  [new]
S_A_V_e
Member

Откуда:
Сообщений: 190
Как вариант - можно применить хеш... Но тогда надо добавить поле в таблицу и как минимум повесить тригер для пересчёта хеша при update записи. Менять таблицы БД не хотелось бы.
9 апр 12, 15:27    [12388286]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение строк. Тормозит запрос.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
S_A_V_e
Как вариант - можно применить хеш... Но тогда надо добавить поле в таблицу и как минимум повесить тригер для пересчёта хеша при update записи.
Можно вычисляемым полем, хотя с ним есть тоже свои ньюансы.
S_A_V_e
Менять таблицы БД не хотелось бы.
"Шашечки или ехать" решать уже вам.
9 апр 12, 15:30    [12388312]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение строк. Тормозит запрос.  [new]
aleks2
Guest
Узко мыслите, аднако
with clients as ( select *
	          from MedPreAuthNumbers
	          where @fromDate between [Med Pre Auth Beg Date] and [Med Pre Auth End Date]
	                     and
	                     --@toDate between [Med Pre Auth Beg Date] and [Med Pre Auth End Date]
	                     @toDate <= [Med Pre Auth End Date]
	                     and
	                     @toDate >= @fromDate
	                     and
	                     [CLIENT#] in (@client1_id, @client2_id)
	                     and
	                     --(@statusCheck is NULL or @statusCheck = 0 or [Status] IN ('A','IP'))
	                     (ISNULL(@statusCheck,0) = 0 or [Status] IN ('A','IP'))
	                         )
-- надо быть больным чтобы делать JOIN, да и вопще - фигня какая-то
-- 
select @result = SUM(CNT1*CNT2)
FROM
(select SUM(CASE [CLIENT#] WHEN @client1_id 1 ELSE 0 END) CNT1,
		SUM(CASE [CLIENT#] WHEN @client2_id 1 ELSE 0 END) CNT2
FROM clients 
GROUP BY PayerId, [G1am], [G2am], ... [G7pm], [Group Weekday Proc Code], [Group WeekEnd Proc Code]
) X
9 апр 12, 15:49    [12388471]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение строк. Тормозит запрос.  [new]
S_A_V_e
Member

Откуда:
Сообщений: 190
Спасибо aleks2 !
Решение отлично работает.
9 апр 12, 17:56    [12389531]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить