Фильтрация с WHERE

Повышение производительности запросов в SQL Server

Dean Smith

Founder, Atamai Analytics

Как работает WHERE

SELECT *
FROM PlayerStats
WHERE Position = 'SG'

Таблица PlayerStats

Повышение производительности запросов в SQL Server

Как работает WHERE

SELECT *
FROM PlayerStats
WHERE Position = 'SG'

Отфильтрованная таблица PlayerStats

Повышение производительности запросов в SQL Server

Порядок обработки WHERE

SELECT PlayerName, 
      Team, 
      (DRebound+ORebound) AS TotalRebounds
FROM PlayerStats
WHERE TotalRebounds >= 1000
ORDER BY TotalRebounds DESC;
  • WHERE выполняется раньше SELECT
-- ERROR
Invalid column name 'TotalRebounds'.
Повышение производительности запросов в SQL Server

Использование подзапроса

SELECT PlayerName, 
       Team, 
       TotalRebounds
FROM
     -- Start of sub-query tr
    (SELECT PlayerName, Team, 
             (DRebound+ORebound) AS TotalRebounds
     FROM PlayerStats) tr
WHERE TotalRebounds >= 1000 -- created in the sub-query
ORDER BY TotalRebounds DESC;
Повышение производительности запросов в SQL Server

Использование подзапроса

SELECT PlayerName, 
       Team, 
       TotalRebounds
FROM
     -- Start of sub-query tr
    (SELECT PlayerName, Team, 
             (DRebound+ORebound) AS TotalRebounds
     FROM PlayerStats) tr
WHERE TotalRebounds >= 1000 -- created in the sub-query
ORDER BY TotalRebounds DESC;
PlayerName Team TotalRebounds
Andre Drummond DET 1247
DeAndre Jordan LAC 1171
Karl-Anthony Towns MIN 1012
Dwight Howard CHO 1012
Повышение производительности запросов в SQL Server

Вычисления над столбцами

SELECT PlayerName, 
       Team, 
       (DRebound+ORebound) AS TotalRebounds
FROM PlayerStats
WHERE (DRebound+ORebound) >= 1000
ORDER BY TotalRebounds DESC;
  • Вычисления над столбцами в условии фильтра WHERE могут увеличить время выполнения запроса
PlayerName Team TotalRebounds
Andre Drummond DET 1247
DeAndre Jordan LAC 1171
Karl-Anthony Towns MIN 1012
Dwight Howard CHO 1012
Повышение производительности запросов в SQL Server

Функции над столбцами

SELECT PlayerName, College, DraftYear 
FROM Players
WHERE UPPER(LEFT(College,7)) = 'GEORGIA'; 
-- unnecessary use of functions 
-- on a filtering column
  • Применение функций к столбцам в условии фильтра WHERE может увеличить время выполнения запроса
PlayerName College DraftYear
Damien Wilkins Georgia
Derrick Favors Georgia Tech 2010
Iman Shumpert Georgia Tech 2011
R.J. Hunter Georgia State 2015
... ... ...
Повышение производительности запросов в SQL Server

Упрощение WHERE

SELECT PlayerName, College, DraftYear 
FROM Players 
        -- No calculation or function
WHERE College like 'Georgia%'; 
PlayerName College DraftYear
Damien Wilkins Georgia
Derrick Favors Georgia Tech 2010
Iman Shumpert Georgia Tech 2011
R.J. Hunter Georgia State 2015
... ... ...
Повышение производительности запросов в SQL Server

Итоги

  • WHERE выполняется раньше SELECT
  • Вычисления над столбцами в условии фильтра WHERE могут увеличить время выполнения запроса
  • Применение функций к столбцам в условии фильтра WHERE может увеличить время выполнения запроса
Повышение производительности запросов в SQL Server

Давайте потренируемся!

Повышение производительности запросов в SQL Server

Preparing Video For Download...