sql >> Database teknologi >  >> RDS >> Sqlserver

Er der en måde at forenkle en NULL sammenligning af 2 værdier

Ja, det kan du, og du kan også få optimeringsværktøjet til at genkende det.

Paul White har denne lille snert :

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

Dette virker på grund af semantikken i INTERSECT som omhandler nuller. Hvad dette siger er "er der nej rækker i underforespørgslen, der består af værdi B og værdi B", vil denne kun være opfyldt, hvis de er forskellige værdier, eller den ene er null og den anden ikke. Hvis begge er nul, vil der være en række med en null.

Hvis du tjekker XML-forespørgselsplanen (ikke den grafiske i SSMS), vil du se, at den kompilerer helt ned til d.[Data] <> i.[Data] , men den operator, den bruger, vil have CompareOp="IS" og ikke EQ .

Se hele planen her .

Den relevante del af planen er:

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

Jeg synes, at optimizeren fungerer meget godt på denne måde, i stedet for at gøre EXISTS / EXCEPT .

Jeg opfordrer dig til at stemme på Azure Feedback at implementere en ordentlig operatør



  1. auto_increment efter gruppe

  2. oracle slette forespørgsel tager for lang tid

  3. Indstil brugerdefineret tidszone i Django/PostgreSQL (indisk standardtid)

  4. MySQL Enum ydeevne fordel?