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

Обвиването на nullable колони в ISNULL причинява ли сканиране на таблица?

Да, причинява сканиране на таблици. (въпреки че изглежда се оптимизира, ако колоната всъщност не е nullable)

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

Категоризацията му в Microsoft.Performance категорията е доста забавна, тъй като изглежда, че е написана от някой без разбиране за изпълнение на заявки.

Твърди се, че обосновката е

Докато самият израз се оценява като unknown вашият код връща напълно детерминистичен резултат, след като разберете, че всеки = , <> , > , < сравнение с NULL оценете като Неизвестно и че WHERE клауза връща само редове, където изразът се оценява на true .

Възможно е те да означават ако ANSI_NULLS е изключен, но примерът, който дават в документацията на WHERE ISNULL([c2],0)> 2; срещу WHERE [c2]> 2; така или иначе няма да бъдат засегнати от тази настройка. Тази настройка

Планове за изпълнение, показващи сканиране срещу търсене или по-долу

CREATE TABLE #foo
  (
     x INT NULL UNIQUE
  )

INSERT INTO #foo
SELECT ROW_NUMBER() OVER (ORDER BY @@SPID)
FROM   sys.all_columns

SELECT *
FROM   #foo
WHERE  ISNULL(x, 10) = 10

SELECT *
FROM   #foo
WHERE  x = 10

SELECT *
FROM   #foo
WHERE  x = 10
        OR x IS NULL 




  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. Вмъкване на големи обектни данни в Salesforce.com от SQL Server

  4. Как да създадете таблица с колона за идентичност

  5. TSQL да върне NO или YES вместо TRUE или FALSE