J'ai une table avec toutes nos commandes. Les commandes sont liées à une personne. Et chaque personne est attachée à une entreprise. Maintenant, j'ai besoin d'une liste de toutes les entreprises qui n'ont jamais commandé avant une certaine date. La requête fonctionne bien, mais c'est très lent.Meilleure requête tsql pour savoir qui est un nouveau client (ou une alternative à NOT EXISTS)
C'est ma requête T-SQL:
SELECT
DISTINCT p1.company_id
FROM
order o
JOIN person p1 ON (o.person_id = p1.id AND p1.company_id IS NOT NULL)
WHERE
o.orderDate > '2017-01-01'
AND
o.orderDate < '2017-09-01'
AND NOT EXISTS (SELECT
p2.company_id
FROM
order o2
JOIN person p2 ON (o2.person_id = p2.id AND p2.company_id = p1.company_id)
WHERE
o2.orderDate < '2017-01-01')
Je l'ai déjà changé d'un PAS à PAS EXISTE. Puisque c'était ce que la plupart des gens ici recommandé. N'a pas aidé beaucoup. Un meilleur index a amélioré un peu la situation, mais la requête est toujours lente. Je suppose que c'est parce que pour chaque commande, il doit faire la sous-requête.
C'est le plan d'exécution: https://www.brentozar.com/pastetheplan/?id=SyAlAU3db
Pour des raisons de simplicité j'ai enlevé quelques clauses WHERE dans mon exemple ci-dessus)
La requête est exécutée sur SQL Azure (et SQL Server Express 12 pour le développement)
Quelqu'un a une meilleure idée sur la façon de résoudre ce problème?
questions visant à obtenir l'aide de la performance devraient inclure DDL, DML des tables impliquées avec test de data..if vos données de test est grande, essayez les scripts sur le schéma et les statistiques pour la table ('right click database-> générer des scripts-> sélectionnez des objets de base de données spécifiques-> dans l'écran suivant sélectionnez avancé et choisissez Script statistics)' et collez-le en question..Avec cette info quelqu'un vous reproche le même problème sont confrontés.Autrement, il devient très difficile de répondre à votre question. Version du serveur de présentation aide également – TheGameiswar
Pourriez-vous nous montrer le plan d'exécution actuel son e: https://www.brentozar.com/pastetheplan/ –
@Rammy Un coup plus simple pour vous. Avez-vous essayé EXCEPT déclaration? Il y a deux sous-ensembles similaires, c'est parti. De plus, si la note précédente n'a pas de sens, analysez un plan d'exécution pour 1) indexer 2) les types de colonnes. – hastrb