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

Откуда: Саратов
Сообщений: 487
Доброго времени суток. Имеется пакет запросов вида:
+
set nocount on
go
set statistics io on
go
checkpoint 
dbcc dropcleanbuffers
go
declare @stTime datetime2,		
		@EnableQEReport int = 0,	
		@DiffCriteria float	= 100,		
		@IDObject nvarchar(100) = '4EE7FD09-F481-46B1-A8B6-30CFA247C449' 
		
set @stTime=sysdatetime()


declare @ObjBudgets table
(
	idGoodWork	uniqueidentifier
);


	declare @idConstruction uniqueidentifier
	set @idConstruction = convert(uniqueidentifier, @idObject)

	insert into @ObjBudgets
	select IDGoodWork
	from Contract_GoodWork_tbl CGW
	where	CGW.IDSDFolder = @idConstruction				
			and ((IDGoodWork not in (SELECT IDLink from krBudgetNote where IDCategory = 27))			 
				or (@EnableQEReport = 1)) 
	option(recompile)				 

print DATEDIFF(ms, @stTime,sysdatetime())   
set @stTime=sysdatetime()

declare @LB_ids TListOfGuid

if (select COUNT(*) from @ObjBudgets)>600
	
	INSERT @LB_ids
	SELECT	DISTINCT b.IDBudget
	FROM	@ObjBudgets ids
	inner hash JOIN	OBBudgets_tbl pos on ids.idGoodWork = pos.IDGoodWork
	inner hash join Budget_tbl b on b.ID = pos.IDOfBudget	
else 
	
	INSERT @LB_ids
	SELECT	DISTINCT b.IDBudget
	FROM	@ObjBudgets ids
	inner JOIN	OBBudgets_tbl pos on ids.idGoodWork = pos.IDGoodWork
	inner join Budget_tbl b on b.ID = pos.IDOfBudget		
	option(recompile)


print DATEDIFF(ms, @stTime,sysdatetime())   
set @stTime=sysdatetime()

-- изменяемая часть
    declare @COEFFS table (
        idB     bigint,
        K       decimal(28, 9)
    )

    insert into 
            @COEFFS (idB, K)
    select  
            coeff.IDLBudget, 
            exp(sum(log(coeff.K)))
    from  @LB_IDS ids
    
	inner hash join	Budget_tbl budgets on budgets.IDBudget = ids.ID
	
    inner hash join    krLBCoeff coeff    on coeff.IDLBudget = budgets.ID        
            
    where    
            budgets.IDStatus & 32 = 0
        and 
            coeff.K <> 0
    group by 
            coeff.IDLBudget	
-- конец изменяемой часть
            
	print DATEDIFF(ms, @stTime,sysdatetime())   
	set @stTime=sysdatetime()

    select
            ID,
            IDBudget,
            BudgetNum,
            ArhivNum,
            LC,            
            case when K is not null 
                 then Round(Round(resPZWithoutZM + sumOfOneOU + ZM * includeZMinPZ + NR + SP + OU_OZ + OU_ZM * includeZMinPZ + 
									OU_ZMD + OU_EMCH + OU_MR + OU_EQ - TotalDec, 0) * K, 0)
                 else            (resPZWithoutZM + sumOfOneOU + ZM * includeZMinPZ + NR + SP + OU_OZ + OU_ZM * includeZMinPZ + 
									OU_ZMD + OU_EMCH + OU_MR + OU_EQ - TotalDec)
            end,
            LC -            
            case when K is not null 
                 then Round(Round(resPZWithoutZM + sumOfOneOU + ZM * includeZMinPZ + NR + SP + OU_OZ + OU_ZM * includeZMinPZ + 
									OU_ZMD + OU_EMCH + OU_MR + OU_EQ - TotalDec, 0) * K, 0)
                 else            (resPZWithoutZM + sumOfOneOU + ZM * includeZMinPZ + NR + SP + OU_OZ + OU_ZM * includeZMinPZ + 
									OU_ZMD + OU_EMCH + OU_MR + OU_EQ - TotalDec)
            end
    from (
            select
                    budgets.BudgetNum                               as 'BudgetNum', 
                    budgets.ArhivNum                                as 'ArhivNum',
                    budgets.OTotal                                  as 'LC', 
                    budgets.TotalDec                                as 'TotalDec', 
                    resPZWithoutZM.total                            as 'resPZWithoutZM', 
                    ISNULL(sumOfOneOU.sumOU ,0)                     as 'sumOfOneOU', 
                    budgets.NRTotal                                 as 'NR', 
                    budgets.SPTotal                                 as 'SP',
                    budgets.ID                                      as 'ID', 
                    budgets.IDBudget                                as 'IDBudget',
                   (select
                            K 
                    from
                            @COEFFS coeff 
                    where
                            coeff.IDB = budgets.ID)                 as 'K', 
                    convert(bit, budgets.IDStatus & 0x400000000)    as 'includeZMinPZ',

                    ISNULL(budgets.ConstructOuOZ,       0) + 
                    ISNULL(budgets.InstallOuOZ,         0) + 
                    ISNULL(budgets.EquipmentOuOZ,       0) + 
                    ISNULL(budgets.OtherOuOZ,           0)          as 'OU_OZ', 

                    ISNULL(convert(decimal(28, 9), replace(budgets.XMLParams.value('/ROOT[1]/VALUES[1]/@CONSTRUCT_ZM[1]' ,
                    'nvarchar(max)'),',','.')),0) +
                    ISNULL(convert(decimal(28, 9), replace(budgets.XMLParams.value('/ROOT[1]/VALUES[1]/@CONSTRACT_ZM[1]' ,
                    'nvarchar(max)'),',','.')),0) +
                    ISNULL(convert(decimal(28, 9), replace(budgets.XMLParams.value('/ROOT[1]/VALUES[1]/@INSTALL_ZM[1]'   ,
                    'nvarchar(max)'),',','.')),0) +
                    ISNULL(convert(decimal(28, 9), replace(budgets.XMLParams.value('/ROOT[1]/VALUES[1]/@EQ_ZM[1]'        ,
                    'nvarchar(max)'),',','.')),0) +
                    ISNULL(convert(decimal(28, 9), replace(budgets.XMLParams.value('/ROOT[1]/VALUES[1]/@OTHER_ZM[1]'     ,
                    'nvarchar(max)'),',','.')),0) 
                                                                    as 'ZM',

                    ISNULL(budgets.ConstructOuZM,       0) + 
                    ISNULL(budgets.InstallOuZM,         0) +
                    ISNULL(budgets.EquipmentOuZM,       0) +
                    ISNULL(budgets.OtherOuZM,           0)          as 'OU_ZM',

					ISNULL(budgets.ConstructOuZMd,      0) +
					ISNULL(budgets.InstallOuZMd,        0) +
					ISNULL(budgets.EquipmentOuZMd,      0) +
					ISNULL(budgets.OtherOuZMd,          0)          as 'OU_ZMD',

                    ISNULL(budgets.ConstructOuEMch,     0) +
                    ISNULL(budgets.InstallOuEMch,       0) +
                    ISNULL(budgets.EquipmentOuEMch,     0) +
                    ISNULL(budgets.OtherOuEMch,         0)          as 'OU_EMCH',

                    ISNULL(budgets.ConstructOuMR,       0) +
                    ISNULL(budgets.InstallOuMR,         0) +
                    ISNULL(budgets.EquipmentOuMR,       0) +
                    ISNULL(budgets.OtherOuMR,           0)          as 'OU_MR',

                    ISNULL(budgets.ConstructOuEQ,       0) +
                    ISNULL(budgets.InstallOuEQ,         0) +
                    ISNULL(budgets.EquipmentOuEQ,       0) +
                    ISNULL(budgets.OtherOuEQ,           0)          as 'OU_EQ'                  
            from    
                    Budget_tbl budgets
            join    (

                        select 
                                b.IDBudget,  
                                sum(lrt.Price * lrt.VolumeRes) as total
                        from    
                                Budget_tbl b
                        join    
                                Local_Res_tbl lrt on b.IDBudget = lrt.IdBudget
                        join    
                                Resource_tbl  rt  on rt.ID = lrt.IdResource32
                        where    
 
                                lrt.IDStatus & (512+2+1) = 0                                      
                            and 
                                rt.idcategory <> '5F6A02DC-CB74-4976-BA87-5F62E357BDFD'          
                        group by  
                                b.IDBudget
                            
                    ) resPZWithoutZM on resPZWithoutZM.IDBudget = budgets.IDBudget
            
            left join   (
                        select 
                                b.IDbudget, 
                                sum(Amount * (
                                    ISNULL(convert(decimal(28, 9), replace(l.XMLParams.value('/ROOT[1]/VALUES[1]/@ONE_OU_OZ[1]' ,
                                    'nvarchar(max)'),',','.')),0)+
                                    ISNULL(convert(decimal(28, 9), replace(l.XMLParams.value('/ROOT[1]/VALUES[1]/@ONE_OU_MR[1]' ,
                                    'nvarchar(max)'),',','.')),0)+
                                    ISNULL(convert(decimal(28, 9), replace(l.XMLParams.value('/ROOT[1]/VALUES[1]/@ONE_OU_EQ[1]' ,
                                    'nvarchar(max)'),',','.')),0)+
                                    case when convert(bit, b.IDStatus & 0x400000000) = 1 then
                                        ISNULL(convert(decimal(28, 9), replace(l.XMLParams.value('/ROOT[1]/VALUES[1]/@ONE_OU_EMCH[1]' ,
                                        'nvarchar(max)'),',','.')),0)
                                    else
                                        ISNULL(convert(decimal(28, 9), replace(l.XMLParams.value('/ROOT[1]/VALUES[1]/@ONE_OU_EM[1]' ,
                                        'nvarchar(max)'),',','.')),0)
                                    end)
                                ) as sumOU
                        from   
                                Budget_tbl b
                        join   
                                Budget_Local_tbl l on b.IDBudget = l.IDBudget
                        where  
                                b.IDBudget in (select ID from @LB_IDS)
                            and 
                                exists(select ID from krLBWorkCoeffs as k where (k.IDStatus & 2097152)  = 0 and k.IDLBWork = l.ID)
                            and 
                                exists(select ID from krLBWorkCoeffs as k where (k.IDStatus & 2097152) != 0 and k.IDLBWork = l.ID)
                        group by 
                                b.IDBudget
                                
                    ) sumOfOneOU on sumOfOneOU.IDBudget = budgets.IDBudget
            where    
                    budgets.IDStatus & 32 = 0
                and 
                    budgets.IDStatus & 0x2000000000 = 0
                and 
                    (
                        @EnableQEReport = 1 
                    or 
                        (budgets.IDBudget not in (select IDLink from krBudgetNote where IDCategory = 27))             
                    ) 
                and 
                    budgets.IDBudget in (select ID from @LB_IDS)
                    
        ) as res
                
    where
            ABS(
                ABS(LC) - 
                ABS(case when K is not null 
                    then Round(Round(resPZWithoutZM + sumOfOneOU + ZM * includeZMinPZ + NR + SP + OU_OZ + OU_ZM * includeZMinPZ + OU_ZMD + 
						OU_EMCH + OU_MR + OU_EQ - TotalDec, 0) * K, 0)
                    else            (resPZWithoutZM + sumOfOneOU + ZM * includeZMinPZ + NR + SP + OU_OZ + OU_ZM * includeZMinPZ + OU_ZMD + 
						OU_EMCH + OU_MR + OU_EQ - TotalDec)
                end)               
            ) > @DiffCriteria 
	OPTION(RECOMPILE)
	
print DATEDIFF(ms, @stTime,sysdatetime())

Вот статистика его выполнения:

Внимание! Порядок данного соединения был выбран принудительно, поскольку использовалась подсказка локального соединения.
Внимание! Порядок данного соединения был выбран принудительно, поскольку использовалась подсказка локального соединения.
Таблица "#5E183583". Число просмотров 0, логических чтений 1164, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "krBudgetNote". Число просмотров 2, логических чтений 2006, физических чтений 39, упреждающих чтений 1999, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Contract_GoodWork_tbl". Число просмотров 1, логических чтений 11, физических чтений 3, упреждающих чтений 8, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
321
Таблица "#5E183583". Число просмотров 1, логических чтений 4, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "#5D24114A". Число просмотров 0, логических чтений 2232, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Budget_tbl". Число просмотров 1, логических чтений 659, физических чтений 4, упреждающих чтений 655, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "OBBudgets_tbl". Число просмотров 1, логических чтений 92369, физических чтений 1268, упреждающих чтений 92364, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "#5E183583". Число просмотров 1, логических чтений 4, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
9070
Таблица "#5F0C59BC". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "krLBCoeff". Число просмотров 1, логических чтений 269, физических чтений 7, упреждающих чтений 267, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Budget_tbl". Число просмотров 2, логических чтений 2095, физических чтений 10, упреждающих чтений 1432, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "#5D24114A". Число просмотров 1, логических чтений 7, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
529
Таблица "#5F0C59BC". Число просмотров 27, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "krLBWorkCoeffs". Число просмотров 176, логических чтений 444, физических чтений 2, упреждающих чтений 1, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Budget_Local_tbl". Число просмотров 27, логических чтений 1267, физических чтений 55, упреждающих чтений 147, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Budget_tbl". Число просмотров 0, логических чтений 6867, физических чтений 2491, упреждающих чтений 0, lob логических чтений 390, lob физических чтений 26, lob упреждающих чтений 0.
Таблица "Resource_tbl". Число просмотров 0, логических чтений 552, физических чтений 40, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Local_Res_tbl". Число просмотров 36, логических чтений 1600, физических чтений 77, упреждающих чтений 110, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "krBudgetNote". Число просмотров 76, логических чтений 288, физических чтений 38, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "#5D24114A". Число просмотров 1, логических чтений 7, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
23887

Если заменить в пакете изменяемую часть на
+
	declare @COEFFS table (
        idB     bigint,
        K       decimal(28, 9)
    )

    insert into 
            @COEFFS (idB, K)
    select  
            coeff.IDLBudget, 
            exp(sum(log(coeff.K)))
    from    
            krLBCoeff coeff
    join    
            Budget_tbl budgets on coeff.IDLBudget = budgets.ID
    where    
            budgets.IDStatus & 32 = 0
        and 
            budgets.IDBudget in (select ID from @LB_IDS)
        and 
            coeff.K <> 0
    group by 
            coeff.IDLBudget

(убрать подсказки), то сама она выполняется медленнее (4546мс вместо 529) , но скорость выполнения пакета уменьшается с 34с до 23с за счет увеличения производительности последней части с 23887мс до 8916мс, причем статистика по последней части запроса на 100% одинакова в обоих случаях. План выполнения тоже абсолютно идентичен для обоих вариантов за исключением изменяемой части (без указаний используются Nested loops)

Статистика по 2му варианту:

Таблица "#6989E82F". Число просмотров 0, логических чтений 1164, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "krBudgetNote". Число просмотров 2, логических чтений 2006, физических чтений 39, упреждающих чтений 1999, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Contract_GoodWork_tbl". Число просмотров 1, логических чтений 11, физических чтений 3, упреждающих чтений 8, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
341
Таблица "#6989E82F". Число просмотров 1, логических чтений 4, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "#6895C3F6". Число просмотров 0, логических чтений 2232, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Budget_tbl". Число просмотров 1, логических чтений 659, физических чтений 5, упреждающих чтений 655, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "OBBudgets_tbl". Число просмотров 1, логических чтений 92369, физических чтений 1280, упреждающих чтений 92364, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "#6989E82F". Число просмотров 1, логических чтений 4, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
8985
Таблица "#6A7E0C68". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "krLBCoeff". Число просмотров 614, логических чтений 1231, физических чтений 16, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Budget_tbl". Число просмотров 0, логических чтений 6678, физических чтений 2491, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "#6895C3F6". Число просмотров 1, логических чтений 7, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
4546
Таблица "#6A7E0C68". Число просмотров 27, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "krLBWorkCoeffs". Число просмотров 176, логических чтений 444, физических чтений 2, упреждающих чтений 1, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Budget_Local_tbl". Число просмотров 27, логических чтений 1267, физических чтений 55, упреждающих чтений 147, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Budget_tbl". Число просмотров 0, логических чтений 6867, физических чтений 0, упреждающих чтений 0, lob логических чтений 390, lob физических чтений 26, lob упреждающих чтений 0.
Таблица "Resource_tbl". Число просмотров 0, логических чтений 552, физических чтений 40, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Local_Res_tbl". Число просмотров 36, логических чтений 1600, физических чтений 77, упреждающих чтений 110, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "krBudgetNote". Число просмотров 76, логических чтений 288, физических чтений 38, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "#6895C3F6". Число просмотров 1, логических чтений 7, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
8916


С чем это может быть связано и можно ли оптимизировать пакет так, чтобы с первым вариантом изменяемой части последняя часть выполнялась так же быстро? Планы в приложении.
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 
	Jun 17 2011 00:54:03 
	Copyright (c) Microsoft Corporation
	Standard Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )


Сообщение было отредактировано: 26 апр 13, 15:23
26 апр 13, 13:47    [14235004]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
Я предполагаю, что втором случае часть данных в последней части пакета берется из кэша, но тогда где это отображается, и как заставить Executor делать это в первом случае?
26 апр 13, 15:15    [14235583]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Шамиль Фаридович
Я предполагаю, что втором случае часть данных в последней части пакета берется из кэша,но тогда где это отображается, и как заставить Executor делать это в первом случае?

Сервер всегда сначала берет данные из кэша. Если они там есть.
26 апр 13, 15:18    [14235613]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
И разница в статистике чтений у вас есть
Таблица "#5F0C59BC". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "krLBCoeff". Число просмотров 1, логических чтений 269, физических чтений 7, упреждающих чтений 267, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Budget_tbl". Число просмотров 2, логических чтений 2095, физических чтений 10, упреждающих чтений 1432, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "#5D24114A". Число просмотров 1, логических чтений 7, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
529

Таблица "#6A7E0C68". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "krLBCoeff". Число просмотров 614, логических чтений 1231, физических чтений 16, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Budget_tbl". Число просмотров 0, логических чтений 6678, физических чтений 2491, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "#6895C3F6". Число просмотров 1, логических чтений 7, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
4546
26 апр 13, 15:30    [14235701]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
Glory,
вы невнимательно прочитали мой пост.
...причем статистика по последней части запроса на 100% одинакова в обоих случаях. План выполнения тоже абсолютно идентичен для обоих вариантов за исключением изменяемой части...
26 апр 13, 15:35    [14235727]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Шамиль Фаридович
вы невнимательно прочитали мой пост.

Зачем его тогда захламлять ненужной информацией ?
26 апр 13, 15:36    [14235730]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Шамиль Фаридович
План выполнения тоже абсолютно идентичен для обоих вариантов за исключением изменяемой части...

Одинаковые планы с одинаковой статистикой работают одинаково
Если только не ждут заблокированных ресурсов.
26 апр 13, 15:37    [14235742]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
Ваша позиция звучит логично, но никак не объясняет фактов.
К серверу имею доступ только я. Полученные временные характеристики - не результат единичного запуска.
Это форум, я не требую от вас ответа на вопрос. Но не нужно бесполезной полемики.
26 апр 13, 15:52    [14235841]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2567
Шамиль Фаридович,

"планы в приложении"... Я один их не вижу?
26 апр 13, 15:57    [14235876]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Шамиль Фаридович
но никак не объясняет фактов.

Какие факты ?
Листинг кода и замеры DATEDIFF ?
26 апр 13, 15:58    [14235879]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а точно ли таблица @COEFFS имеет одинаковые размер в обоих случаях ?
26 апр 13, 16:02    [14235904]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Шамиль Фаридович
Но не нужно бесполезной полемики

Статистика говорит о том, что запрос
    declare @COEFFS table (
        idB     bigint,
        K       decimal(28, 9)
    )

    insert into 
            @COEFFS (idB, K)
    select  
            coeff.IDLBudget, 
            exp(sum(log(coeff.K)))
    from  @LB_IDS ids
    
	inner hash join	Budget_tbl budgets on budgets.IDBudget = ids.ID
	
    inner hash join    krLBCoeff coeff    on coeff.IDLBudget = budgets.ID        
            
    where    
            budgets.IDStatus & 32 = 0
        and 
            coeff.K <> 0
    group by 
            coeff.IDLBudget	

выполняется по-разному и скорее всего возращает разный результат
А он непосредственно влияет на последний запрос
Вот вам и факты
26 апр 13, 16:06    [14235930]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
PaulYoung,
странно, я сразу их вложил, прикреплю еще раз.
Glory,
в обоих случаях изменяемая часть вставляет 0 строк (и каким вообще образом изменяемая часть может возвращать разный результат? )

К сообщению приложен файл (Планы.rar - 34Kb) cкачать
26 апр 13, 16:24    [14236027]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2567
Шамиль Фаридович,

INSERT INTO @COEFFS имеет разные планы и второй явно в выигрыше
26 апр 13, 16:33    [14236082]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
PaulYoung,
спасибо кэп!
Впрочем и правда спасибо, за то что ты хотя бы удосужился посмотреть планы, пусть и пропустив половину моего первого поста)
Как раз вся фишка в том, что выигрышный второй план показывает хорошую производительность только на заменяемом участке, но гораздо худшую всего пакета.
26 апр 13, 16:40    [14236110]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Шамиль Фаридович
в обоих случаях изменяемая часть вставляет 0 строк (и каким вообще образом изменяемая часть может возвращать разный результат? )

тогда планы запросов всех остальных квери для пакета должны быть разные.... чудес не бывает.
Иили оценивается по разному или еще где-то...
26 апр 13, 16:43    [14236116]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
Сам уже запутался.
PaulYoung
Шамиль Фаридович,

INSERT INTO @COEFFS имеет разные планы и второй явно в выигрыше

В чем это он в выигрыше - как раз наоборот, без подсказок эта часть выполняется дольше в 9 раз.
26 апр 13, 16:43    [14236120]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
Maxx
тогда планы запросов всех остальных квери для пакета должны быть разные.... чудес не бывает.
Иили оценивается по разному или еще где-то...

Сам не особо верю, планы чуть выше.
26 апр 13, 16:45    [14236130]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2567
Шамиль Фаридович,

ну выигрыш в Index Seek против Index Scan
26 апр 13, 16:46    [14236134]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
PaulYoung,
Index Seek не всегда лучше Index Scan. Это как раз тот случай.
26 апр 13, 16:50    [14236148]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
так планыж разные ....количество строк разное в частях плана как минимум...
Чудес - не бывает
26 апр 13, 16:53    [14236158]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2567
Шамиль Фаридович,

без подсказок скорость выполнения пакета у Вас возрастает, с подсказками падает, что собственно и видно на Ваших планах. Выберите более быстрый вариант, что смущает-то?
26 апр 13, 16:55    [14236165]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
Maxx
так планыж разные ....количество строк разное в частях плана как минимум...
Чудес - не бывает

В какой части разное количество строк?
26 апр 13, 16:58    [14236175]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Шамиль Фаридович,

в последней части плана... пересмотрите внимательно по операциям ,там есть разница все таки... ну если я не ошибся в вашей простыне
26 апр 13, 17:01    [14236184]     Ответить | Цитировать Сообщить модератору
 Re: Потеря производительности запроса  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 487
PaulYoung
Шамиль Фаридович,

без подсказок скорость выполнения пакета у Вас возрастает, с подсказками падает, что собственно и видно на Ваших планах. Выберите более быстрый вариант, что смущает-то?

Без подсказок изменяемая часть выполняется медленнее (4546мс вместо 529).
Более того, если убрать последний (основной) запрос из пакета, то и пакет выполняется быстрее (примерно 10с против 14с)
26 апр 13, 17:03    [14236196]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить