Table temporaire plus performante que table permanente ?!!
2 réponses
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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!
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.
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" <JeanYves@discussions.microsoft.com> wrote in message
news:71172EF4-BB7E-479D-B836-EDCB07549489@microsoft.com...
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.
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!
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.
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 *************************
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
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
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 *************************