Bonjour à tous,

Je rencontre un cas actuellement ou j'ai un SELECT dans une fonction qui prends environ 7 secondes par exécution. Le SELECT se fait sur 40000 lignes.

La requete est la 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
19
20
21
22
23
24
25
26
27
28
29
30
31
 
ALTER FUNCTION [dbo].[SDD_PMTINFID] (@lot_id VARCHAR(20))
RETURNS VARCHAR(35) AS
BEGIN
 
  DECLARE @ret_ VARCHAR(35)='';
 
-- Recuperation du compte concerne
SELECT @ret_ = 
				SUBSTRING(
				CASE WHEN 
						SUBSTRING(PAIEMENTX.USERZONE011,1,2) NOT IN ('T/','T|') THEN PAIEMENTX.USERZONE011 
				WHEN 
						(SUBSTRING(PAIEMENTX.USERZONE011,1,2) IN ('T/','T|')) AND (SUBSTRING(PAIEMENTX.USERZONE012,1,2) NOT IN ('T/','T|')) THEN PAIEMENTX.USERZONE012 
				WHEN
						(SUBSTRING(PAIEMENTX.USERZONE011,1,2) IN ('T/','T|')) AND (SUBSTRING(PAIEMENTX.USERZONE012,1,2) IN ('T/','T|')) THEN PAIEMENTX.USERZONE013 
				END,
				CHARINDEX('||',
				CASE WHEN 
						SUBSTRING(PAIEMENTX.USERZONE011,1,2) NOT IN ('T/','T|') THEN PAIEMENTX.USERZONE011 
				WHEN 
						(SUBSTRING(PAIEMENTX.USERZONE011,1,2) IN ('T/','T|')) AND (SUBSTRING(PAIEMENTX.USERZONE012,1,2) NOT IN ('T/','T|')) THEN PAIEMENTX.USERZONE012 
				WHEN 
						(SUBSTRING(PAIEMENTX.USERZONE011,1,2) IN ('T/','T|')) AND (SUBSTRING(PAIEMENTX.USERZONE012,1,2) IN ('T/','T|')) THEN PAIEMENTX.USERZONE013 
				END)+2,16) + 
				PAIEMENTX.PAIEMENTXLOTID 
FROM PAIEMENTX 
WHERE 
	PAIEMENTX.PAIEMENTXLOTID = @lot_id;
  RETURN @ret_;	 
END
Est ce que, selon vous, l'utilisation de la fonction SUBSTRING() dans ma requete peut être à l'origine des problemes de perf que je rencontre ( car 7 s pour un select c'est un peu long je trouve ) .
Le probleme est peut etre ailleurs je ne suis pas expert apres tout.

Merci d'avance pour votre avis et éventuels conseils

Bonne journée,