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

Откуда:
Сообщений: 1984
Привет Всем! Есть запрос
declare
  @ResourceID DSIDENTIFIER,
  @FundID     DSIDENTIFIER

select
  @ResourceID = 10000016160,
  @FundID     = 2

select
  dt.DealTransactID,
  
  (case when r1.ResourceID = @ResourceID then r2.Brief else r1.Brief end) as Brief,
--  convert(char(25), r1.Brief) as BriefDeb,
--  convert(char(25), r2.Brief) as BriefCre,
  dt.DocDate,
  dt.DocNumber as Number,
  dt.Qty,
  
  (case when op.CharType =  1 and op.Confirmed = 1 then op.Qty else 0 end) as TurnDeb,
  (case when op.CharType = -1 and op.Confirmed = 1 then op.Qty else 0 end) as TurnCre,
  (case when op.CharType =  1 then op.Qty else 0 end) as PlannedTurnDeb,
  (case when op.CharType = -1 then op.Qty else 0 end) as PlannedTurnCre,
  
  dt.Comment,
  dt.OpCode,
  dt.Priority,
  dt.NumberExt,
  dt.Confirmed
from tDealTransact dt (NOLOCK)
inner join tResource r1 (NOLOCK) on r1.ResourceID     = dt.ResourceID
inner join tResource r2 (NOLOCK) on r2.ResourceID     = dt.ResourcePsvID
inner join tOperPart op (NOLOCK) on op.DealTransactID = dt.DealTransactID
  and op.ResourceID         = @ResourceID
  and op.AccountingType & 1 = 1
  and op.InstitutionID      = 2000
  and op.BalanceID          = 2140
where dt.InstitutionID      = 2000
  and dt.BalanceID          = 2140
  and dt.Date               = '2009-08-15'
--  and @ResourceID in (r1.ResourceID, r2.ResourceID) // Это аналог op.ResourceID = @ResourceID

order by dt.DocDate, dt.DocNumber

Из моего приложения (ADO+NativeClient) он выполняется порядка 8 секунд, из sql managerа - выполняется моментально. В чем может быть дело?
Статистика по индексам обновляется ежедневно.
15 авг 09, 10:58    [7542118]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Taffy
Member

Откуда:
Сообщений: 20498
set nocount on
?
15 авг 09, 11:12    [7542126]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
__Avenger__
Member

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

Вообще похоже, потестирую на неделе, если что еще уточню.....
15 авг 09, 11:16    [7542133]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
__Avenger__
Member

Откуда:
Сообщений: 1984
А если эта опция включена, то при наличии записей в adodataset, adodataset.recordcount будет возвращать 0?
15 авг 09, 11:32    [7542155]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
__Avenger__
Member

Откуда:
Сообщений: 1984
Прошли сутки, запрос опять тормозит.........
17 авг 09, 08:18    [7544496]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
__Avenger__
Member

Откуда:
Сообщений: 1984
Замечено, что запрос тормозит, только при первом обращении к нему, С ОПРЕДЕЛЕННЫМИ ПАРАМЕТРАМИ. Потом все ок. Почему?
17 авг 09, 08:20    [7544499]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
План строится, очевидно...
17 авг 09, 08:26    [7544517]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
iljy
Member

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

смотрите на план. Вполне возможно, что для этих параметров плохая статистика и сервер делает сканирование таблиц. Попробуйте опцию optimize for. И еще, применительно к ADO - поиграйтесь с типами курсора, они могут оказывать очень серьезное влияние на скорость выполнения, я столкнулся с ситуацией, когда просто открытие таблицы занимало несколько минут.
17 авг 09, 08:27    [7544520]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
__Avenger__
Member

Откуда:
Сообщений: 1984
Попробовал развернуть запрос по другому, посмотрю чего из этого выйдет:
select
  dt.DealTransactID,
  
  (case when r1.ResourceID = @ResourceID then r2.Brief else r1.Brief end) as Brief,
--  convert(char(25), r1.Brief) as BriefDeb,
--  convert(char(25), r2.Brief) as BriefCre,
  dt.DocDate,
  dt.DocNumber as Number,
  dt.Qty,
  
  (case when op.CharType =  1 and op.Confirmed = 1 then op.Qty else 0 end) as TurnDeb,
  (case when op.CharType = -1 and op.Confirmed = 1 then op.Qty else 0 end) as TurnCre,
  (case when op.CharType =  1 then op.Qty else 0 end) as PlannedTurnDeb,
  (case when op.CharType = -1 then op.Qty else 0 end) as PlannedTurnCre,
  
  dt.Comment,
  dt.OpCode,
  dt.Priority,
  dt.NumberExt,
  dt.Confirmed
from tOperPart op (NOLOCK)
inner join tDealTransact dt (NOLOCK) on dt.DealTransactID = op.DealTransactID
inner join tResource r1 (NOLOCK) on r1.ResourceID = dt.ResourceID
inner join tResource r2 (NOLOCK) on r2.ResourceID = dt.ResourcePsvID
where op.ResourceID         = @ResourceID
  and op.AccountingType & 1 = 1
  and op.InstitutionID      = 2000
  and op.BalanceID          = 2140
  and op.OperDate           = :Date
--  and @ResourceID in (r1.ResourceID, r2.ResourceID) // Это аналог op.ResourceID = @ResourceID

order by dt.DocDate, dt.DocNumber
--OPTION (FORCE ORDER)
17 авг 09, 08:41    [7544540]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
iljy
Member

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

может все-таки план сначала посмотрите? Вертеть запрос в слепую можно долго.
17 авг 09, 09:06    [7544572]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
iljy
__Avenger__,

может все-таки план сначала посмотрите? Вертеть запрос в слепую можно долго.
А еще лучше и публике дай посмотреть. Хоть одним глазком :)
17 авг 09, 09:21    [7544600]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
__Avenger__
Member

Откуда:
Сообщений: 1984
А как посмотреть план в стороннем приложении? Что надо добавить еще?

А то при таком раскладе я не вижу ни запроса, не плана выполнения?

К сообщению приложен файл. Размер - 0Kb
17 авг 09, 09:26    [7544617]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
__Avenger__,

Ну хоть сам-то запрос увидеть должен с Statement completed
17 авг 09, 09:28    [7544629]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
__Avenger__
Member

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

План по моему "развернутому" запросу (2-й запрос сверху)
Rows         Executes     StmtText                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      StmtId       NodeId       Parent       PhysicalOp     LogicalOp      Argument                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              DefinedValues                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                EstimateRows EstimateIO   EstimateCPU  AvgRowSize   TotalSubtreeCost OutputList                                                                                                                                                                                                                                                     Warnings     Type         Parallel     EstimateExecutions 
---- -------- -------- ------ ------ ------ ---------- --------- -------- ------------- ------------ ---------- ----------- ---------- ---------------- ---------- -------- ---- -------- ------------------
0 0 Compute Scalar(DEFINE:([Expr1012]=CASE WHEN [Avenger].[dbo].[tResource].[ResourceID] as [r1].[ResourceID]=[@ResourceID] THEN [Avenger].[dbo].[tResource].[Brief] as [r2].[Brief] ELSE [Avenger].[dbo].[tResource].[Brief] as [r1].[Brief] END)) 0 0 Compute Scalar Compute Scalar DEFINE:([Expr1012]=CASE WHEN [Avenger].[dbo].[tResource].[ResourceID] as [r1].[ResourceID]=[@ResourceID] THEN [Avenger].[dbo].[tResource].[Brief] as [r2].[Brief] ELSE [Avenger].[dbo].[tResource].[Brief] as [r1].[Brief] END) [Expr1012]=CASE WHEN [Avenger].[dbo].[tResource].[ResourceID] as [r1].[ResourceID]=[@ResourceID] THEN [Avenger].[dbo].[tResource].[Brief] as [r2].[Brief] ELSE [Avenger].[dbo].[tResource].[Brief] as [r1].[Brief] END 1 0 1E-007 310 0,0376572 [dt].[DealTransactID], [dt].[Qty], [dt].[Confirmed], [dt].[DocDate], [dt].[DocNumber], [dt].[Comment], [dt].[NumberExt], [dt].[OpCode], [dt].[Priority], [Expr1012], [Expr1013], [Expr1014], [Expr1015], [Expr1016] PLAN_ROW 0 1
0 1 |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1009])) 0 1 0 Nested Loops Inner Join OUTER REFERENCES:([Bmk1009]) 1 0 4,18E-006 354 0,0376571 [dt].[DealTransactID], [dt].[Qty], [dt].[Confirmed], [dt].[DocDate], [dt].[DocNumber], [dt].[Comment], [dt].[NumberExt], [dt].[OpCode], [dt].[Priority], [r1].[ResourceID], [r1].[Brief], [r2].[Brief], [Expr1013], [Expr1014], [Expr1015], [Expr1016] PLAN_ROW 0 1
0 1 |--Nested Loops(Inner Join, OUTER REFERENCES:([dt].[ResourcePsvID])) 0 2 1 Nested Loops Inner Join OUTER REFERENCES:([dt].[ResourcePsvID]) 1 0 4,18E-006 327 0,0343698 [dt].[DealTransactID], [dt].[Qty], [dt].[Confirmed], [dt].[DocDate], [dt].[DocNumber], [dt].[Comment], [dt].[NumberExt], [dt].[OpCode], [dt].[Priority], [r1].[ResourceID], [r1].[Brief], [Bmk1009], [Expr1013], [Expr1014], [Expr1015], [Expr1016] PLAN_ROW 0 1
0 1 | |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1006])) 0 3 2 Nested Loops Inner Join OUTER REFERENCES:([Bmk1006]) 1 0 4,18E-006 328 0,0310825 [dt].[DealTransactID], [dt].[Qty], [dt].[Confirmed], [dt].[DocDate], [dt].[DocNumber], [dt].[Comment], [dt].[ResourcePsvID], [dt].[NumberExt], [dt].[OpCode], [dt].[Priority], [r1].[ResourceID], [r1].[Brief], [Expr1013], [Expr1014], [Expr1015], [Expr1016] PLAN_ROW 0 1
0 1 | | |--Nested Loops(Inner Join, OUTER REFERENCES:([dt].[ResourceID])) 0 4 3 Nested Loops Inner Join OUTER REFERENCES:([dt].[ResourceID]) 1 0 4,18E-006 301 0,0277953 [dt].[DealTransactID], [dt].[Qty], [dt].[Confirmed], [dt].[DocDate], [dt].[DocNumber], [dt].[Comment], [dt].[ResourcePsvID], [dt].[NumberExt], [dt].[OpCode], [dt].[Priority], [Bmk1006], [r1].[ResourceID], [Expr1013], [Expr1014], [Expr1015], [Expr1016] PLAN_ROW 0 1
0 1 | | | |--Sort(ORDER BY:([dt].[DocDate] ASC, [dt].[DocNumber] ASC)) 0 5 4 Sort Sort ORDER BY:([dt].[DocDate] ASC, [dt].[DocNumber] ASC) 1 0,0112613 0,000100293 293 0,024508 [dt].[DealTransactID], [dt].[ResourceID], [dt].[Qty], [dt].[Confirmed], [dt].[DocDate], [dt].[DocNumber], [dt].[Comment], [dt].[ResourcePsvID], [dt].[NumberExt], [dt].[OpCode], [dt].[Priority], [Expr1013], [Expr1014], [Expr1015], [Expr1016] PLAN_ROW 0 1
0 1 | | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1003])) 0 6 5 Nested Loops Inner Join OUTER REFERENCES:([Bmk1003]) 1 0 4,18E-006 293 0,0131464 [dt].[DealTransactID], [dt].[ResourceID], [dt].[Qty], [dt].[Confirmed], [dt].[DocDate], [dt].[DocNumber], [dt].[Comment], [dt].[ResourcePsvID], [dt].[NumberExt], [dt].[OpCode], [dt].[Priority], [Expr1013], [Expr1014], [Expr1015], [Expr1016] PLAN_ROW 0 1
0 1 | | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([op].[DealTransactID]) OPTIMIZED) 0 7 6 Nested Loops Inner Join OUTER REFERENCES:([op].[DealTransactID]) OPTIMIZED 1 0 4,18E-006 76 0,00985914 [Bmk1003], [dt].[DealTransactID], [Expr1013], [Expr1014], [Expr1015], [Expr1016] PLAN_ROW 0 1
0 0 | | | | | |--Compute Scalar(DEFINE:([Expr1013]=CASE WHEN [Avenger].[dbo].[tOperPart].[CharType] as [op].[CharType]=(1) AND [Avenger].[dbo].[tOperPart].[Confirmed] as [op].[Confirmed]=(1) THEN [Avenger].[dbo].[tOperPart].[Qty] as [op].[Qty] ELSE (0.0000000000) END, [Expr1014]=CASE WHEN [Avenger].[dbo].[tOperPart].[CharType] as [op].[CharType]=(-1) AND [Avenger].[dbo].[tOperPart].[Confirmed] as [op].[Confirmed]=(1) THEN [Avenger].[dbo].[tOperPart].[Qty] as [op].[Qty] ELSE (0.0000000000) END, [Expr1015]=CASE WHEN [Avenger].[dbo].[tOperPart].[CharType] as [op].[CharType]=(1) THEN [Avenger].[dbo].[tOperPart].[Qty] as [op].[Qty] ELSE (0.0000000000) END, [Expr1016]=CASE WHEN [Avenger].[dbo].[tOperPart].[CharType] as [op].[CharType]=(-1) THEN [Avenger].[dbo].[tOperPart].[Qty] as [op].[Qty] ELSE (0.0000000000) END)) 0 9 7 Compute Scalar Compute Scalar DEFINE:([Expr1013]=CASE WHEN [Avenger].[dbo].[tOperPart].[CharType] as [op].[CharType]=(1) AND [Avenger].[dbo].[tOperPart].[Confirmed] as [op].[Confirmed]=(1) THEN [Avenger].[dbo].[tOperPart].[Qty] as [op].[Qty] ELSE (0.0000000000) END, [Expr1014]=CASE WHEN [Avenger].[dbo].[tOperPart].[CharType] as [op].[CharType]=(-1) AND [Avenger].[dbo].[tOperPart].[Confirmed] as [op].[Confirmed]=(1) THEN [Avenger].[dbo].[tOperPart].[Qty] as [op].[Qty] ELSE (0.0000000000) END, [Expr1015]=CASE WHEN [Avenger].[dbo].[tOperPart].[CharType] as [op].[CharType]=(1) THEN [Avenger].[dbo].[tOperPart].[Qty] as [op].[Qty] ELSE (0.0000000000) END, [Expr1016]=CASE WHEN [Avenger].[dbo].[tOperPart].[CharType] as [op].[CharType]=(-1) THEN [Avenger].[dbo].[tOperPart].[Qty] as [op].[Qty] ELSE (0.0000000000) END) [Expr1013]=CASE WHEN [Avenger].[dbo].[tOperPart].[CharType] as [op].[CharType]=(1) AND [Avenger].[dbo].[tOperPart].[Confirmed] as [op].[Confirmed]=(1) THEN [Avenger].[dbo].[tOperPart].[Qty] as [op].[Qty] ELSE (0.0000000000) END, [Expr1014]=CASE WHEN [Avenger].[dbo].[tOperPart].[CharType] as [op].[CharType]=(-1) AND [Avenger].[dbo].[tOperPart].[Confirmed] as [op].[Confirmed]=(1) THEN [Avenger].[dbo].[tOperPart].[Qty] as [op].[Qty] ELSE (0.0000000000) END, [Expr1015]=CASE WHEN [Avenger].[dbo].[tOperPart].[CharType] as [op].[CharType]=(1) THEN [Avenger].[dbo].[tOperPart].[Qty] as [op].[Qty] ELSE (0.0000000000) END, [Expr1016]=CASE WHEN [Avenger].[dbo].[tOperPart].[CharType] as [op].[CharType]=(-1) THEN [Avenger].[dbo].[tOperPart].[Qty] as [op].[Qty] ELSE (0.0000000000) END 1 0 1E-007 68 0,00657186 [op].[DealTransactID], [Expr1013], [Expr1014], [Expr1015], [Expr1016] PLAN_ROW 0 1
0 1 | | | | | | |--Filter(WHERE:(([Avenger].[dbo].[tOperPart].[AccountingType] as [op].[AccountingType]&(1))=(1) AND [Avenger].[dbo].[tOperPart].[InstitutionID] as [op].[InstitutionID]=(2000.) AND [Avenger].[dbo].[tOperPart].[BalanceID] as [op].[BalanceID]=(2140.))) 0 10 9 Filter Filter WHERE:(([Avenger].[dbo].[tOperPart].[AccountingType] as [op].[AccountingType]&(1))=(1) AND [Avenger].[dbo].[tOperPart].[InstitutionID] as [op].[InstitutionID]=(2000.) AND [Avenger].[dbo].[tOperPart].[BalanceID] as [op].[BalanceID]=(2140.)) 1 0 1,38E-006 32 0,00657176 [op].[CharType], [op].[Confirmed], [op].[Qty], [op].[DealTransactID] PLAN_ROW 0 1
0 1 | | | | | | |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1000])) 0 11 10 Nested Loops Inner Join OUTER REFERENCES:([Bmk1000]) 1 0 4,18E-006 54 0,00657038 [op].[CharType], [op].[Confirmed], [op].[Qty], [op].[BalanceID], [op].[DealTransactID], [op].[InstitutionID], [op].[AccountingType] PLAN_ROW 0 1
0 1 | | | | | | |--Index Seek(OBJECT:([Avenger].[dbo].[tOperPart].[XAK1tOperPart] AS [op]), SEEK:([op].[ResourceID]=[@ResourceID] AND [op].[OperDate]=[@P3]) ORDERED FORWARD) 0 12 11 Index Seek Index Seek OBJECT:([Avenger].[dbo].[tOperPart].[XAK1tOperPart] AS [op]), SEEK:([op].[ResourceID]=[@ResourceID] AND [op].[OperDate]=[@P3]) ORDERED FORWARD [Bmk1000], [op].[CharType], [op].[Confirmed] 1 0,003125 0,0001581 18 0,0032831 [Bmk1000], [op].[CharType], [op].[Confirmed] PLAN_ROW 0 1
0 0 | | | | | | |--RID Lookup(OBJECT:([Avenger].[dbo].[tOperPart] AS [op]), SEEK:([Bmk1000]=[Bmk1000]) LOOKUP ORDERED FORWARD) 0 14 11 RID Lookup RID Lookup OBJECT:([Avenger].[dbo].[tOperPart] AS [op]), SEEK:([Bmk1000]=[Bmk1000]) LOOKUP ORDERED FORWARD [op].[Qty], [op].[BalanceID], [op].[DealTransactID], [op].[InstitutionID], [op].[AccountingType] 1 0,003125 0,0001581 51 0,0032831 [op].[Qty], [op].[BalanceID], [op].[DealTransactID], [op].[InstitutionID], [op].[AccountingType] PLAN_ROW 0 1
0 0 | | | | | |--Index Seek(OBJECT:([Avenger].[dbo].[tDealTransact].[XPKtDealTransact] AS [dt]), SEEK:([dt].[DealTransactID]=[Avenger].[dbo].[tOperPart].[DealTransactID] as [op].[DealTransactID]) ORDERED FORWARD) 0 36 7 Index Seek Index Seek OBJECT:([Avenger].[dbo].[tDealTransact].[XPKtDealTransact] AS [dt]), SEEK:([dt].[DealTransactID]=[Avenger].[dbo].[tOperPart].[DealTransactID] as [op].[DealTransactID]) ORDERED FORWARD [Bmk1003], [dt].[DealTransactID] 1 0,003125 0,0001581 24 0,0032831 [Bmk1003], [dt].[DealTransactID] PLAN_ROW 0 1
0 0 | | | | |--RID Lookup(OBJECT:([Avenger].[dbo].[tDealTransact] AS [dt]), SEEK:([Bmk1003]=[Bmk1003]) LOOKUP ORDERED FORWARD) 0 38 6 RID Lookup RID Lookup OBJECT:([Avenger].[dbo].[tDealTransact] AS [dt]), SEEK:([Bmk1003]=[Bmk1003]) LOOKUP ORDERED FORWARD [dt].[ResourceID], [dt].[Qty], [dt].[Confirmed], [dt].[DocDate], [dt].[DocNumber], [dt].[Comment], [dt].[ResourcePsvID], [dt].[NumberExt], [dt].[OpCode], [dt].[Priority] 1 0,003125 0,0001581 232 0,0032831 [dt].[ResourceID], [dt].[Qty], [dt].[Confirmed], [dt].[DocDate], [dt].[DocNumber], [dt].[Comment], [dt].[ResourcePsvID], [dt].[NumberExt], [dt].[OpCode], [dt].[Priority] PLAN_ROW 0 1
0 0 | | | |--Index Seek(OBJECT:([Avenger].[dbo].[tResource].[XPKtResource] AS [r1]), SEEK:([r1].[ResourceID]=[Avenger].[dbo].[tDealTransact].[ResourceID] as [dt].[ResourceID]) ORDERED FORWARD) 0 60 4 Index Seek Index Seek OBJECT:([Avenger].[dbo].[tResource].[XPKtResource] AS [r1]), SEEK:([r1].[ResourceID]=[Avenger].[dbo].[tDealTransact].[ResourceID] as [dt].[ResourceID]) ORDERED FORWARD [Bmk1006], [r1].[ResourceID] 1 0,003125 0,0001581 24 0,0032831 [Bmk1006], [r1].[ResourceID] PLAN_ROW 0 1
0 0 | | |--RID Lookup(OBJECT:([Avenger].[dbo].[tResource] AS [r1]), SEEK:([Bmk1006]=[Bmk1006]) LOOKUP ORDERED FORWARD) 0 62 3 RID Lookup RID Lookup OBJECT:([Avenger].[dbo].[tResource] AS [r1]), SEEK:([Bmk1006]=[Bmk1006]) LOOKUP ORDERED FORWARD [r1].[Brief] 1 0,003125 0,0001581 42 0,0032831 [r1].[Brief] PLAN_ROW 0 1
0 0 | |--Index Seek(OBJECT:([Avenger].[dbo].[tResource].[XPKtResource] AS [r2]), SEEK:([r2].[ResourceID]=[Avenger].[dbo].[tDealTransact].[ResourcePsvID] as [dt].[ResourcePsvID]) ORDERED FORWARD) 0 66 2 Index Seek Index Seek OBJECT:([Avenger].[dbo].[tResource].[XPKtResource] AS [r2]), SEEK:([r2].[ResourceID]=[Avenger].[dbo].[tDealTransact].[ResourcePsvID] as [dt].[ResourcePsvID]) ORDERED FORWARD [Bmk1009] 1 0,003125 0,0001581 15 0,0032831 [Bmk1009] PLAN_ROW 0 1
0 0 |--RID Lookup(OBJECT:([Avenger].[dbo].[tResource] AS [r2]), SEEK:([Bmk1009]=[Bmk1009]) LOOKUP ORDERED FORWARD) 0 68 1 RID Lookup RID Lookup OBJECT:([Avenger].[dbo].[tResource] AS [r2]), SEEK:([Bmk1009]=[Bmk1009]) LOOKUP ORDERED FORWARD [r2].[Brief] 1 0,003125 0,0001581 42 0,0032831 [r2].[Brief] PLAN_ROW 0 1
17 авг 09, 09:39    [7544668]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
RID Lookup-ов многовато...
Натравите на запрос DTA - он подскажет вам как переделать индексы.
17 авг 09, 09:46    [7544691]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Kchr
Member [заблокирован]

Откуда: Северный полюс
Сообщений: 292
__Avenger__,

Наверно да, но всё же.
Поля r1.ResourceID, dt.ResourceID, r2.ResourceID, dt.ResourcePsvID, op.DealTransactID,dt.DealTransactID проиндексированы?
17 авг 09, 09:52    [7544711]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
__Avenger__
Member

Откуда:
Сообщений: 1984
Kchr
__Avenger__,

Наверно да, но всё же.
Поля r1.ResourceID, dt.ResourceID, r2.ResourceID, dt.ResourcePsvID, op.DealTransactID,dt.DealTransactID проиндексированы?


Да все проиндексировано.
17 авг 09, 10:18    [7544854]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
__Avenger__
Kchr
__Avenger__,

Наверно да, но всё же.
Поля r1.ResourceID, dt.ResourceID, r2.ResourceID, dt.ResourcePsvID, op.DealTransactID,dt.DealTransactID проиндексированы?


Да все проиндексировано.
Да плоховато у вас проиндексировано...
RID Lookup говорит о том, что сперва искались строки, удовлетворяющие условию, в индексе, а потом сервер полез за данными в таблицу.
Если теже столюцы включить в предложение INCLUDE индекса, серверу уже незачем будет лезть в таблицу - он данные возмет в самом индексе.
17 авг 09, 10:22    [7544875]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
iljy
Member

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

проиндексировано действительно не очень. Попробуйте еще сделать на DealTransact индекс по DocDate, DocNumber чтобы убрать сортировку. И добавьте в остальные индексы включаемые колонки, чтобы сервер не лазил по RID lookup. Посмотрите кстати - возможно есть смысл сделать их кластерными.
17 авг 09, 10:37    [7544970]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
__Avenger__
Member

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

Да это не у меня проиндексировано, это программный продукт с названием Диасофт. Система, в которой нет ни одного PK и FK, а только одни индексы.
17 авг 09, 10:42    [7545001]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Anddros
Member

Откуда:
Сообщений: 1077
tpg

Да плоховато у вас проиндексировано...
RID Lookup говорит о том, что сперва искались строки, удовлетворяющие условию, в индексе, а потом сервер полез за данными в таблицу.


Плевать!

В плане везде в EstimateExecutions оператора Nested Loop торчат единицы. Пяток RID Lookup должны отрабатывать моментально.

Тут дело в другом.

__Avenger__

Замечено, что запрос тормозит, только при первом обращении к нему, С ОПРЕДЕЛЕННЫМИ ПАРАМЕТРАМИ. Потом все ок. Почему?


Это явный признак того, что время тратится на постройку плана. Что в свою очередь довольно странно, ибо запрос сам по себе невелик и выборов решения у оптимизатора не может быть слишком много.

В принципе, можно еще усечь оптимизатору варианты выбора, навязав ему свою волю хинтами. Но это будет оправдано только в том случае, если при любых входных параметрах жестко зафиксированный план будет по крайней мере неплох.
17 авг 09, 11:15    [7545254]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
__Avenger__
Member

Откуда:
Сообщений: 1984
"Разворот" запроса помог, тормозов больше не наблюдаю.
18 авг 09, 11:39    [7550288]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить