このクエリに問題があります:
SELECT *
FROM Sales.SalesOrderDetail sod
JOIN Sales.SalesOrderHeader soh
ON sod.SalesOrderID = soh.SalesOrderID--- adventureworks db
警告
式の型変換(CONVERT(nvarchar(23)、[soh]。[SalesOrderID]、0))は、クエリプランの選択で "CardinalityEstimate"に影響する可能性があります
本当に修正するものは何もありません。
メッセージはSales.SalesOrderHeader
テーブルの次の計算列を参照しています:
[SalesOrderNumber] AS (isnull(N'SO'+CONVERT([nvarchar](23),[SalesOrderID]),N'*** ERROR ***')),
このQ&Aで説明されているように、警告はこの場合の情報提供であり、問題が問題であった場合に確実に認識できるようにします。 式の型変換は、「CardinalityEstimate」に影響を与える可能性があります-計算列では?
IMO、その警告はナンセンスであり、警告は狼の泣き声のようになります。
影響が非常に大きくなる可能性のある場合(インデックス側での変換が昔にブログに投稿されたため、インデックスを介したシークのレンダリングを不可能にするなど here )、その警告を確認してください。しかし、あなたがデータを返すだけのとき、誰が気にしますか?
残念ながら、同じことがXE plan_affecting_convertイベントにも当てはまり、IMOも役に立たなくなります。
式の型変換(CONVERT(nvarchar(23)、[soh]。[SalesOrderID]、0))は、クエリプランの選択で "CardinalityEstimate"に影響する可能性があります
あなたはこの警告メッセージに気づいていないので、この警告メッセージが重要である他の例を指摘することが重要です。
2つの結合条件の間にデータ型の不一致がある場合、このエラーも発生します。このような場合、パフォーマンスに大きく影響します。
したがって、データ型を同様にします。
CREATE TABLE myTable (ID INT, Col VARCHAR(100))
GO
INSERT INTO myTable (ID, Col)
SELECT 1, 'X'
UNION ALL
SELECT 2, 'Y'
UNION ALL
SELECT 3, 'Z'
GO
GO
--Check the execution Plan
SELECT *
FROM myTable
WHERE ID = N'1' AND Col = N'X'
GO
ここでN'1 '(NVarchar)はintに変換されます。
NVarcharの優先順位はINTよりも低くなっています。優先順位の低いデータタイプは、優先順位の高いデータタイプに変換されます。
したがって、数百万の行が関係し、同じ警告が表示される場合、結果セットの各行に対してCONVERTが発生することを意味します。カーディナリティの推定に影響します。