web-dev-qa-db-ja.com

選択でこの警告を解決する方法

このクエリに問題があります:

SELECT *
FROM Sales.SalesOrderDetail sod
JOIN Sales.SalesOrderHeader soh
ON sod.SalesOrderID = soh.SalesOrderID--- adventureworks db

enter image description here

警告

式の型変換(CONVERT(nvarchar(23)、[soh]。[SalesOrderID]、0))は、クエリプランの選択で "CardinalityEstimate"に影響する可能性があります

5

本当に修正するものは何もありません。

メッセージはSales.SalesOrderHeaderテーブルの次の計算列を参照しています:

[SalesOrderNumber]  AS (isnull(N'SO'+CONVERT([nvarchar](23),[SalesOrderID]),N'*** ERROR ***')),

このQ&Aで説明されているように、警告はこの場合の情報提供であり、問​​題が問題であった場合に確実に認識できるようにします。 式の型変換は、「CardinalityEstimate」に影響を与える可能性があります-計算列では?

9
Josh Darnell

IMO、その警告はナンセンスであり、警告は狼の泣き声のようになります。

影響が非常に大きくなる可能性のある場合(インデックス側での変換が昔にブログに投稿されたため、インデックスを介したシークのレンダリングを不可能にするなど here )、その警告を確認してください。しかし、あなたがデータを返すだけのとき、誰が気にしますか?

残念ながら、同じことがXE plan_affecting_convertイベントにも当てはまり、IMOも役に立たなくなります。

2
Tibor Karaszi

式の型変換(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が発生することを意味します。カーディナリティの推定に影響します。

データタイプの優先順位

1
KumarHarsh