私はこの質問を見ました:
式の型変換は、クエリプランの選択で「CardinalityEstimate」に影響を与える可能性がありますか?
しかし、これは照合に関連し、計算列には関連していませんでした。
以下のクエリで使用されている次のテーブル定義があり、クエリヒントが表示されます
式の型変換(CONVERT(varchar(10)、[t]。[FLTCD_FLT_DATE]、112))は、クエリプランの選択で "CardinalityEstimate"に影響する可能性があります
計算された列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
この警告を取り除く方法はありますか?
それは永続化された列ですか、変換はすでに行われていますが、なぜクエリオプティマイザはそれについて正確に進んでいるのですか?
私はこの質問を見ました:
式の型変換は、クエリプランの選択で「CardinalityEstimate」に影響を与える可能性がありますか?
しかし、これは照合に関連し、計算列には関連していませんでした。
同じ問題です。警告は情報であり、カーディナリティの見積もりで気づく可能性のある問題を理解するのに役立ちます。
この警告を取り除く方法はありますか?
それは永続化された列ですか、変換はすでに行われていますが、なぜクエリオプティマイザはそれについて正確に進んでいるのですか?
計算された列が永続化されているからといって、オプティマイザが永続化された値を使用することを選択するわけではありません。 SQL Serverは、コンパイルプロセスの開始時に、計算された列(永続化されているかどうかにかかわらず)を定期的に基になる定義に展開します。後で、式と一致して利用可能な永続計算列に戻る場合とそうでない場合があります。オプティマイザが式を検出すると、プランに警告が追加される場合があります。
この拡張とマッチバックを防ぐ唯一の方法は、適切なバージョンで トレースフラグ176 を有効にすることです。
MIN
列とMAX
列を選択から削除すると、警告は表示されなくなります
この変更により、オプティマイザーはクエリを簡略化して、不要な結合を削除できます。結果はTRIVIAL
プランであり、コストベースの選択がないため、プランの選択に関する警告はありません。