web-dev-qa-db-fra.com

Type La conversion dans l'expression peut affecter "cardinalitéesttime" - sur une colonne calculée?

J'ai regardé cette question:

Type de conversion dans l'expression peut affecter "cardinalitéestimée" dans le choix du plan de requête?

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

enter image description here

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

enter image description here

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?

3
Marcello Miorelli

J'ai regardé cette question:

Type de conversion dans l'expression peut affecter "cardinalitéestimée" dans le choix du plan de requête?

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 et MAX 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.

5
Paul White 9