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

Откуда:
Сообщений: 11
SELECT     C1.InstanceID, C1.Digest, C1.Name, C1.Прибор, C1.cSID, C1.[Год прибора], C1.cTID, C1.[№ партии], C2_1.InstanceID AS Expr1, C2_1.[Состояние прибора]
FROM         (SELECT     C1_2.InstanceID, C1_2.Digest, C1_2.Name, C1_2.Прибор, C1_2.cSID, C1_2.[Год прибора], C2_2.cTID, C2_2.[№ партии]
                       FROM          (SELECT     C1_1.InstanceID, C1_1.Digest, C1_1.Name, C1_1.Прибор, C2.cSID, C2.[Год прибора]
                                               FROM          (SELECT     ОсновнаяИнформация.InstanceID, ОсновнаяИнформация.Digest, ОсновнаяИнформация.Name, 
                                                                                              Свойства.DisplayValue AS Прибор
                                                                       FROM          [dvtable_{B3CD26B1-1807-4A98-90DA-7969244F4E4E}] AS ОсновнаяИнформация INNER JOIN
                                                                                              [dvtable_{5B6B407E-3D72-49E7-97D9-8E1E028C7274}] AS Свойства ON 
                                                                                              ОсновнаяИнформация.InstanceID = Свойства.InstanceID
                                                                       WHERE      (Свойства.Name = N'Прибор') AND (ОсновнаяИнформация.Type = '{42826E25-AD0E-4D9C-8B18-CD88E6796972}') AND 
                                                                                              (Свойства.DisplayValue <> '')) AS C1_1 INNER JOIN
                                                                          (SELECT     ОсновнаяИнформация.InstanceID AS cSID, Свойства.DisplayValue AS [Год прибора]
                                                                            FROM          [dvtable_{B3CD26B1-1807-4A98-90DA-7969244F4E4E}] AS ОсновнаяИнформация INNER JOIN
                                                                                                   [dvtable_{5B6B407E-3D72-49E7-97D9-8E1E028C7274}] AS Свойства ON 
                                                                                                   ОсновнаяИнформация.InstanceID = Свойства.InstanceID
                                                                            WHERE      (Свойства.Name = N'/Год прибора')) AS C2 ON C1_1.InstanceID = C2.cSID) AS C1_2 INNER JOIN
                                                  (SELECT DISTINCT ОсновнаяИнформация.InstanceID AS cTID, Свойства.DisplayValue AS [№ партии]
                                                    FROM          [dvtable_{B3CD26B1-1807-4A98-90DA-7969244F4E4E}] AS ОсновнаяИнформация INNER JOIN
                                                                           [dvtable_{5B6B407E-3D72-49E7-97D9-8E1E028C7274}] AS Свойства ON ОсновнаяИнформация.InstanceID = Свойства.InstanceID
                                                    WHERE      (Свойства.Name = N'№ партии')) AS C2_2 ON C1_2.InstanceID = C2_2.cTID) AS C1 INNER JOIN
                          (SELECT     ОсновнаяИнформация.InstanceID, 
                                                   CASE Свойства.DisplayValue WHEN 'В ремонте' THEN 'В ремонте' ELSE 'Не в ремонте' END AS [Состояние прибора]
                            FROM          [dvtable_{B3CD26B1-1807-4A98-90DA-7969244F4E4E}] AS ОсновнаяИнформация INNER JOIN
                                                   [dvtable_{5B6B407E-3D72-49E7-97D9-8E1E028C7274}] AS Свойства ON ОсновнаяИнформация.InstanceID = Свойства.InstanceID
                            WHERE      (Свойства.Name = N'Состояние прибора') AND (Свойства.DisplayValue = 'В ремонте')) AS C2_1 ON C1.InstanceID = C2_1.InstanceID


Собственно единственный вопрос который меня мучает - это повторяющееся обращение к одним тем же двум таблицам. Если вынести их содержимое допусти во временные переменные - это даст прирост к производительности?
9 апр 12, 05:09    [12385491]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оценить оптимальность SQL-запроса.  [new]
MIKron1991
Member

Откуда:
Сообщений: 11
Заранее прошу прощения за неудачное форматирование, другой копии под рукой нет.
9 апр 12, 05:11    [12385492]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оценить оптимальность SQL-запроса.  [new]
aleks2
Guest
Не, ну вот тредстартеру лень отформатировать... а мне лень глаза ломать.
9 апр 12, 05:23    [12385493]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оценить оптимальность SQL-запроса.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
SELECT  C1.InstanceID ,
        C1.Digest ,
        C1.Name ,
        C1.Прибор ,
        C1.cSID ,
        C1.[Год прибора] ,
        C1.cTID ,
        C1.[№ партии] ,
        C2_1.InstanceID AS Expr1 ,
        C2_1.[Состояние прибора]
FROM    ( SELECT    C1_2.InstanceID ,
                    C1_2.Digest ,
                    C1_2.Name ,
                    C1_2.Прибор ,
                    C1_2.cSID ,
                    C1_2.[Год прибора] ,
                    C2_2.cTID ,
                    C2_2.[№ партии]
          FROM      ( SELECT    C1_1.InstanceID ,
                                C1_1.Digest ,
                                C1_1.Name ,
                                C1_1.Прибор ,
                                C2.cSID ,
                                C2.[Год прибора]
                      FROM      ( SELECT    ОсновнаяИнформация.InstanceID ,
                                            ОсновнаяИнформация.Digest ,
                                            ОсновнаяИнформация.Name ,
                                            Свойства.DisplayValue AS Прибор
                                  FROM      [dvtable_{B3CD26B1-1807-4A98-90DA-7969244F4E4E}]
                                            AS ОсновнаяИнформация
                                            INNER JOIN [dvtable_{5B6B407E-3D72-49E7-97D9-8E1E028C7274}]
                                            AS Свойства ON ОсновнаяИнформация.InstanceID = Свойства.InstanceID
                                  WHERE     ( Свойства.Name = N'Прибор' )
                                            AND ( ОсновнаяИнформация.Type = '{42826E25-AD0E-4D9C-8B18-CD88E6796972}' )
                                            AND ( Свойства.DisplayValue <> '' )
                                ) AS C1_1
                                INNER JOIN ( SELECT ОсновнаяИнформация.InstanceID AS cSID ,
                                                    Свойства.DisplayValue AS [Год прибора]
                                             FROM   [dvtable_{B3CD26B1-1807-4A98-90DA-7969244F4E4E}]
                                                    AS ОсновнаяИнформация
                                                    INNER JOIN [dvtable_{5B6B407E-3D72-49E7-97D9-8E1E028C7274}]
                                                    AS Свойства ON ОсновнаяИнформация.InstanceID = Свойства.InstanceID
                                             WHERE  ( Свойства.Name = N'/Год прибора' )
                                           ) AS C2 ON C1_1.InstanceID = C2.cSID
                    ) AS C1_2
                    INNER JOIN ( SELECT DISTINCT
                                        ОсновнаяИнформация.InstanceID AS cTID ,
                                        Свойства.DisplayValue AS [№ партии]
                                 FROM   [dvtable_{B3CD26B1-1807-4A98-90DA-7969244F4E4E}]
                                        AS ОсновнаяИнформация
                                        INNER JOIN [dvtable_{5B6B407E-3D72-49E7-97D9-8E1E028C7274}]
                                        AS Свойства ON ОсновнаяИнформация.InstanceID = Свойства.InstanceID
                                 WHERE  ( Свойства.Name = N'№ партии' )
                               ) AS C2_2 ON C1_2.InstanceID = C2_2.cTID
        ) AS C1
        INNER JOIN ( SELECT ОсновнаяИнформация.InstanceID ,
                            CASE Свойства.DisplayValue
                              WHEN 'В ремонте' THEN 'В ремонте'
                              ELSE 'Не в ремонте'
                            END AS [Состояние прибора]
                     FROM   [dvtable_{B3CD26B1-1807-4A98-90DA-7969244F4E4E}]
                            AS ОсновнаяИнформация
                            INNER JOIN [dvtable_{5B6B407E-3D72-49E7-97D9-8E1E028C7274}]
                            AS Свойства ON ОсновнаяИнформация.InstanceID = Свойства.InstanceID
                     WHERE  ( Свойства.Name = N'Состояние прибора' )
                            AND ( Свойства.DisplayValue = 'В ремонте' )
                   ) AS C2_1 ON C1.InstanceID = C2_1.InstanceID

Оптимальность проверяется методом сравнения двух решений для текущего набора данных.
Визуально - все нормально с запросом и если работает быстро то можно фигней не страдать и оставить как есть. Единственно странно видеть помесь N'русский' и 'русский'. А также под вопросом необходимость DISTINCT, но там вам виднее.
9 апр 12, 09:11    [12385705]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оценить оптимальность SQL-запроса.  [new]
MIKron1991
Member

Откуда:
Сообщений: 11
kDnZP, спасибо за ответ. Сравнивать мне не с чем. Работает неплохо, но хотелось бы быстрее, посколько это запрос для SRSS, а там каждая секунда на счету.

По поводу форматирования, и разнородиц вроде N еще раз прощу прощения - мне важно оценить правильна ли логика у запроса с точки зрения оптимальности.
9 апр 12, 10:26    [12385996]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оценить оптимальность SQL-запроса.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
MIKron1991, оптимальность - сферическая штука в вакууме. Либо же огласите свои критерии оптимальности.
В принципе, насколько я вижу, вполне можно переписать через PIVOT, на основе:
SELECT  ОсновнаяИнформация.InstanceID ,
        ОсновнаяИнформация.Digest ,
        ОсновнаяИнформация.Name ,
        Свойства.DisplayValue ,
        CASE WHEN ( Свойства.Name = N'Прибор' )
                  AND ( ОсновнаяИнформация.Type = '{42826E25-AD0E-4D9C-8B18-CD88E6796972}' )
                  AND ( Свойства.DisplayValue <> '' ) THEN 1
             WHEN ( Свойства.Name = N'/Год прибора' ) THEN 2
             WHEN ( Свойства.Name = N'№ партии' ) THEN 3
             WHEN ( Свойства.Name = N'Состояние прибора' )
                  AND ( Свойства.DisplayValue = 'В ремонте' ) THEN 4
             ELSE 5
        END sType
FROM    [dvtable_{B3CD26B1-1807-4A98-90DA-7969244F4E4E}] AS ОсновнаяИнформация
        INNER JOIN [dvtable_{5B6B407E-3D72-49E7-97D9-8E1E028C7274}] AS Свойства ON ОсновнаяИнформация.InstanceID = Свойства.InstanceID
9 апр 12, 10:39    [12386065]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оценить оптимальность SQL-запроса.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
MIKron1991,

тебе толком никто не ответит. запрос написан сложно, также надо знать постановку задачи и расклад данных.
9 апр 12, 11:10    [12386281]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить