web-dev-qa-db-ja.com

式の型変換は「CardinalityEstimate」に影響を与える可能性があります-計算された列で?

私はこの質問を見ました:

式の型変換は、クエリプランの選択で「CardinalityEstimate」に影響を与える可能性がありますか?

しかし、これは照合に関連し、計算列には関連していませんでした。

以下のクエリで使用されている次のテーブル定義があり、クエリヒントが表示されます

式の型変換(CONVERT(varchar(10)、[t]。[FLTCD_FLT_DATE]、112))は、クエリプランの選択で "CardinalityEstimate"に影響する可能性があります

enter image description here

計算された列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))

次のクエリを実行すると、selectに対して警告が表示されます。 クエリプランはここにあります

式の型変換(CONVERT(varchar(10)、[t]。[FLTCD_FLT_DATE]、112))は、クエリプランの選択で "CardinalityEstimate"に影響する可能性があります

    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

MIN列とMAX列を選択から削除すると、警告は表示されなくなります クエリプランはこちら

    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

この警告を取り除く方法はありますか?

それは永続化された列ですか、変換はすでに行われていますが、なぜクエリオプティマイザはそれについて正確に進んでいるのですか?

3

私はこの質問を見ました:

式の型変換は、クエリプランの選択で「CardinalityEstimate」に影響を与える可能性がありますか?

しかし、これは照合に関連し、計算列には関連していませんでした。

同じ問題です。警告は情報であり、カーディナリティの見積もりで気づく可能性のある問題を理解するのに役立ちます。

この警告を取り除く方法はありますか?

それは永続化された列ですか、変換はすでに行われていますが、なぜクエリオプティマイザはそれについて正確に進んでいるのですか?

計算された列が永続化されているからといって、オプティマイザが永続化された値を使用することを選択するわけではありません。 SQL Serverは、コンパイルプロセスの開始時に、計算​​された列(永続化されているかどうかにかかわらず)を定期的に基になる定義に展開します。後で、式と一致して利用可能な永続計算列に戻る場合とそうでない場合があります。オプティマイザが式を検出すると、プランに警告が追加される場合があります。

この拡張とマッチバックを防ぐ唯一の方法は、適切なバージョンで トレースフラグ176 を有効にすることです。

MIN列とMAX列を選択から削除すると、警告は表示されなくなります

この変更により、オプティマイザーはクエリを簡略化して、不要な結合を削除できます。結果はTRIVIALプランであり、コストベースの選択がないため、プランの選択に関する警告はありません。

5
Paul White 9