J'ai une déclaration union dans la requête qui doit être éliminée comme sa performance touchée en raison des millions d'enregistrements trouvés dans des tables ci-dessous.
Comment puis-je atteindre l'utilisation de la join gauche afin que les performances ne soient pas compromises? p>
La différence entre 2 instructions Sélectionnez voici que lorsque m.Id 0 code> alors U.userid code> est utilisé dans 1st Sélectionnez l'instruction CODE> et lorsque m.Id = 0 code> code> '' code> est renvoyé dans 2e Sélectionnez CODE> Éclation car je n'utilise pas l'utilisateur code> de table. J'utilise SQL Server 2016 P> Select
U.UserId, A.ActivityPlace
From
UserTable U
Inner Join
MasterTable M ON M.Id = U.UserId
Inner Join
ActivityTable A ON A.ActivityID = M.UserId
Where
M.Id <> 0
Union
Select
'', A.ActivityPlace
From
MasterTable M
Inner Join
ActivityTable A ON A.ActivityID = M.UserId
Where
M.Id = 0
5 Réponses :
Vous pouvez essayer de déplacer la condition dans l'expression code> code>. puisque vous n'avez pas montré comment les tables sont liées, elle peut ou ne pas produire résultat correct. Il est difficile de dire sans savoir comment les tables sont liées. P> p>
: J'ai déjà montré la relation entre la table à l'aide d'une jointure intérieure. Quelles informations d'autre nécessaires. Fais-moi savoir
@nagaraja, il serait bien de connaître le type de relations: 1: 1, 1: M, 1: 0 ou 1; Quels champs sont uniques. Faites-le pour chaque sur la clause code> dans votre requête. Par exemple, m.id = u.userid code> - m.Id code> est unique, u.userid code> est unique, pour chaque m .Id code> Il peut y avoir au plus 1 rangée u.userid code> ou aucune lignes, c'est-à-dire que la relation est 1: 0 ou 1.
Dans cette première requête, vous obtenez UserID, dans Secon Requête, vous ne recevrez pas d'utilisateur. Par conséquent, cet ensemble de résultat est unique. Donc, vous pouvez utiliser un syndicat tout.
Select U.UserId, A.ActivityPlace From UserTable U Inner Join MasterTable M ON M.Id=U.UserId Inner Join ActivityTable A ON A.ActivityID=M.UserId Where M.Id<>0 Union all Select '', A.ActivityPlace From MasterTable M Inner Join ActivityTable A ON A.ActivityID=M.UserId Where M.Id=0
Je ne sais pas qui a évité cela, mais c'était ma première pensée: l'Union de la requête originale pourrait être lente car une syndicale implique la nécessité de trier et de dédupliquer les résultats, qui, avec un ensemble de résultats importants, pourrait facilement être ce qui ralentit la requête. Un syndicat n'a pas besoin de trier un résultat potentiellement massif défini sur Duplicate. (Bien sûr, la vraie réponse ici est "Regardez le plan de requête et découvrez ce qui prend le temps" ...)
Je pense que vous pouvez faire ci-dessous
Select U.UserId, A.ActivityPlace From UserTable U Inner Join MasterTable M ON (M.Id = U.UserId or M.Id = 0) Inner Join ActivityTable A ON A.ActivityID = M.UserId
Je pense que je recommanderais:
Select m.Id as UserId, A.ActivityPlace
From MasterTable M left join
UserTable U
on M.Id = U.UserId left join
ActivityTable A
on A.ActivityID = M.UserId;
Union code> n'élimine pas réellement les doublons. LI>
-
null code> est un remplacement raisonnable pour '' code>. li>
- Tous sauf
0 code> ID utilisateur correspondent à li>
ul> alors il devrait faire ce que vous voulez. En fait, pour la troisième condition, vous pouvez ajouter: p> xxx pré> en fait, je suppose que le traitement spécial pour m.Id = 0 code> est simplement parce que Il n'y a pas d'utilisateur. Dans ce cas, vous voulez juste Joindre de gauche CODE> S: P> where m.id = 0 or u.userid is not null
J'ai une déclaration syndicale dans la requête qui doit éliminer comme son Performance frappé à cause des millions d'enregistrements trouvés ci-dessous Tables. P>
Comment puis-je atteindre l'utilisation de la join gauche afin que la performance ne soit pas compromis? p> blockQuote>
Malheureusement, vous n'avez fourni aucun Informations utiles EM>, à côté du fait que vous avez des millions d'enregistrements dans certaines tables. P>
Voici quelque chose qui nous aurait aidé à reproduire votre problème et à déterminer une solution possible: p>
- Postage de la structure complète des tables, y compris les index li>
- montrant quelques échantillons de données li>
- Afficher un exemple indiquant les résultats attendus li> ul>
La réponse évidente est la suivante: vérifiez le plan d'exécution fort> et si vous ne le comprenez pas, postez-le avec les informations mentionnées ci-dessus. P>
J'ai peur que les réponses que vous obteniez sont spéculatives. Malgré les meilleurs efforts des participants, rien ne garantit que l'une de ces réponses traitera de votre problème de performance de manière adéquate forte>. Il n'y a tout simplement pas assez d'informations. P>
Les réponses que vous avez sont bien racontées: p>
- "Vous pouvez essayer de déplacer la condition dans l'expression de cas" li>
- "Je pense que je recommanderais" li>
- "Je pense que vous pouvez faire ci-dessous" li> ul>
Ne blâmez pas les membres, vous n'avez pas donné suffisamment de détails utiles pour tout ce qu'ils peuvent faire est
devinez fort>. p> Un astuce De toute façon: Vérifiez vos index
forts>, en particulier sur les champs Joindre Strong> ED ensemble. Étant donné que vous utilisez SQL Server, vous pouvez consulter ce guide, par exemple: Assurez-vous que toutes les colonnes de jointure sont indexées . Ce conseil est également valable pour d'autres dbses relationnels, bien que chacun ait sa propre optimisation de la requête et ses particularités. P> Je suis en fait surpris que personne ne vous a posé sur vos indices
forts>. Très souvent, il est en effet possible de réécrire une instruction SQL existante d'une manière qui le rend plus performant. Mais vous devez aller à la racine du problème et considérer également les couches inférieures, c'est-à-dire les données. P> En termes simplifiés, si vous n'avez pas d'index et que vous n'interrisez aucun conseil de cache ou d'optimisation, le moteur de base de données doit faire une analyse de la table
forte> pour obtenir les résultats. Si vous avez beaucoup d'enregistrements, cela prend évidemment du temps. Si vous vous joignez à des tables, la charge augmente encore. La solution: une bonne structure de table, un modèle de données sonore et des index appropriés. P> Un index n'est pas une balle magique cependant, si vous avez une mauvaise structure de table, il ne sera pas aussi efficace que cela devrait être. P>
Si cela ne vous aide toujours pas, je vous suggère que vous ajoutez plus de détails ou postez la question plus tard avec tous les détails pertinents. Comme une ligne directrice: Comment puis-je poser une bonne question? P>