sql >> Database >  >> RDS >> Sqlserver

Is er een manier om een ​​NULL-vergelijking van 2 waarden te vereenvoudigen?

Ja dat kan, en je kunt de optimizer het ook laten herkennen.

Paul White heeft dit deuntje :

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

Dit werkt vanwege de semantiek van INTERSECT die te maken hebben met nullen. Wat dit zegt is "zijn er geen rijen in de subquery die bestaat uit waarde B en waarde B", wordt hier alleen aan voldaan als het verschillende waarden zijn of als de ene null is en de andere niet. Als beide nulls zijn, is er een rij met een null.

Als u het XML-queryplan controleert (niet het grafische plan in SSMS), zult u zien dat het helemaal tot d.[Data] <> i.[Data] wordt gecompileerd. , maar de operator die het gebruikt heeft CompareOp="IS" en niet EQ .

Bekijk het volledige plan hier .

Het relevante deel van het plan is:

                <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>

Ik vind dat de optimizer op deze manier heel goed werkt, in plaats van EXISTS / EXCEPT te doen .

Ik verzoek u dringend te stemmen voor de Azure Feedback om een ​​juiste operator te implementeren



  1. Kolommen met vreemde sleutel hernoemen in MySQL

  2. Hoe GET_FORMAT() werkt in MariaDB

  3. MySQL ODBC-probleem:naam van gegevensbron niet gevonden en geen standaardstuurprogramma opgegeven

  4. mysql-query - gegevens invoegen unix_timestamp (nu ( )) probleem