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

Откуда:
Сообщений: 90
Здравствуйте
Имею MSSQL2008 + нарисовал один скрипт, начал его выполнять и получается что по времени долго выполняется он (10-ки минут...). Попытался найти кусок который тормозит и наткнулся вот на что...

//Декларация переменных
declare  @mydate as int 
declare @nrecorg as binary(8)
declare @nrecdog as binary(8)
declare @nrecattr as binary(8)
declare @nalog as  binary(8)
declare @atrrtipost as binary(8) 
declare @nreclevelp as binary(8)
declare @nreclevelo as binary(8)
declare @nrecatr    as binary(8)

//Присваиваем значения
set @mydate=131795201
.....

//собственно кусок кода запроса,оный глючит

select  s.f$cmc as mc, s.f$cmol, s.f$cparty, s.f$cpodr, max(s.f$dsaldo) as maxdate
 		from t$saldomc s inner join t$katparty party on s.f$cparty=party.f$nrec and party.f$CORGPAR=@nrecorg
                                                      inner join t$katpodr podry on s.f$cpodr=podry.f$nrec
                                                      inner join t$attrval atri on  podry.f$nrec=atri.f$crec and atri.f$wtable=1413 and atri.f$cattrnam=@nrecatr and (atri.f$vcomp=@nreclevelp or atri.f$vcomp=@nreclevelo)
		where	s.f$dsaldo<=@MyDate and s.F$SP=0
                        and (
                            @nrecdog=0 
                            or 
                             exists ( 
                                    select 1 
                                    from t$attrval atrv 
                                     where party.f$nrec = atrv.f$crec 
                                    and atrv.f$cattrnam = @nrecattr 
                                    and @nrecdog = atrv.f$vcomp
                                     )
                          )
		group  by s.f$cmc, s.f$cmol, s.f$cparty, s.f$cpodr

Собственно особенность в том, что когда кОмментим кусок and atri.f$wtable=1413 (меня пока так устраивает ,т.к. atri.f$cattrnam=@nrecatr + podry.f$nrec=atri.f$crec дает уникальный разрез ) - то все отрабатывает на порядки быстрее.
Еше, пожалуй , добавлю, что индекс есть к t$attrval(некластризованный) : f$wtable+f$crec+f$cattrnam+f$vcomp

Куда покопать следует ?

Сообщение было отредактировано: 29 ноя 11, 16:36
29 ноя 11, 16:29    [11678938]     Ответить | Цитировать Сообщить модератору
 Re: select(странность с индексом)  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
bormental,
option (recompile)
//Декларация переменных
declare  @mydate as int 
declare @nrecorg as binary(8)
declare @nrecdog as binary(8)
declare @nrecattr as binary(8)
declare @nalog as  binary(8)
declare @atrrtipost as binary(8) 
declare @nreclevelp as binary(8)
declare @nreclevelo as binary(8)
declare @nrecatr    as binary(8)

//Присваиваем значения
set @mydate=131795201
.....

//собственно кусок кода запроса,оный глючит

select  s.f$cmc as mc, s.f$cmol, s.f$cparty, s.f$cpodr, max(s.f$dsaldo) as maxdate
 		from t$saldomc s inner join t$katparty party on s.f$cparty=party.f$nrec and party.f$CORGPAR=@nrecorg
                                                      inner join t$katpodr podry on s.f$cpodr=podry.f$nrec
                                                      inner join t$attrval atri on  podry.f$nrec=atri.f$crec and atri.f$wtable=1413 and atri.f$cattrnam=@nrecatr and (atri.f$vcomp=@nreclevelp or atri.f$vcomp=@nreclevelo)
		where	s.f$dsaldo<=@MyDate and s.F$SP=0
                        and (
                            @nrecdog=0 
                            or 
                             exists ( 
                                    select 1 
                                    from t$attrval atrv 
                                     where party.f$nrec = atrv.f$crec 
                                    and atrv.f$cattrnam = @nrecattr 
                                    and @nrecdog = atrv.f$vcomp
                                     )
                          )
		group  by s.f$cmc, s.f$cmol, s.f$cparty, s.f$cpodr
option (recompile)
29 ноя 11, 16:38    [11679004]     Ответить | Цитировать Сообщить модератору
 Re: select(странность с индексом)  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
gds
bormental,
option (recompile)
//Декларация переменных
declare  @mydate as int 
declare @nrecorg as binary(8)
declare @nrecdog as binary(8)
declare @nrecattr as binary(8)
declare @nalog as  binary(8)
declare @atrrtipost as binary(8) 
declare @nreclevelp as binary(8)
declare @nreclevelo as binary(8)
declare @nrecatr    as binary(8)

//Присваиваем значения
set @mydate=131795201
.....

//собственно кусок кода запроса,оный глючит

select  s.f$cmc as mc, s.f$cmol, s.f$cparty, s.f$cpodr, max(s.f$dsaldo) as maxdate
 		from t$saldomc s inner join t$katparty party on s.f$cparty=party.f$nrec and party.f$CORGPAR=@nrecorg
                                                      inner join t$katpodr podry on s.f$cpodr=podry.f$nrec
                                                      inner join t$attrval atri on  podry.f$nrec=atri.f$crec and atri.f$wtable=1413 and atri.f$cattrnam=@nrecatr and (atri.f$vcomp=@nreclevelp or atri.f$vcomp=@nreclevelo)
		where	s.f$dsaldo<=@MyDate and s.F$SP=0
                        and (
                            @nrecdog=0 
                            or 
                             exists ( 
                                    select 1 
                                    from t$attrval atrv 
                                     where party.f$nrec = atrv.f$crec 
                                    and atrv.f$cattrnam = @nrecattr 
                                    and @nrecdog = atrv.f$vcomp
                                     )
                          )
		group  by s.f$cmc, s.f$cmol, s.f$cparty, s.f$cpodr
option (recompile)

или оберните все это добро в процедуру с параметрами.
29 ноя 11, 16:40    [11679021]     Ответить | Цитировать Сообщить модератору
 Re: select(странность с индексом)  [new]
SomewhereSomehow
Member

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

Судя по описанию у вас на таблице t$attrval, есть покрывающий для запроса
...podry.f$nrec=atri.f$crec and 
	atri.f$wtable=1413 and 
	atri.f$cattrnam=@nrecatr and 
	(atri.f$vcomp=@nreclevelp or atri.f$vcomp=@nreclevelo)
индекс по f$wtable+f$crec+f$cattrnam+f$vcomp. Который почему-то оказывается использовать не выгодно... Больше из приведенной информации я бы утверждать ничего не решился. Имхо, надо смотреть на реальные планы и выяснять почему так отличаются оценки.
29 ноя 11, 16:50    [11679079]     Ответить | Цитировать Сообщить модератору
 Re: select(странность с индексом)  [new]
Klick
Member

Откуда: Стерлитамак - Москва
Сообщений: 1023
Галактика :)
Если уж известен cattrnam то в таблицу attrval можно смело ходить без wtable. А значит вопрос чисто из любопытства. Без планов сложно сказать что-то. Может индекс начинающийся с wtable плох совсем?
А мне вот интересно что это вы получаете этим запросом? Дату последнего сальдо в нужном разрезе? Насколько помню эту задачу на этих таблицах хорошо решает over (partition by ). Мы так рисовали запросы.
30 ноя 11, 09:42    [11681398]     Ответить | Цитировать Сообщить модератору
 Re: select(странность с индексом)  [new]
bormental
Member

Откуда:
Сообщений: 90
Klick
Галактика :)
Если уж известен cattrnam то в таблицу attrval можно смело ходить без wtable. А значит вопрос чисто из любопытства. Без планов сложно сказать что-то. Может индекс начинающийся с wtable плох совсем?
А мне вот интересно что это вы получаете этим запросом? Дату последнего сальдо в нужном разрезе? Насколько помню эту задачу на этих таблицах хорошо решает over (partition by ). Мы так рисовали запросы.


Да, сальдовый остаток на разрез на определенную дату.
"Может индекс начинающийся с wtable плох совсем?" что значит "плох совсем" ?
saldomc объемная очень...в районе 10 млн записей..в attrval где то 2,5-3 млн.
Пока пришла на ум такая реализация.
Klick , буду признателен если поделитесь идеями по поводу over (partition by ). Не юзал это еще - начинающий...
4 дек 11, 15:38    [11702860]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить