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

Откуда:
Сообщений: 1066
declare @P_S int,
		@BARCODE varchar(50)
		
set @P_S = 2
set @BARCODE = '14433340'

	SELECT NAPR.NAPR_ID                                           
	FROM   NAPR LEFT JOIN   MARKS.DBO.PROBE_BARCODE PROBE_BARCODE ON PROBE_BARCODE.FPROBE_ID =  PROBE.MASTER_PROBE_ID                                                                            
	WHERE    
			case when @P_S = 1 then ISNULL(PROBE_BARCODE.BARCODE, 
			marks.dbo.FunctionBarCode(ORDERS.ORDER_ID,  
			PROBE.PROBE_ID, @P_S))
			else marks.dbo.FunctionBarCode(ORDERS.ORDER_ID,  
			PROBE.PROBE_ID, @P_S) end = @BARCODE


не понимаю почему тормоза (1-2 сек)
при этом если изменить условие на
marks.dbo.FunctionBarCode(ORDERS.ORDER_ID,  
				PROBE.PROBE_ID, 2)  = @BARCODE
		


или
 ISNULL(PROBE_BARCODE.BARCODE, 
			marks.dbo.FunctionBarCode(ORDERS.ORDER_ID,  
				PROBE.PROBE_ID, 1)) = @BARCODE

то все летает
12 янв 12, 14:53    [11892677]     Ответить | Цитировать Сообщить модератору
 Re: не понимаю причины тормозов выполнения запроса  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
marvel,

И скалярные функции и выражения, зубодробительная штука для оптимизатора получилась! Если работает по разному, то традиционный ответ - сравнивайте планы.
Но я бы вообще постарался переписать такое.
12 янв 12, 15:04    [11892814]     Ответить | Цитировать Сообщить модератору
 Re: не понимаю причины тормозов выполнения запроса  [new]
valetik
Member

Откуда:
Сообщений: 5
2 marvel

Если это "хранимка" и переменные есть не что иное как входные параметры, то попробуй переопределить входные значения в другие переменные и использовать уже их в запросе. Например так:

ALTER PROCEDURE spTest
           @P_S int,
           @BARCODE varchar(50)
AS
BEGIN

declare 
           @NEW_P_S int,
           @NEW_BARCODE varchar(50)

SELECT @NEW_P_S = @P_S, @NEW_BARCODE = @BARCODE
		
	SELECT NAPR.NAPR_ID                                           
	FROM   NAPR LEFT JOIN   MARKS.DBO.PROBE_BARCODE PROBE_BARCODE ON PROBE_BARCODE.FPROBE_ID =  PROBE.MASTER_PROBE_ID                                                                            
	WHERE    
			case when @NEW_P_S = 1 then ISNULL(PROBE_BARCODE.BARCODE, 
			marks.dbo.FunctionBarCode(ORDERS.ORDER_ID,  
			PROBE.PROBE_ID, @NEW_P_S))
			else marks.dbo.FunctionBarCode(ORDERS.ORDER_ID,  
			PROBE.PROBE_ID, @NEW_P_S) end = @NEW_BARCODE
END
13 янв 12, 16:59    [11901120]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить