Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Предупреждение на select -e  [new]
Алексей
Member

Откуда: Москва
Сообщений: 361
Всем добрый день

запустил на Microsoft-овской базе AdventureWorks простенький запрос

SELECT [AdventureWorks].[Sales].[SalesOrderDetail].[SalesOrderID],
[AdventureWorks].[Sales].[SalesOrderDetail].[LineTotal]
  FROM [AdventureWorks].[Sales].[SalesOrderDetail]
  JOIN AdventureWorks.Sales.SalesOrderHeader ON [AdventureWorks].[Sales].[SalesOrderDetail].SalesOrderID=
  AdventureWorks.Sales.SalesOrderHeader.SalesOrderID 
  Where SalesOrderNumber ='SO43659' /*можно и без фильтра- результат тот же*/


Получил Warning на плане выполнения запроса (на картинке)

Вопрос: от чего это получилось, и на что это влияет?
Заранее спасибо

XML план выполнения
+

<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.2" Build="12.0.4237.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
  <BatchSequence>
    <Batch>
      <Statements>
        <StmtSimple StatementCompId="1" StatementEstRows="3.85562" StatementId="1" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" CardinalityEstimationModelVersion="70" StatementSubTreeCost="0.00658633" StatementText="SELECT [AdventureWorks].[Sales].[SalesOrderDetail].[SalesOrderID],&#xD;&#xA;[AdventureWorks].[Sales].[SalesOrderDetail].[LineTotal]&#xD;&#xA;  FROM [AdventureWorks].[Sales].[SalesOrderDetail]&#xD;&#xA;  JOIN AdventureWorks.Sales.SalesOrderHeader ON [AdventureWorks].[Sales].[SalesOrderDetail].SalesOrderID=&#xD;&#xA;  AdventureWorks.Sales.SalesOrderHeader.SalesOrderID &#xD;&#xA;  Where SalesOrderNumber ='SO43659'" StatementType="SELECT" QueryHash="0x1EAD6D1D1C7A6247" QueryPlanHash="0xC31BBE691FBBBC7B" RetrievedFromCache="true">
          <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" />
          <QueryPlan DegreeOfParallelism="1" CachedPlanSize="32" CompileTime="2" CompileCPU="2" CompileMemory="480">
            <Warnings>
              <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(nvarchar(23),[AdventureWorks].[Sales].[SalesOrderHeader].[SalesOrderID],0)" />
            </Warnings>
            <MemoryGrantInfo SerialRequiredMemory="0" SerialDesiredMemory="0" />
            <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="412761" EstimatedPagesCached="51595" EstimatedAvailableDegreeOfParallelism="2" />
            <RelOp AvgRowSize="28" EstimateCPU="3.85562E-07" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="3.85562" LogicalOp="Compute Scalar" NodeId="0" Parallel="false" PhysicalOp="Compute Scalar" EstimatedTotalSubtreeCost="0.00658633">
              <OutputList>
                <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="SalesOrderID" />
                <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="LineTotal" ComputedColumn="true" />
              </OutputList>
              <ComputeScalar>
                <DefinedValues>
                  <DefinedValue>
                    <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="LineTotal" ComputedColumn="true" />
                    <ScalarOperator ScalarString="[AdventureWorks].[Sales].[SalesOrderDetail].[LineTotal]">
                      <Identifier>
                        <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="LineTotal" ComputedColumn="true" />
                      </Identifier>
                    </ScalarOperator>
                  </DefinedValue>
                </DefinedValues>
                <RelOp AvgRowSize="28" EstimateCPU="1.61165E-05" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="3.85562" LogicalOp="Inner Join" NodeId="1" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.00658594">
                  <OutputList>
                    <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="SalesOrderID" />
                    <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="LineTotal" ComputedColumn="true" />
                  </OutputList>
                  <RunTimeInformation>
                    <RunTimeCountersPerThread Thread="0" ActualRows="12" ActualEndOfScans="1" ActualExecutions="1" />
                  </RunTimeInformation>
                  <NestedLoops Optimized="false">
                    <OuterReferences>
                      <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderHeader]" Column="SalesOrderID" />
                    </OuterReferences>
                    <RelOp AvgRowSize="11" EstimateCPU="0.0001581" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Index Seek" NodeId="3" Parallel="false" PhysicalOp="Index Seek" EstimatedTotalSubtreeCost="0.0032831" TableCardinality="31465">
                      <OutputList>
                        <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderHeader]" Column="SalesOrderID" />
                      </OutputList>
                      <RunTimeInformation>
                        <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
                      </RunTimeInformation>
                      <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">
                        <DefinedValues>
                          <DefinedValue>
                            <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderHeader]" Column="SalesOrderID" />
                          </DefinedValue>
                        </DefinedValues>
                        <Object Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderHeader]" Index="[AK_SalesOrderHeader_SalesOrderNumber]" IndexKind="NonClustered" Storage="RowStore" />
                        <SeekPredicates>
                          <SeekPredicateNew>
                            <SeekKeys>
                              <Prefix ScanType="EQ">
                                <RangeColumns>
                                  <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderHeader]" Column="SalesOrderNumber" ComputedColumn="true" />
                                </RangeColumns>
                                <RangeExpressions>
                                  <ScalarOperator ScalarString="N'SO43659'">
                                    <Const ConstValue="N'SO43659'" />
                                  </ScalarOperator>
                                </RangeExpressions>
                              </Prefix>
                            </SeekKeys>
                          </SeekPredicateNew>
                        </SeekPredicates>
                      </IndexScan>
                    </RelOp>
                    <RelOp AvgRowSize="28" EstimateCPU="3.85562E-07" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="3.85562" LogicalOp="Compute Scalar" NodeId="5" Parallel="false" PhysicalOp="Compute Scalar" EstimatedTotalSubtreeCost="0.00328663">
                      <OutputList>
                        <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="SalesOrderID" />
                        <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="LineTotal" ComputedColumn="true" />
                      </OutputList>
                      <ComputeScalar>
                        <DefinedValues>
                          <DefinedValue>
                            <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="LineTotal" ComputedColumn="true" />
                            <ScalarOperator ScalarString="isnull(CONVERT_IMPLICIT(numeric(19,4),[AdventureWorks].[Sales].[SalesOrderDetail].[UnitPrice],0)*((1.0)-CONVERT_IMPLICIT(numeric(19,4),[AdventureWorks].[Sales].[SalesOrderDetail].[UnitPriceDiscount],0))*CONVERT_IMPLICIT(numeric(5,0),[AdventureWorks].[Sales].[SalesOrderDetail].[OrderQty],0),(0.000000))">
                              <Intrinsic FunctionName="isnull">
                                <ScalarOperator>
                                  <Arithmetic Operation="MULT">
                                    <ScalarOperator>
                                      <Arithmetic Operation="MULT">
                                        <ScalarOperator>
                                          <Convert DataType="numeric" Precision="19" Scale="4" Style="0" Implicit="true">
                                            <ScalarOperator>
                                              <Identifier>
                                                <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="UnitPrice" />
                                              </Identifier>
                                            </ScalarOperator>
                                          </Convert>
                                        </ScalarOperator>
                                        <ScalarOperator>
                                          <Arithmetic Operation="SUB">
                                            <ScalarOperator>
                                              <Const ConstValue="(1.0)" />
                                            </ScalarOperator>
                                            <ScalarOperator>
                                              <Convert DataType="numeric" Precision="19" Scale="4" Style="0" Implicit="true">
                                                <ScalarOperator>
                                                  <Identifier>
                                                    <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="UnitPriceDiscount" />
                                                  </Identifier>
                                                </ScalarOperator>
                                              </Convert>
                                            </ScalarOperator>
                                          </Arithmetic>
                                        </ScalarOperator>
                                      </Arithmetic>
                                    </ScalarOperator>
                                    <ScalarOperator>
                                      <Convert DataType="numeric" Precision="5" Scale="0" Style="0" Implicit="true">
                                        <ScalarOperator>
                                          <Identifier>
                                            <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="OrderQty" />
                                          </Identifier>
                                        </ScalarOperator>
                                      </Convert>
                                    </ScalarOperator>
                                  </Arithmetic>
                                </ScalarOperator>
                                <ScalarOperator>
                                  <Const ConstValue="(0.000000)" />
                                </ScalarOperator>
                              </Intrinsic>
                            </ScalarOperator>
                          </DefinedValue>
                        </DefinedValues>
                        <RelOp AvgRowSize="29" EstimateCPU="0.000161241" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="3.85562" LogicalOp="Clustered Index Seek" NodeId="6" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="0.00328624" TableCardinality="121317">
                          <OutputList>
                            <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="SalesOrderID" />
                            <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="OrderQty" />
                            <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="UnitPrice" />
                            <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="UnitPriceDiscount" />
                          </OutputList>
                          <RunTimeInformation>
                            <RunTimeCountersPerThread Thread="0" ActualRows="12" ActualEndOfScans="1" ActualExecutions="1" />
                          </RunTimeInformation>
                          <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">
                            <DefinedValues>
                              <DefinedValue>
                                <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="SalesOrderID" />
                              </DefinedValue>
                              <DefinedValue>
                                <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="OrderQty" />
                              </DefinedValue>
                              <DefinedValue>
                                <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="UnitPrice" />
                              </DefinedValue>
                              <DefinedValue>
                                <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="UnitPriceDiscount" />
                              </DefinedValue>
                            </DefinedValues>
                            <Object Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Index="[PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID]" IndexKind="Clustered" Storage="RowStore" />
                            <SeekPredicates>
                              <SeekPredicateNew>
                                <SeekKeys>
                                  <Prefix ScanType="EQ">
                                    <RangeColumns>
                                      <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="SalesOrderID" />
                                    </RangeColumns>
                                    <RangeExpressions>
                                      <ScalarOperator ScalarString="[AdventureWorks].[Sales].[SalesOrderHeader].[SalesOrderID]">
                                        <Identifier>
                                          <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderHeader]" Column="SalesOrderID" />
                                        </Identifier>
                                      </ScalarOperator>
                                    </RangeExpressions>
                                  </Prefix>
                                </SeekKeys>
                              </SeekPredicateNew>
                            </SeekPredicates>
                          </IndexScan>
                        </RelOp>
                      </ComputeScalar>
                    </RelOp>
                  </NestedLoops>
                </RelOp>
              </ComputeScalar>
            </RelOp>
          </QueryPlan>
        </StmtSimple>
      </Statements>
    </Batch>
  </BatchSequence>
</ShowPlanXML>



К сообщению приложен файл. Размер - 131Kb


Сообщение было отредактировано: 3 ноя 17, 13:31
3 ноя 17, 12:04    [20924367]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
Алексей
Member

Откуда: Москва
Сообщений: 361
Версия сервера Microsoft SQL Server 2014 (SP1-GDR) (KB4019091) - 12.0.4237.0 (X64)
Jul 5 2017 22:03:42
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
3 ноя 17, 12:05    [20924373]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Алексей,

типы колонок SalesOrderID на таблицах SalesOrderHeader и SalesOrderDetail разные
3 ноя 17, 12:20    [20924440]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
Алексей
Member

Откуда: Москва
Сообщений: 361
felix_ff,

CREATE TABLE [Sales].[SalesOrderHeader](
[SalesOrderID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL

CREATE TABLE [Sales].[SalesOrderDetail](
[SalesOrderID] [int] NOT NULL,

Вроде нет, или я каких то тонкостей не учитываю?
3 ноя 17, 13:00    [20924608]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4535
Алексей,
            <Warnings>
              <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(nvarchar(23),[AdventureWorks].[Sales].[SalesOrderHeader].[SalesOrderID],0)" />
            </Warnings>
3 ноя 17, 13:02    [20924615]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Алексей,

LineTotal это случаем не вычисляемый столбец?
3 ноя 17, 13:06    [20924631]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4535
felix_ff, как-то так
3 ноя 17, 13:07    [20924636]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
или SalesOrderNumber

посмотрите дефинишн обоих таблиц.
3 ноя 17, 13:09    [20924648]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
msLex
Member

Откуда:
Сообщений: 7729
buser
Алексей,
            <Warnings>
              <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(nvarchar(23),[AdventureWorks].[Sales].[SalesOrderHeader].[SalesOrderID],0)" />
            </Warnings>

Это Warning, в плане никакого конверта нет.



<SeekPredicates>
                              <SeekPredicateNew>
                                <SeekKeys>
                                  <Prefix ScanType="EQ">
                                    <RangeColumns>
                                      <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderDetail]" Column="SalesOrderID" />
                                    </RangeColumns>
                                    <RangeExpressions>
                                      <ScalarOperator ScalarString="[AdventureWorks].[Sales].[SalesOrderHeader].[SalesOrderID]">
                                        <Identifier>
                                          <ColumnReference Database="[AdventureWorks]" Schema="[Sales]" Table="[SalesOrderHeader]" Column="SalesOrderID" />
                                        </Identifier>
                                      </ScalarOperator>
                                    </RangeExpressions>
                                  </Prefix>
                                </SeekKeys>
                              </SeekPredicateNew>
                            </SeekPredicates>


Алексей,

select @@version покажит
3 ноя 17, 13:10    [20924654]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
buser,

опередил :)
3 ноя 17, 13:10    [20924656]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
Алексей
Member

Откуда: Москва
Сообщений: 361
felix_ff,
Версия сервера Microsoft SQL Server 2014 (SP1-GDR) (KB4019091) - 12.0.4237.0 (X64)
Jul 5 2017 22:03:42
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
3 ноя 17, 13:12    [20924666]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
msLex
select @@version покажит

12.0.4237.0
3 ноя 17, 13:13    [20924669]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
Алексей
Member

Откуда: Москва
Сообщений: 361
felix_ff,

Вычисляемый, но если я сделаю даже так
SELECT 1
  FROM [AdventureWorks].[Sales].[SalesOrderDetail]
  JOIN AdventureWorks.Sales.SalesOrderHeader ON [AdventureWorks].[Sales].[SalesOrderDetail].SalesOrderID=
  AdventureWorks.Sales.SalesOrderHeader.SalesOrderID 
  Where SalesOrderNumber ='SO43659'


то получу те же результаты, warning как я понимаю на столбцы, по которым соединение идет
3 ноя 17, 13:14    [20924675]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
Алексей
Member

Откуда: Москва
Сообщений: 361
buser,

Похоже на мой случай, пойду курить статью
3 ноя 17, 13:17    [20924685]     Ответить | Цитировать Сообщить модератору
 Re: Предупреждение на select -e  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Алексей,

читайте статью которую привел buser там описано данное поведение.

By removing the computed column s.SalesOrderNumber we avoid generating a warning as seen in the plan below, because the join predicate is not being converted to a string now, so it does not affect possible order and does not interfere with estimates.
3 ноя 17, 13:18    [20924690]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить