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

Откуда: Odessa
Сообщений: 92
Добрій день ,Есть запрос которій обрабатівает на другом сервере таблицу с более 8 млн записей
Как можно оптимизировать запрос ниже

SELECT  RIGHT(LEFT(CASE
                                                      WHEN ISDATE(CDTUL) = 1 THEN CDTUL
                                                      ELSE 20000101
                                                 END, 6), 2) AS [Month]
                                     ,LEFT(CASE
                                                WHEN ISDATE(CDTUL) = 1 THEN CDTUL
                                                ELSE 20000101
                                           END, 4) AS [Year]
                                     ,SUM([Count]) AS [Count]
                                     ,SUM(Total) AS [Total]
                              FROM    ( SELECT  CDTUL
                                               ,CCONO
                                               ,CCSTY
                                               ,CRCTY
                                               ,COUNT(CAMBD) AS [Count]
                                               ,SUM(CAMBD + CAMCG) AS [Total]
                                        FROM    MCD400.MCD400.CMSFIL.JCPMST
                                        GROUP BY CDTUL
                                                                                       ,CCONO
                                                                                       ,CCSTY
                                                                                       ,CRCTY ) AS A
                              WHERE   NOT ( CCONO IN ( 1, 2 )
                                            AND CCSTY = 'I'
                                            AND CRCTY = 2 )
                              GROUP BY RIGHT(LEFT(CASE
                                                       WHEN ISDATE(CDTUL) = 1 THEN CDTUL
                                                       ELSE 20000101
                                                  END, 6), 2)
                                                                   ,LEFT(CASE
                                                                              WHEN ISDATE(CDTUL) = 1 THEN CDTUL
                                                                              ELSE 20000101
                                                                         END, 4)


Сообщение было отредактировано: 18 апр 12, 13:24
18 апр 12, 13:19    [12432673]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
aleks2
Guest
( SELECT CDTUL
	,CCONO
	,CCSTY
	,CRCTY
	,COUNT(CAMBD) AS [Count]
	,SUM(CAMBD + CAMCG) AS [Total]
	FROM MCD400.MCD400.CMSFIL.JCPMST
	GROUP BY CDTUL
	,CCONO
	,CCSTY
	,CRCTY ) AS A
WHERE NOT ( CCONO IN ( 1, 2 ) AND CCSTY = 'I' AND CRCTY = 2 ) 


Даже если ЭТО переписать вменяемо - могет стать быстрее

( SELECT CDTUL
	,CCONO
	,CCSTY
	,CRCTY
	,COUNT(CAMBD) AS [Count]
	,SUM(CAMBD + CAMCG) AS [Total]
	FROM MCD400.MCD400.CMSFIL.JCPMST
             WHERE NOT ( CCONO IN ( 1, 2 ) AND CCSTY = 'I' AND CRCTY = 2 )
	GROUP BY CDTUL
	,CCONO
	,CCSTY
	,CRCTY ) AS A
 

Занафега группировать все содержимое таблицы?
18 апр 12, 13:25    [12432709]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Andr___!,

20000101 - это что?
18 апр 12, 13:29    [12432730]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
iap
Andr___!,

20000101 - это что?

Это неявное конвертирование в строку, чтобы враги не догадались
SELECT LEFT(20000101,4)
18 апр 12, 13:32    [12432753]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
Andr___!
Member

Откуда: Odessa
Сообщений: 92
iap
Andr___!,

20000101 - это что?


просто подстановка если в поле что то не похожее на дату то проставляется такая ерунда
18 апр 12, 13:32    [12432754]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
Andr___!
Member

Откуда: Odessa
Сообщений: 92
aleks2
( SELECT CDTUL
	,CCONO
	,CCSTY
	,CRCTY
	,COUNT(CAMBD) AS [Count]
	,SUM(CAMBD + CAMCG) AS [Total]
	FROM MCD400.MCD400.CMSFIL.JCPMST
	GROUP BY CDTUL
	,CCONO
	,CCSTY
	,CRCTY ) AS A
WHERE NOT ( CCONO IN ( 1, 2 ) AND CCSTY = 'I' AND CRCTY = 2 ) 


Даже если ЭТО переписать вменяемо - могет стать быстрее

( SELECT CDTUL
	,CCONO
	,CCSTY
	,CRCTY
	,COUNT(CAMBD) AS [Count]
	,SUM(CAMBD + CAMCG) AS [Total]
	FROM MCD400.MCD400.CMSFIL.JCPMST
             WHERE NOT ( CCONO IN ( 1, 2 ) AND CCSTY = 'I' AND CRCTY = 2 )
	GROUP BY CDTUL
	,CCONO
	,CCSTY
	,CRCTY ) AS A
 

Занафега группировать все содержимое таблицы?


Согласен , так должно бы быть но когда добавляю WHERE помоему он вообще уходит в транс (после выполнения в полторы минуты - вырубаю)
а вот так выполняется 10 сек
автор
SELECT CDTUL
,CCONO
,CCSTY
,CRCTY
,COUNT(CAMBD) AS [Count]
,SUM(CAMBD + CAMCG) AS [Total]
FROM MCD400.MCD400.CMSFIL.JCPMST

GROUP BY CDTUL
,CCONO
,CCSTY
,CRCTY
HAVING NOT ( CCONO IN ( 1, 2 ) AND CCSTY = 'I' AND CRCTY = 2 )
18 апр 12, 13:38    [12432795]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
iap
Member

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

20000101 - это что?


просто подстановка если в поле что то не похожее на дату то проставляется такая ерунда
Всё-таки, одинарные кавычки были бы крайне желательны
18 апр 12, 13:44    [12432826]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
aleks2
Guest
1. Да, и такое могет быть. Если фильтр не очень селективный, а сканирования при вашем условии все одно не избежать.
2. Тады тока EXECUTE... AT.
18 апр 12, 13:46    [12432835]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
Andr___!
Member

Откуда: Odessa
Сообщений: 92
aleks2
1. Да, и такое могет быть. Если фильтр не очень селективный, а сканирования при вашем условии все одно не избежать.
2. Тады тока EXECUTE... AT.


1)да фильтр там не очень селективный,- отсеивает только строк 120 из 8 млн )))
2) почитаю про это , спасибо

А поповоду конструкции запроса есть ещё идеи?
18 апр 12, 13:50    [12432849]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
tt11
Guest
select coalesce(month(case when isdate(cdtul) = 1 then cdtul end), 2000) [year]
        ,coalesce(year(case when isdate(cdtul) = 1 then cdtul  end), 01) [month]
        ,count(cambd) [count]
        ,sum(cambd + camcg) [total]
  from mcd400.mcd400.cmsfil.jcpmst
  where ccono not in ( 1, 2 )
    and ccsty <> 'i'
    and crcty <> 2 
  group by month(case when isdate(cdtul) = 1 then cdtul end)
          ,year(case when isdate(cdtul) = 1 then cdtul  end)
  
18 апр 12, 13:57    [12432881]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
Andr___!
Member

Откуда: Odessa
Сообщений: 92
tt11
select coalesce(month(case when isdate(cdtul) = 1 then cdtul end), 2000) [year]
        ,coalesce(year(case when isdate(cdtul) = 1 then cdtul  end), 01) [month]
        ,count(cambd) [count]
        ,sum(cambd + camcg) [total]
  from mcd400.mcd400.cmsfil.jcpmst
  where ccono not in ( 1, 2 )
    and ccsty <> 'i'
    and crcty <> 2 
  group by month(case when isdate(cdtul) = 1 then cdtul end)
          ,year(case when isdate(cdtul) = 1 then cdtul  end)
  

Arithmetic overflow error converting expression to data type datetime.
18 апр 12, 14:04    [12432920]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
tt11
Guest
  select coalesce(left(case when isdate(cdtul) = 1 then cdtul end,4), '2000') [year]
        ,coalesce(substring(case when isdate(cdtul) = 1 then cdtul  end,4,2), '01') [month]
        ,count(cambd) [count]
        ,sum(cambd + camcg) [total]
  from mcd400.mcd400.cmsfil.jcpmst
  where ccono not in ( 1, 2 )
    and ccsty <> 'I'
    and crcty <> 2 
  group by left(case when isdate(cdtul) = 1 then cdtul end,4)
          ,substring(case when isdate(cdtul) = 1 then cdtul  end,4,2)


имхо надо на дату проверять другим способом. Мусор по другому отфильтровать нельзя?
18 апр 12, 14:14    [12432987]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
А какая селективность у ccono in ( 1, 2 )
and ccsty = 'I'
and crcty = 2 ?
И вообще что там с плотностью распределения индекса по ccono,ccsty и crcty ?
18 апр 12, 15:57    [12433941]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация SQL запроса  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Andr___!
aleks2
1. Да, и такое могет быть. Если фильтр не очень селективный, а сканирования при вашем условии все одно не избежать.
2. Тады тока EXECUTE... AT.


1)да фильтр там не очень селективный,- отсеивает только строк 120 из 8 млн )))
2) почитаю про это , спасибо

А поповоду конструкции запроса есть ещё идеи?

ну если фильтр не селективный тогда только выполнение на стороне удаленного сервера.
18 апр 12, 16:08    [12434053]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить