в нём посмотреть план исполнения на вскидку - все поля по которым происходит join должны быть приндексированы ну понятно что условием join а желательно должно быть равенство полей
Все JOINы проиндексированы 100%. Условие - равенство, естественно. Такие детские штучки мы уже исследоваи :-)
Вот запросик нехороший (писал не я, честно) SELECT вставлен внутри:
ALTER VIEW dvLastReleaseDateTransactionNumber AS Select sr.ShipmentID, r.TransactionNumber, Max(r.ReleaseAckDateTime) as 'DateTime', (Select Status From Release Where TransactionNumber = r.TransactionNumber And ReleaseAckDateTime = Max(r.ReleaseAckDateTime)) as 'Status' From dbo.Release r Inner Join ShipmentReference sr On Cast(r.TransactionNumber as varchar) = sr.ReferenceValue Group By ShipmentID, TransactionNumber
мда.. при таких аггрегатах непонятно почему на join ы грешите..
однако Cast(r.TransactionNumber as varchar) очевидно может погубить использование индексов на корню..
на и понятно что всё что max и group также должно быть проиндексировано
почему кстати Max два раза? в общем план выполнения нужно смотреть.. вот навскидку не понимаю что вложенный запрос берёт за Max(r.ReleaseAckDateTime)) нельзя на него как на 'DateTime' сослаться?
Вот и пытаюсь его раскорячить ... Пролетарий, который писал всё дело, давно уж не работает. CAST появился, потому как он в одной таблице одно и то же число держит как VARCHAR, а в другой - как INT. Короче, кривизна ужасная.
В общем, не сушите больше себе голову этой ерундой. Мне за это деньги таки платят, так что я буду дальше разгребать ... И вообще, есть у меня китаец под началом - только очень некреативнй.
да я собственно не сушу но Query analyzer и план выполнения он не для того чтобы оптимизатор включать он для того чтобы проверять что оптимизатор правильно всё оптимизировал, а если оптимизирует неправильно, то подсказать как хотелось бы оптимизировать..
типы по которым join нужно приводить к общему типу.. по любому..
запустить query analyzer
Date: 2009-01-08 02:39 pm (UTC)на вскидку - все поля по которым происходит join должны быть приндексированы
ну понятно что условием join а желательно должно быть равенство полей
кароче запрос - в студию!
Re: запустить query analyzer
Date: 2009-01-08 02:46 pm (UTC)Условие - равенство, естественно.
Такие детские штучки мы уже исследоваи :-)
Вот запросик нехороший (писал не я, честно) SELECT вставлен внутри:
ALTER VIEW dvLastReleaseDateTransactionNumber
AS
Select sr.ShipmentID,
r.TransactionNumber,
Max(r.ReleaseAckDateTime) as 'DateTime',
(Select Status From Release
Where TransactionNumber = r.TransactionNumber
And ReleaseAckDateTime = Max(r.ReleaseAckDateTime)) as 'Status'
From dbo.Release r Inner Join ShipmentReference sr
On Cast(r.TransactionNumber as varchar) = sr.ReferenceValue
Group By ShipmentID, TransactionNumber
Re: запустить query analyzer
Date: 2009-01-08 02:59 pm (UTC)однако Cast(r.TransactionNumber as varchar) очевидно может погубить использование индексов на корню..
на и понятно что всё что max и group также должно быть проиндексировано
почему кстати Max два раза?
в общем план выполнения нужно смотреть..
вот навскидку не понимаю что вложенный запрос берёт за Max(r.ReleaseAckDateTime))
нельзя на него как на 'DateTime' сослаться?
Re: запустить query analyzer
Date: 2009-01-08 03:04 pm (UTC)Пролетарий, который писал всё дело, давно уж не работает.
CAST появился, потому как он в одной таблице одно и то же число держит как VARCHAR, а в другой - как INT.
Короче, кривизна ужасная.
В общем, не сушите больше себе голову этой ерундой.
Мне за это деньги таки платят, так что я буду дальше разгребать ...
И вообще, есть у меня китаец под началом - только очень некреативнй.
Re: запустить query analyzer
Date: 2009-01-08 03:07 pm (UTC)но Query analyzer и план выполнения он не для того чтобы оптимизатор включать
он для того чтобы проверять что оптимизатор правильно всё оптимизировал, а если оптимизирует неправильно, то подсказать как хотелось бы оптимизировать..
типы по которым join нужно приводить к общему типу.. по любому..
типы по которым join
Date: 2009-01-08 03:12 pm (UTC)Re: запустить query analyzer
Date: 2009-01-08 02:59 pm (UTC)Один и тот же запрос - первый раз 40 секунд.
Второй и дальше - 8 секнуд.