Ostrzeżenie w planie zapytań „Szacunek liczności”

17
create table T(ID int identity primary key)
insert into T default values
insert into T default values

go

select cast(ID as varchar(10)) as ID
from T
where ID = 1

Powyższe zapytanie zawiera ostrzeżenie w planie zapytań.

<Warnings>
  <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" />
</Warnings>

Dlaczego ma ostrzeżenie?

Jak rzutowanie na listę pól może wpłynąć na oszacowanie liczności?

Mikael Eriksson
źródło

Odpowiedzi:

12

To ostrzeżenie było nowe dla SQL Server 2012.

Od nowego ostrzeżenia „Konwersja typu w wyrażeniu .....” w SQL2012, po głośny do praktycznego użycia

Rozumiem, co masz na myśli. Chociaż zgadzam się, że w większości przypadków jest to hałas, naprawienie go ma niski priorytet. Przyjrzymy się temu, jeśli otrzymamy więcej opinii. Na razie zamknąłem to z założenia.

Connect został zabity i nie wygląda na to, że oryginalny problem został przeniesiony do UserVoice. Oto inny problem UserVoice dotyczący tego samego problemu. Konwersja typu może mieć wpływ na CardinalityEstimate - Konwertuj / rzutuj na wybrane kolumny

Udzielę nudnej odpowiedzi, dopóki ktoś nie przyjdzie z lepszą.

Dlaczego ma ostrzeżenie?

Spekulacje z mojej strony.
Istnieje rzutowanie na kolumnę, która jest używana w klauzuli where, dzięki czemu statystyki tej kolumny są interesujące. Zmiana typu danych powoduje, że statystyki nie są dobre, dlatego ostrzegamy o tym, na wypadek, gdyby wartość z listy pól mogła gdzieś zostać użyta.

Jak rzutowanie na listę pól może wpłynąć na oszacowanie liczności?

Nie może, chyba że jest to lista pól w tabeli pochodnej.

Mikael Eriksson
źródło
Do ostatniego zdania dołączam następujące informacje, w przeciwnym razie zapytanie jest definicją widoku, a zapytania będą filtrowane w kolumnie pokazującej ostrzeżenie .
John Eisbrener,