Question


Note rapide

Alors, comme je l'ai écrit ci-dessous le problème que je trouve un moyen de le réparer moi-même. Je pensais encore poster la question parce que:

  1. Quelqu'un pourrait trouver utile.
  2. Je ne comprends pas trop pourquoi cela fonctionne.

En tout cas le code fixe (voir les réponses).


j'ai écrit:

J'ai passé les âges googler cela et peut trouver beaucoup de réponses connexes, mais aucun qui correspondent exactement à ma question.

J'exécutez le code ci-dessous contre une base de données SQL Server (10) et il exécute très rapide. Le plan d'exécution il utilise implique une jointure de hachage.

Alors je le lance à nouveau, mais cette uncomment temps les deux premières lignes (lignes DECLARE et SET), et aussi de supprimer le « +1 » à côté de y. [Date] et décommentez le « + @COUNTER ». Maintenant, la requête prend les âges (sur les âges) pour terminer - le plan d'exécution au lieu d'utiliser des boucles imbriquées. Note Je suis toujours d'ajouter un à la date, mais en utilisant une variable au lieu d'une constante.

La question est: puis-je faire la requête à l'aide de l'utilisation @COUNTER une jointure de hachage au lieu d'une boucle imbriquée

(un peu de fond: Ce que je suis en train de faire est correspondre vaguement x. [Date] et y. [Date] afin qu'ils correspondent si elles sont dans un certain nombre de jours de l'autre. Le nombre de jours pour la requête à utiliser est peuplée d'un champ dans une autre table. J'ai essayé d'utiliser datediff () d'abord avec abs () et moins, mais je suis sûr que ça va toujours utiliser des boucles imbriquées. (Il fait quand je l'essaie quand même!)

J'ai essayé de faire tout ce que mentionné dans différents articles renifler des paramètres, mais ils n'a pas changé les choses. Quoi qu'il en soit, je ne suis pas en cours d'exécution comme une procédure stockée. Je devine qu'il ya quelque chose à voir avec un index sur le champ [Date]. )

-- DECLARE @COUNTER INT
-- SET @COUNTER = 1

BEGIN

    SELECT
        x.[line id]
        , y.[line id]

    FROM
        lines1 AS x
        JOIN lines2 AS y ON (

            x.[in date] = y.[in date] + 1 -- + @COUNTER
            AND x.[country] = y.[country]

        )

    WHERE
        x.[country] = 'USA'

END
Était-ce utile?

La solution

La question est: puis-je faire la requête à l'aide de l'utilisation @COUNTER une jointure de hachage au lieu d'une boucle imbriquée

Oui. Vous pouvez utiliser un indicateur de jointure pour forcer ceci:

INNER HASH JOIN
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top