Bonjour,

Je ne trouve pas comment optimiser la requête suivante:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT TOP 50 MSGSEND.*,
			BILLING.PRICE,
			BILLING.CURRENCY,
			BILLING.FLOW,
			BILLING.REVENUESHARE,
			BILLING.ISACTIVE,
			CASE MSGSEND.IDGATEWAY
				WHEN 25 THEN CONVERT(VARCHAR(10), CONVERT(INT, PRICE * 100)) -- South Africa, Mira Gateway
				WHEN 28 THEN CURRENCY + CONVERT(VARCHAR(10), CONVERT(INT, PRICE * 100)) -- IPX CPA gateways
				WHEN 29 THEN CURRENCY + CONVERT(VARCHAR(10), CONVERT(INT, PRICE * 100)) -- IPX BULK gateways
				ELSE CURRENCY + CONVERT(VARCHAR(10), CONVERT(INT, PRICE))
			END AS TARIFF
FROM dbo.SMSSEND MSGSEND
JOIN dbo.SMSBILLING BILLING(nolock) ON BILLING.IDBILLING = MSGSEND.IDBILLING
WHERE IDHANDLESTATUS = 0
AND IDGATEWAY = 4
AND SENDDATETIME < GETDATE()
ORDER BY PRIORITY DESC, SENDDATETIME;
Son plan de requête est le suivant:



La table SMSSEND comporte un index sur sa clé primaire et un autre index IDX_SMSSEND_SENDDATETIME_IDHANDLESTATUS_IDGATEWAY. Actuellement cette requête ramène évidemment 50 lignes, mais le nombre de lignes de la table qui matchent cette requête est 23, la table en contient 7326.
La table SMSBILLING ne comporte seulement un index de clé primaire sur l'IDBILLING.

Elle me fait 46 logical reads sur SMSBILLING et 110 logical reads sur SMSSEND, ce qui est beaucoup trop.

J'ai essayé plusieurs indexes, sans parvenir à obtenir mieux ...

Comment faire ?