Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Клаузата WHERE е по-добре да се изпълни преди IN и JOIN или след това

В случай на INNER JOIN или таблица отляво в LEFT JOIN, в много случаи оптимизаторът ще установи, че е по-добре първо да извърши някакво филтриране (най-висока селективност), преди действително да извърши какъвто и да е тип физическо свързване - така че има очевидно физическият ред на операциите е по-добър.

До известна степен можете понякога да контролирате това (или да пречите на това) с вашия SQL, например с агрегати в подзаявки.

Логическият ред на обработка на ограниченията в заявката може да се трансформира само според известни инвариантни трансформации.

И така:

SELECT *
FROM a
INNER JOIN b
    ON a.id = b.id
WHERE a.something = something
    AND b.something = something

все още е логически еквивалентен на:

SELECT *
FROM a
INNER JOIN b
    ON a.id = b.id
    AND a.something = something
    AND b.something = something

и като цяло ще имат един и същ план за изпълнение.

От друга страна:

SELECT *
FROM a
LEFT JOIN b
    ON a.id = b.id
WHERE a.something = something
    AND b.something = something

НЕ е еквивалентно на:

SELECT *
FROM a
LEFT JOIN b
    ON a.id = b.id
    AND a.something = something
    AND b.something = something

и така оптимизаторът няма да ги трансформира в същия план за изпълнение.

Оптимизаторът е много интелигентен и е в състояние да придвижва нещата доста успешно, включително свиване на изгледи и вградени таблично стойностни функции, както и дори да прокарва нещата надолу през определени видове агрегати доста успешно.

Обикновено, когато пишете SQL, той трябва да бъде разбираем, поддържаем и правилен. Що се отнася до ефективността при изпълнение, ако оптимизаторът изпитва затруднения да превърне декларативния SQL в план за изпълнение с приемлива производителност, кодът понякога може да бъде опростен или подходящи индекси или подсказки добавени или разбити на стъпки, които трябва изпълняват по-бързо - всичко в последователни порядки на инвазивност.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да изброя всички външни ключове, препращащи към дадена таблица в SQL Server?

  2. Заявка за изброяване на всички съхранени процедури

  3. SQL Server 2016:Въздействие върху производителността на винаги криптирани

  4. Конфигуриране на известия за поща в базата данни в MS SQL Server

  5. Как програмно да създадете ODBC свързана таблица към изглед на SQL сървър и да може да бъде редактирана?