Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Table temporaire plus performante que table permanente ?!!

2 réponses
Avatar
Jean-Yves
Bonjour,

Voici le script de création d'une table temporaire
CREATE TABLE [dbo].[SYS_SELECTED_EXPERIMENT] (
[SES_ID] [int] NOT NULL ,
[CRT_CODE] [char] (1) COLLATE SQL_Latin1_General_CP850_BIN NOT NULL ,
[TRL_ID] [int] NOT NULL ,
[FTR_CODE] [varchar] (3) COLLATE SQL_Latin1_General_CP850_BIN NOT NULL ,
[SLX_MASTER] [bit] NOT NULL ,
[SLX_ORDER_NO] [int] NULL
) ON [PRIMARY]

qui sert de base (partielle) à la requête suivante :
INSERT INTO #EXPERIMENT_VARIABLE
SELECT SLE.CRT_CODE,
TRL.GRS_CODE,
TRL.TRS_CODE,
TRL.TGR_CODE,
TRL.STA_CODE,
TRL.LOC_CODE,
SLE.TRL_ID,
SLE.FTR_CODE,
SLE.SLX_MASTER,
SLE.SLX_ORDER_NO,
PFV.VAR_ID,
VA1.VAR_CODE,
TRL.TRL_DATA_ELIMINATED,
SLV.SLV_ORDER_NO
FROM SYS_SELECTED_EXPERIMENT SLE (NOLOCK)
INNER JOIN TRIAL TRL (NOLOCK) ON TRL.CRT_CODE = SLE.CRT_CODE
AND TRL.TRL_ID = SLE.TRL_ID
INNER JOIN SYS_SELECTED_PARAM_FILE_VARIABLE SLV (NOLOCK) ON
SLV.SES_ID = SLE.SES_ID AND SLV.SLV_ORDER_NO IS NOT NULL
INNER JOIN PARAM_FILE_VARIABLE PFV (NOLOCK) ON PFV.CRT_CODE =
SLV.CRT_CODE AND PFV.PFV_ID = SLV.PFV_ID
INNER JOIN VARIABLE VA1 (NOLOCK) ON VA1.CRT_CODE = PFV.CRT_CODE
AND VA1.VAR_ID = PFV.VAR_ID
WHERE SLE.SES_ID = @SES_ID

Comment est-il possible que ce statement tourne en patate, alors que si je
le fais précéder d'un
SELECT * INTO #SYS_SELECTED_EXPERIMENT FROM SYS_SELECTED_EXPERIMENT
et que je fais taper ma SELECT sur #SYS_SELECTED_EXPERIMENT au lieu de
SYS_SELECTED_EXPERIMENT, c'est bien plus rapide ?

Sachant que la volumétrie sur les tables SYS sont de l'ordre de 30 à 100
lignes et que les autres sont plus proches du million, j'accepte toutes les
pistes !
Merci.

2 réponses

Avatar
Sylvain Lafontaine
Vérifier vos indexes et jetez un coup d'oeil sur les plan d'exécution
générés.

Si les statistisques d'exécution sont très variables d'une fois à l'autre,
ajouter l'option With Recompile à votre procédure stockée. Cette
considération vaut également pour vos plans d'exécution générés; donc
attention!

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"Jean-Yves" wrote in message
news:
Bonjour,

Voici le script de création d'une table temporaire
CREATE TABLE [dbo].[SYS_SELECTED_EXPERIMENT] (
[SES_ID] [int] NOT NULL ,
[CRT_CODE] [char] (1) COLLATE SQL_Latin1_General_CP850_BIN NOT NULL ,
[TRL_ID] [int] NOT NULL ,
[FTR_CODE] [varchar] (3) COLLATE SQL_Latin1_General_CP850_BIN NOT NULL ,
[SLX_MASTER] [bit] NOT NULL ,
[SLX_ORDER_NO] [int] NULL
) ON [PRIMARY]

qui sert de base (partielle) à la requête suivante :
INSERT INTO #EXPERIMENT_VARIABLE
SELECT SLE.CRT_CODE,
TRL.GRS_CODE,
TRL.TRS_CODE,
TRL.TGR_CODE,
TRL.STA_CODE,
TRL.LOC_CODE,
SLE.TRL_ID,
SLE.FTR_CODE,
SLE.SLX_MASTER,
SLE.SLX_ORDER_NO,
PFV.VAR_ID,
VA1.VAR_CODE,
TRL.TRL_DATA_ELIMINATED,
SLV.SLV_ORDER_NO
FROM SYS_SELECTED_EXPERIMENT SLE (NOLOCK)
INNER JOIN TRIAL TRL (NOLOCK) ON TRL.CRT_CODE = SLE.CRT_CODE
AND TRL.TRL_ID = SLE.TRL_ID
INNER JOIN SYS_SELECTED_PARAM_FILE_VARIABLE SLV (NOLOCK) ON
SLV.SES_ID = SLE.SES_ID AND SLV.SLV_ORDER_NO IS NOT NULL
INNER JOIN PARAM_FILE_VARIABLE PFV (NOLOCK) ON PFV.CRT_CODE > SLV.CRT_CODE AND PFV.PFV_ID = SLV.PFV_ID
INNER JOIN VARIABLE VA1 (NOLOCK) ON VA1.CRT_CODE =
PFV.CRT_CODE
AND VA1.VAR_ID = PFV.VAR_ID
WHERE SLE.SES_ID = @SES_ID

Comment est-il possible que ce statement tourne en patate, alors que si je
le fais précéder d'un
SELECT * INTO #SYS_SELECTED_EXPERIMENT FROM SYS_SELECTED_EXPERIMENT
et que je fais taper ma SELECT sur #SYS_SELECTED_EXPERIMENT au lieu de
SYS_SELECTED_EXPERIMENT, c'est bien plus rapide ?

Sachant que la volumétrie sur les tables SYS sont de l'ordre de 30 à 100
lignes et que les autres sont plus proches du million, j'accepte toutes
les
pistes !
Merci.


Avatar
Fred BROUARD
Vos clefs étrangères sont elles indexées ?

MS SQL Server n'indexe pas automatiquement les foreigns keys alors que
visiblement vous filtrez dessus : WHERE SLE.SES_ID = @SES_ID

A +

Jean-Yves a écrit:
Bonjour,

Voici le script de création d'une table temporaire
CREATE TABLE [dbo].[SYS_SELECTED_EXPERIMENT] (
[SES_ID] [int] NOT NULL ,
[CRT_CODE] [char] (1) COLLATE SQL_Latin1_General_CP850_BIN NOT NULL ,
[TRL_ID] [int] NOT NULL ,
[FTR_CODE] [varchar] (3) COLLATE SQL_Latin1_General_CP850_BIN NOT NULL ,
[SLX_MASTER] [bit] NOT NULL ,
[SLX_ORDER_NO] [int] NULL
) ON [PRIMARY]

qui sert de base (partielle) à la requête suivante :
INSERT INTO #EXPERIMENT_VARIABLE
SELECT SLE.CRT_CODE,
TRL.GRS_CODE,
TRL.TRS_CODE,
TRL.TGR_CODE,
TRL.STA_CODE,
TRL.LOC_CODE,
SLE.TRL_ID,
SLE.FTR_CODE,
SLE.SLX_MASTER,
SLE.SLX_ORDER_NO,
PFV.VAR_ID,
VA1.VAR_CODE,
TRL.TRL_DATA_ELIMINATED,
SLV.SLV_ORDER_NO
FROM SYS_SELECTED_EXPERIMENT SLE (NOLOCK)
INNER JOIN TRIAL TRL (NOLOCK) ON TRL.CRT_CODE = SLE.CRT_CODE
AND TRL.TRL_ID = SLE.TRL_ID
INNER JOIN SYS_SELECTED_PARAM_FILE_VARIABLE SLV (NOLOCK) ON
SLV.SES_ID = SLE.SES_ID AND SLV.SLV_ORDER_NO IS NOT NULL
INNER JOIN PARAM_FILE_VARIABLE PFV (NOLOCK) ON PFV.CRT_CODE =
SLV.CRT_CODE AND PFV.PFV_ID = SLV.PFV_ID
INNER JOIN VARIABLE VA1 (NOLOCK) ON VA1.CRT_CODE = PFV.CRT_CODE
AND VA1.VAR_ID = PFV.VAR_ID
WHERE SLE.SES_ID = @SES_ID

Comment est-il possible que ce statement tourne en patate, alors que si je
le fais précéder d'un
SELECT * INTO #SYS_SELECTED_EXPERIMENT FROM SYS_SELECTED_EXPERIMENT
et que je fais taper ma SELECT sur #SYS_SELECTED_EXPERIMENT au lieu de
SYS_SELECTED_EXPERIMENT, c'est bien plus rapide ?

Sachant que la volumétrie sur les tables SYS sont de l'ordre de 30 à 100
lignes et que les autres sont plus proches du million, j'accepte toutes les
pistes !
Merci.



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************