J'ai des contacts qui peuvent appartenir à plusieurs groupes et avoir plusieurs requêtes. Je dois simplement obtenir des contacts pour un groupe spécifique qui n'a pas de demandes spécifiques.Sql Server query perfomance
Comment améliorer les performances de cette requête:
SELECT top 1 con_name ,
con_id
FROM tbl_group_to_contact gc
INNER JOIN tbl_contact c ON gc.con_id = c.id
WHERE group_id = '81'
AND NOT c.id IN (SELECT con_id
FROM tbl_request_to_contact
WHERE request_id = '124')
Quand je lance cette requête avec plan Explication il montre que cette requête:
SELECT con_id
FROM tbl_request_to_contact
WHERE request_id = '124'
est cher à l'utilisation d'un index cherchent.
|--Top(TOP EXPRESSION:((1)))
|--Nested Loops(Left Anti Semi Join, OUTER REFERENCES:([c].[id]))
|--Nested Loops(Inner Join, OUTER REFERENCES:([gc].[con_id], [Expr1006]) WITH UNORDERED PREFETCH)
| |--Clustered Index Scan(OBJECT:([db_newsletter].[dbo].[tbl_group_to_contact].[PK_tbl_group_to_contact_1] AS [gc]), WHERE:([db_newsletter].[dbo].[tbl_group_to_contact].[group_id] as [gc].[group_id]=(81)) ORDERED FORWARD)
| |--Clustered Index Seek(OBJECT:([db_newsletter].[dbo].[tbl_contact].[PK_tbl_contact] AS [c]), SEEK:([c].[id]=[db_newsletter].[dbo].[tbl_group_to_contact].[con_id] as [gc].[con_id]) ORDERED FORWARD)
|--Top(TOP EXPRESSION:((1)))
|--Clustered Index Seek(OBJECT:([db_newsletter].[dbo].[tbl_request_to_contact].[PK_tbl_request_to_contact] AS [cc]), SEEK:([cc].[request_id]=(124)), WHERE:([db_newsletter].[dbo].[tbl_contact].[id] as [c].[id]=[db_newsletter].[dbo].[tbl_request_to_contact].[con_id] as [cc].[con_id]) ORDERED FORWARD)
peut pas le faire hors le brassard, mais vous vous trouverez peut-être pouvez supprimer le sous-sélection et utiliser une jointure externe sur 'tbl_request_to_contact' combinée avec une clause' GROUP BY' et le qualificatif 'HAVING' de (par exemple, 'HAVING COUNT (request_id) = 0') peut aider. –
Dans 'SQL Server',' LEFT JOIN' est pire que 'IN', sans parler de' GROUP BY/HAVING' (qui peut facilement être remplacé par 'IS NULL' dans la clause 'WHERE'). – Quassnoi
À quoi sert le request_id = '124'? Les autres identifiants de requête n'ont pas d'importance? – Brettski