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

Има ли начин да се опрости NULL сравнение на 2 стойности

Да, можете и можете да накарате оптимизатора също да го разпознае.

Пол Уайт има тази малка песен :

WHERE NOT EXISTS (
    SELECT d.[Data]
    INTERSECT
    SELECT i.[Data])

Това работи поради семантиката на INTERSECT които се занимават с нули. Това казва „има ли не редове в подзаявката, съставена от стойност B и стойност B", това ще бъде изпълнено само ако те са различни стойности или едната е нула, а другата не. Ако и двете са нула, ще има ред с нула.

Ако проверите плана на XML заявката (не графичния в SSMS), ще видите, че той се компилира до d.[Data] <> i.[Data] , но операторът, който използва, ще има CompareOp="IS" а не EQ .

Вижте пълния план тук .

Съответната част от плана е:

                <Predicate>
                  <ScalarOperator ScalarString="@t1.[i] as [t1].[i] = @t2.[i] as [t2].[i]">
                    <Compare CompareOp="IS">
                      <ScalarOperator>
                        <Identifier>
                          <ColumnReference Table="@t1" Alias="[t1]" Column="i" />
                        </Identifier>
                      </ScalarOperator>
                      <ScalarOperator>
                        <Identifier>
                          <ColumnReference Table="@t2" Alias="[t2]" Column="i" />
                        </Identifier>
                      </ScalarOperator>
                    </Compare>
                  </ScalarOperator>
                </Predicate>

Намирам, че оптимизаторът работи много добре по този начин, вместо да прави EXISTS / EXCEPT .

Призовавам ви да гласувате за Azure Feedback за прилагане на правилен оператор



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Microsoft обявява SQL Server 2012 R2 и SQL Server 2012 R3!

  2. Как да вмъкна в две таблици наведнъж в съхранена процедура?

  3. Функцията Contains() се проваля с низове от числа?

  4. Актуализирайте с присъединяване, групиране по и имане

  5. Pivots с динамични колони в SQL Server