Ускорить производительность SQL-запросов - PullRequest
0 голосов
/ 12 февраля 2019

У меня следующий SQL-запрос:

SELECT * FROM (
      SELECT dbo.Table1.Table1_ID, dbo.Table1.Name, dbo.Table5.Ergebniss, 
      dbo.Table2.Datum, dbo.Table3.Stelle, dbo.Table2.Nummer 
    FROM dbo.Table1 
    INNER JOIN dbo.Table2 ON dbo.Table1.Table1_ID = dbo.Table2.Table1_ID 
    INNER JOIN dbo.Table3 ON dbo.Table2.Table2_ID = dbo.Table3.Table2_ID 
    INNER JOIN dbo.Table4 ON dbo.Table3.Table3_ID = dbo.Table4.Table3_ID 
    INNER JOIN dbo.Table5 ON dbo.Table4.Table4_ID = dbo.Table5.Table4_ID
    GROUP BY dbo.Table1.Table1_ID, dbo.Table1.Name, dbo.Table5.Wert2, 
    dbo.Table5.Wert1, dbo.Table5.Ergebniss, dbo.Table2.Datum, 
    dbo.Table2.Nummer, dbo.Table3.Stelle
       HAVING (dbo.Table1.Table1_ID = 1) 
         AND (dbo.Table2.Nummer = (SELECT MAX(dbo.Table2.Nummer) AS 
   MaxSchichtNummer 
 FROM dbo.Table1 
 INNER JOIN dbo.Table2 ON dbo.Table1.Table1_ID = dbo.Table2.Table1_ID 
 WHERE (dbo.Table1.Table1_ID = 1))) ) AS TG 
 where tg.Nummer 
   in (Select top 5000 Nummer from dbo.Table2 where Table1_ID=1 order by datum 
 desc) order by Datum desc

Это занимает очень много времени, поэтому выберите данные.Можно ли ускорить запрос?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Пожалуйста, попробуйте этот запрос,

SELECT * FROM 
(
        SELECT Table1.Table1_ID, Table1.Name, Table5.Ergebniss, Table2.Datum, Table3.Stelle, Table2.Nummer 
        FROM Table1 
        INNER JOIN Table2 ON Table1.Table1_ID = Table2.Table1_ID 
        INNER JOIN Table3 ON Table2.Table2_ID = Table3.Table2_ID 
        INNER JOIN Table4 ON Table3.Table3_ID = Table4.Table3_ID 
        INNER JOIN Table5 ON Table4.Table4_ID = Table5.Table4_ID
        WHERE Table1.Table1_ID = 1
        GROUP BY Table1.Table1_ID, Table1.Name, Table5.Wert2, Table5.Wert1, Table5.Ergebniss, Table2.Datum, Table2.Nummer, Table3.Stelle
        HAVING (Table2.Nummer = (SELECT MAX(Table2.Nummer) AS MaxSchichtNummer 
                                    FROM Table1 
                                    INNER JOIN Table2 ON Table1.Table1_ID = Table2.Table1_ID 
                                    WHERE Table1.Table1_ID = 1)

)tg
where tg.Nummer 
  in (Select top 5000 Nummer from dbo.Table2 where Table1_ID = 1 order by datum desc) 
order by Datum desc
0 голосов
/ 12 февраля 2019

Рассмотрите возможность использования операторов EXISTS и WHERE.EXISTS имеет лучшую производительность, чем IN.WHERE оператор выполняется до GROUP BY, поэтому мы имеем лучшую производительность.Кроме того, попробуйте переместить операторы WHERE до GROUP BY, так как это отфильтрует строки, и у вас будет меньше строк для фильтрации.

SELECT *
FROM
(
    SELECT dbo.Table1.Table1_ID,
           dbo.Table1.Name,
           dbo.Table5.Ergebniss,
           dbo.Table2.Datum,
           dbo.Table3.Stelle,
           dbo.Table2.Nummer
    FROM dbo.Table1
        INNER JOIN dbo.Table2
            ON dbo.Table1.Table1_ID = dbo.Table2.Table1_ID
        INNER JOIN dbo.Table3
            ON dbo.Table2.Table2_ID = dbo.Table3.Table2_ID
        INNER JOIN dbo.Table4
            ON dbo.Table3.Table3_ID = dbo.Table4.Table3_ID
        INNER JOIN dbo.Table5
            ON dbo.Table4.Table4_ID = dbo.Table5.Table4_ID
    WHERE (dbo.Table1.Table1_ID = 1)
           AND (dbo.Table2.Nummer =
               (
                   SELECT MAX(dbo.Table2.Nummer) AS MaxSchichtNummer
                   FROM dbo.Table1
                       INNER JOIN dbo.Table2
                           ON dbo.Table1.Table1_ID = dbo.Table2.Table1_ID
                   WHERE (dbo.Table1.Table1_ID = 1)
               )
               )
            and exists                 
            (
                SELECT TOP 5000
                Nummer
                FROM dbo.Table2
                WHERE Table1_ID = 1
                AND nummer = dbo.Table2.Nummer 
            )
    GROUP BY dbo.Table1.Table1_ID,
             dbo.Table1.NAME,
             dbo.Table5.Wert2,
             dbo.Table5.Wert1,
             dbo.Table5.Ergebniss,
             dbo.Table2.Datum,
             dbo.Table2.Nummer,
             dbo.Table3.Stelle

) AS TG
ORDER BY Datum DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...