J'ai regardé cette question:
Mais c'était lié à la collation et non aux colonnes calculées.
J'ai les définitions de table suivantes utilisées dans une requête ci-dessous qui me donne un indice de requête
Type de conversion dans l'expression (Convert (Varchar (10), [T]. [FLTCD_FLT_Date], 112)) peut affecter "cardinalitéestimée" dans le choix de plan de requête
Veuillez noter la colonne calculée flightReference
CREATE TABLE [dbo].[repl_Transportation] (
[FLIGHT#] INT NOT NULL,
[FLTCD_FLT_DATE] DATETIME NULL,
[FLTCD_DEP_GATE] CHAR(3) NULL,
[FLTCD_ARR_GATE] CHAR(3) NULL,
[FLTCD_SEQUENCE] CHAR(1) NULL,
[DIRECTION] CHAR(1) NULL,
[PNR_NUMBERS] VARCHAR(70) NULL,
[HK] NUMERIC(3,0) NULL,
[Create_Date] DATETIME NOT NULL,
[Modify_Date] DATETIME NULL,
[flightReference] AS (substring(((CONVERT([varchar](10),[FLTCD_FLT_DATE],
(112))+[FLTCD_DEP_GATE])+[FLTCD_ARR_GATE])+[FLTCD_SEQUENCE],(3),(13))) PERSISTED,
CONSTRAINT [PK_FLIGHT#] PRIMARY KEY CLUSTERED ([FLIGHT#] asc))
IF OBJECT_ID('[dbo].[repl_Transportation_Details]') IS NOT NULL
DROP TABLE [dbo].[repl_Transportation_Details]
GO
CREATE TABLE [dbo].[repl_Transportation_Details] (
[FLT_LEG_ID] INT NOT NULL,
[FLIGHT#] INT NOT NULL,
[LEG_NO] TINYINT NULL,
[AIRLINE_CODE] CHAR(2) NULL,
[AIRLINE_FLTNO] VARCHAR(6) NULL,
[DEP_DATE_TIME] DATETIME NULL,
[ARR_DATE_TIME] DATETIME NULL,
[DEP_AIRPORT] CHAR(3) NULL,
[ARR_AIRPORT] CHAR(3) NULL,
[Create_Date] DATETIME NULL,
[Modify_Date] DATETIME NULL,
CONSTRAINT [PK_FLT_LEG_ID] PRIMARY KEY CLUSTERED ([FLT_LEG_ID] asc))
Lorsque j'exécute la requête suivante, je reçois un avertissement sur la sélection: Le plan de requête est ici
Type de conversion dans l'expression (Convert (Varchar (10), [T]. [FLTCD_FLT_Date], 112)) peut affecter "cardinalitéestimée" dans le choix de plan de requête
SELECT t.FLIGHT#,
t.flightReference,
PNR_NUMBERS,
MIN(td.DEP_DATE_TIME) AS departDate,
MAX(td.ARR_DATE_TIME) AS arrivalDate,
CASE WHEN
PNR_NUMBERS IS NULL OR PNR_NUMBERS = ''
THEN 'Paper Ticket'
ELSE 'E-Ticket'
END AS ticketType,
'US' AS source,
0 as sourceId,
DIRECTION,
FLTCD_DEP_GATE,
FLTCD_ARR_GATE
FROM repl_Transportation AS t
LEFT JOIN repl_Transportation_Details AS td ON td.FLIGHT# = t.FLIGHT#
GROUP BY t.FLIGHT#,
t.flightReference,
PNR_NUMBERS,
DIRECTION,
FLTCD_DEP_GATE,
FLTCD_ARR_GATE
Lorsque je retire les colonnes min et max de la sélection, il n'y a plus d'avertissements, le plan de requête est ici
SELECT t.FLIGHT#,
t.flightReference,
PNR_NUMBERS,
--MIN(td.DEP_DATE_TIME) AS departDate,
--MAX(td.ARR_DATE_TIME) AS arrivalDate,
CASE WHEN
PNR_NUMBERS IS NULL OR PNR_NUMBERS = ''
THEN 'Paper Ticket'
ELSE 'E-Ticket'
END AS ticketType,
'US' AS source,
0 as sourceId,
DIRECTION,
FLTCD_DEP_GATE,
FLTCD_ARR_GATE
FROM repl_Transportation AS t
LEFT JOIN repl_Transportation_Details AS td ON td.FLIGHT# = t.FLIGHT#
GROUP BY t.FLIGHT#,
t.flightReference,
PNR_NUMBERS,
DIRECTION,
FLTCD_DEP_GATE,
FLTCD_ARR_GATE
Y a-t-il un moyen de vous débarrasser de cet avertissement?
Est-ce une colonne persistée, la conversion a déjà été faite, pourquoi l'optimiseur de la requête se passe-t-elle exactement?
J'ai regardé cette question:
Mais c'était lié à la collation et non aux colonnes calculées.
C'est le même problème. L'avertissement est informatif, pour vous aider à comprendre les problèmes que vous pourriez remarquer avec une estimation de cardinalité.
Y a-t-il un moyen de vous débarrasser de cet avertissement?
Est-ce une colonne persistée, la conversion a déjà été faite, pourquoi l'optimiseur de la requête se passe-t-elle exactement?
Ce n'est pas parce que la colonne calculée est persistée, cela ne signifie pas que l'optimiseur choisira d'utiliser la valeur persistante. SQL Server élargit régulièrement des colonnes calculées (persistées ou non) dans la définition sous-jacente au début du processus de compilation. Plus tard, il peut, ou peut ne pas correspondre aux expressions des colonnes calculées disponibles. Lorsque l'optimiseur rencontre l'expression, il peut ajouter un avertissement au plan.
Le seul moyen d'empêcher cette expansion et cette correspondance est d'activer drapeau de trace 176 sur des versions appropriées.
Lorsque je supprimai les colonnes
MIN
etMAX
de la sélection, il n'y a plus d'avertissement
Avec ce changement, l'optimiseur est capable de simplifier la requête pour supprimer la jointure inutile. Le résultat est un plan TRIVIAL
, sans choix à la fois basés sur des coûts, il n'y a donc aucun avertissement sur les choix de plan.