N'EXISTE PAS vs PAS DANS

Je suis l'optimisation de certaines requêtes SQL (ce qui pourrait être considéré comme la partie 2 de une question que j'ai posté) et le remplacement de quelques PAS avec n'EXISTE PAS de prédicats

Suis-je en droit de penser que le principal avantage de cela est qu'avec n'EXISTE PAS vous obtenir l'avantage que l'état va s'arrêter lorsqu'une seule correspondance est trouvée, mais PAS avec un comptage de sous-requête serait serait de faire un full table scan?

Il semble également que N'EN aurait aussi besoin de plus de travail si les données sélectionnées contenues Null, est-ce correct?

J'ai besoin de faire en sorte que la deuxième déclaration de mieux que le premier (et fonctionnellement équivalent) dans ces deux cas, avant que je les mettre en œuvre dans le proc:

Cas 1:

        --exclude sessions that were tracked as part of a conversion during the last response_time minutes
        -- AND session_id NOT IN (SELECT DISTINCT tracked_session_id    
        --                              FROM data.conversions WITH (NOLOCK)
        --                              WHERE client_id = @client_id
        --                              AND utc_date_completed >= DATEADD(minute, (-2) * cy.response_time, @date)
        --                              AND utc_date_completed <= @date     
        --                              AND utc_date_clicked <= @date)

        AND NOT EXISTS (SELECT 1
                            FROM data.conversions WITH (NOLOCK)
                            WHERE client_id = @client_id
                            AND utc_date_completed >= DATEADD(minute, (-2) * cy.response_time, @date)
                            AND utc_date_completed <= @date
                            AND utc_date_clicked <= @date
                            AND data.conversions.tracked_session_id = d.session_id
        )

Cas 2:

        -- NOT EXISTS vs full table scan with COUNT(dashboard_id)                                   
        -- AND (SELECT COUNT(dashboard_id)
        --          FROM data.dashboard_responses WITH(NOLOCK)
        --          WHERE session_id = d.session_id
        --          AND cycle_id = cy.id
        --          AND client_id = @client_id) = 0

        AND NOT EXISTS(SELECT 1
                            FROM data.dashboard_responses
                            WHERE session_id = d.session_id
                            AND cycle_id = cy.id
                            AND client_id = @client_id)

Acclamations

  • Le plan d'exécution de ne pas vous dire si ce N'exécute une analyse de la table? Personnellement, je ne regarde que le plan dit concernant les performances des entrées/sorties statistiques sur quoi que ce soit d'autre.
  • double possible de What est la différence entre n'EXISTE PAS contre PAS contre une JOINTURE GAUCHE OÙ EST NULL?
  • Malheureusement je ne peux pas (facilement) de l'exécution de ces procédures stockées dans la source de données pour obtenir un plan de requête
  • À partir d'Oracle 10g AU/PAS explicitement converti EXISTE/N'. Le PAS est aussi efficace que n'EXISTE PAS. Mais n'utilisez PAS DANS votre sous-requête peut retourner NULL.
  • double possible de PAS DE vs n'EXISTE PAS