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

Откуда: Оттуда...
Сообщений: 26937
SELECT * FROM Table_C
 AS C WHERE active > 1 
AND version =(SELECT MAX(version) as MaxVer FROM Table_C AS Z WHERE Z.seq = C.seq  AND Z.field1 = C.field1 AND Z.field2 = C.field2 ) 
AND field1 = '001' 
AND field2 = 'ab'


AND version =(SELECT MAX(version) as MaxVer FROM Table_C AS Z WHERE Z.seq = C.seq AND Z.field1 = C.field1 AND Z.field2 = C.field2 )

Есть много одинаковых записей но с разным номером версии.
Нужно выбрать с максимальным номером версии.
Можно это сделать без сабселекта?

SQL Server 2008

Спасибо.
27 апр 12, 12:39    [12479074]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
iap
Member

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

подзапрос тут совсем не при чём.
Скорее всего у Вас нет необходимых индексов.
SELECT TOP(1) WITH TIES *
FROM Table_C
WHERE active > 1 
  AND field1 = '001' 
  AND field2 = 'ab'
ORDER BY ROW_NUMBER()OVER(PARTITION BY seq,field1,field2 ORDER BY version DESC);
27 апр 12, 12:46    [12479133]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
План надо смотреть, распределение данных. Если чисто умозрительно, то с таким индексом должно быть лучше: ( field1, field2, seq, version desc ) include ( active ).
27 апр 12, 12:48    [12479152]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26937
iap
M234,

подзапрос тут совсем не при чём.
Скорее всего у Вас нет необходимых индексов.
SELECT TOP(1) WITH TIES *
FROM Table_C
WHERE active > 1 
  AND field1 = '001' 
  AND field2 = 'ab'
ORDER BY ROW_NUMBER()OVER(PARTITION BY seq,field1,field2 ORDER BY version DESC);


Да поставил я индексы уже на всё эти поля: active, version, field1, field2, seq
27 апр 12, 12:50    [12479163]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
M234
Да поставил я индексы уже на всё эти поля: active, version, field1, field2, seq
Для подзапроса индекс совершенно бесполезен. Как надо - выше.
27 апр 12, 12:51    [12479171]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
Glory
Member

Откуда:
Сообщений: 104751
M234
Да поставил я индексы уже на всё эти поля: active, version, field1, field2, seq

Что вот так индексы на все сочетания полей ? 5! индексов ?
27 апр 12, 12:51    [12479173]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
M234,

подзапрос тут совсем не при чём.
Скорее всего у Вас нет необходимых индексов.
SELECT TOP(1) WITH TIES *
FROM Table_C
WHERE active > 1 
  AND field1 = '001' 
  AND field2 = 'ab'
ORDER BY ROW_NUMBER()OVER(PARTITION BY seq,field1,field2 ORDER BY version DESC);
И, кстати, с подзапросом-то, наверно, лучше будет:
WITH CTE AS
(
 SELECT N=ROW_NUMBER()OVER(PARTITION BY seq,field1,field2 ORDER BY version DESC),*
 FROM Table_C
 WHERE active > 1 
   AND field1 = '001' 
   AND field2 = 'ab'
)
SELECT *
FROM CTE
WHERE N=1;
27 апр 12, 12:51    [12479176]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
M234
Да поставил я индексы уже на всё эти поля: active, version, field1, field2, seq

Что вот так индексы на все сочетания полей ? 5! индексов ?
Нет, больше!
Это только если все индексы по пяти полям, то 5!
27 апр 12, 13:01    [12479227]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
Glory
Member

Откуда:
Сообщений: 104751
iap
Это только если все индексы по пяти полям, то 5!

Ну так автор и написал "я индексы уже на всё эти поля: active, version, field1, field2, seq"
27 апр 12, 13:10    [12479324]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
Гавриленко Сергей Алексеевич
Если чисто умозрительно, то с таким индексом должно быть лучше: ( field1, field2, seq, version desc ) include ( active ).


А почему советуете active именно в include?
27 апр 12, 13:18    [12479404]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
andrew shalaev
А почему советуете active именно в include?
Под условие WHERE active > 1 чтобы лукап в кластерный не делать. Возможно, понадобится два индекса.
27 апр 12, 13:20    [12479426]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
M234
Member

Откуда: Оттуда...
Сообщений: 26937
Спасибо всем кто ответил.
Насколько я понял сейчас ВСЁ на сервере делается оооочень медленно.
Простейший запрос выполняется более 30 секунд, а должен за 0,0 секунды в норме.
Причины выясняем.
27 апр 12, 13:36    [12479563]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
UPDATE STATISTICS Table_C WITH FULLSCAN;
28 апр 12, 11:22    [12484176]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без subselect'а? Тормоза жуткие  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Отмечусь.
28 апр 12, 15:32    [12485961]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить