Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Прошу помощи в чтении плана / 12 сообщений из 12, страница 1 из 1
30.09.2018, 09:01
    #39710457
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в чтении плана
Доброго дня

есть три таблички
1. 10000 строк
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE [Year].[dbo].[import_header](
	[id_header] [int] NOT NULL,
	[code] [nvarchar](10) NOT NULL,
	[method] [nvarchar](20) NOT NULL,
	[A_DT] [datetime2](0) NOT NULL,
	[import_DT] [datetime2](0) NOT NULL,
	[id_user] [int] NOT NULL,
	[p_] [nvarchar](20) NULL,
	[Comment] [nvarchar](max) NULL,
	[method_type]  AS (left([A_method],(3)))
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]


с индексом (и еще парой не участвующих)
Код: sql
1.
2.
3.
4.
CREATE CLUSTERED INDEX [p_code] ON [dbo].[import_header]
(
	[p_] ASC
)



2. 400000 строк
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE [Year].[dbo].[import_data](
	[id_header] [int] NOT NULL,
	[id_import_fld] [int] NOT NULL,
	[rt] [decimal](5, 3) NULL,
	[rt_expected] [decimal](5, 3) NULL,
	[ar] [int] NULL,
	[he] [int] NULL
) ON [PRIMARY]


с индексом
Код: sql
1.
2.
3.
4.
5.
CREATE CLUSTERED INDEX [id_header_import_data] ON [dbo].[import_data]
(
	[id_header] ASC,
	[id_import_fld] ASC
)


соединены ключем
Код: sql
1.
2.
ALTER TABLE [dbo].[import_data]  WITH CHECK ADD  CONSTRAINT [FK_import_data_import_header] FOREIGN KEY([id_header])
REFERENCES [dbo].[import_header] ([id_header])



3. 600 строк
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE [libra].[dbo].[import_flds](
	[id_import_fld] [int] IDENTITY(1,1) NOT NULL,
	[import_fld] [nvarchar](50) NOT NULL,
	[method] [nvarchar](50) NOT NULL,
	[in] [int] NULL,
	[co] [int] NULL,
	[s_name] [nvarchar](50) NULL,
	[mandatory] [int] NULL,
	[single] [int] NULL,
	[shift] [decimal](4, 2) NULL
) ON [PRIMARY]



Код: sql
1.
2.
3.
4.
5.
CREATE UNIQUE CLUSTERED INDEX [IX_id_import_fld] ON [dbo].[import_flds]
(
	[id_import_fld] ASC,
	[import_fld] ASC
)



и запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT
[import_header].[code],
[import_header].[method],
[import_header].[Comment],
[import_flds].[s_name],
[import_data].[rt],
[import_data].[rt_expected],
[import_data].[ar],
[import_data].[he]
FROM [Year].[dbo].[import_header]
JOIN [Year].[dbo].[import_data]
	ON [import_data].[id_header] = [import_header].[id_header]
JOIN [libs].[dbo].[import_flds]
	ON [import_data].[id_import_fld] = [import_flds].[id_import_fld]  
WHERE
[import_header].[p_] = N'092D7G1'
AND [import_header].[code] NOT LIKE N'XC%'



Две первые таблицы соединяются по ключу [id_header] 1 ко многим. Всего в среднем 83 строки из первой и 32 из второй. Итого ~2500 строк.
К этому соединению добавляется третья таблица по ключу [id_import_fld] 1 к 1 просто выборка имени по ключу.
И вот тут я не понимаю что происходит.

<RunTimeCountersPerThread Thread="0" ActualRows="2984" ActualRowsRead="2984" ActualEndOfScans="2984" ActualExecutions="2984" ActualElapsedms="4" ActualCPUms="4" ActualScans="2984" ActualLogicalReads="5976" ActualPhysicalReads="0" ActualReadAheads="0" ActualLobLogicalReads="0" ActualLobPhysicalReads="0" ActualLobReadAheads="0" />

откуда эти все риды? Помогите прочитать план и понять, что конкретно происходит при этом соединении.
План под спойлером
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
<?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.3.1" Build="12.0.5214.6" xmlns=" http://schemas.microsoft.com/sqlserver/2004/07/showplan"> 
  <BatchSequence>
    <Batch>
      <Statements>
        <StmtSimple StatementCompId="2" StatementEstRows="37.0006" StatementId="1" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" CardinalityEstimationModelVersion="120" StatementSubTreeCost="0.0373887" StatementText="SELECT 
	[import_header].[code],
	[import_header].[method],
	[import_header].[Comment],
	[import_flds].[s_name],
	[import_data].[rt],
	[import_data].[rt_expected],
	[import_data].[ar],
	[import_data].[he]

	FROM [Year].[dbo].[import_header]
	JOIN [Year].[dbo].[import_data] 
		ON [import_data].[id_header] = [import_header].[id_header] 
	JOIN [libs].[dbo].[import_flds] 
		ON [import_data].[id_import_fld] = [import_flds].[id_import_fld]   
	WHERE 
	[import_header].[p_] = N'092D7G1'
	AND [import_header].[code] NOT LIKE N'XC%'" StatementType="SELECT" QueryHash="0x1E71B6321C5892EA" QueryPlanHash="0x2A6F4D298AE9D67B" RetrievedFromCache="false">
          <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="0" NonParallelPlanReason="NoParallelPlansInDesktopOrExpressEdition" CachedPlanSize="24" CompileTime="4" CompileCPU="4" CompileMemory="368">
            <MemoryGrantInfo SerialRequiredMemory="0" SerialDesiredMemory="0" />
            <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="89945" EstimatedPagesCached="22486" EstimatedAvailableDegreeOfParallelism="2" MaxCompileMemory="972160" />
            <TraceFlags IsCompileTime="true">
              <TraceFlag Value="8017" Scope="Global" />
            </TraceFlags>
            <TraceFlags IsCompileTime="false">
              <TraceFlag Value="8017" Scope="Global" />
            </TraceFlags>
            <RelOp AvgRowSize="4127" EstimateCPU="0.000154662" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="37.0006" LogicalOp="Inner Join" NodeId="0" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.0373887">
              <OutputList>
                <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="code" />
                <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="method" />
                <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="Comment" />
                <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="rt" />
                <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="rt_expected" />
                <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="ar" />
                <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="he" />
                <ColumnReference Database="[libs]" Schema="[dbo]" Table="[import_flds]" Column="s_name" />
              </OutputList>
              <RunTimeInformation>
                <RunTimeCountersPerThread Thread="0" ActualRows="2984" ActualEndOfScans="1" ActualExecutions="1" ActualElapsedms="7" ActualCPUms="7" />
              </RunTimeInformation>
              <NestedLoops Optimized="false">
                <OuterReferences>
                  <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="id_import_fld" />
                </OuterReferences>
                <RelOp AvgRowSize="4079" EstimateCPU="0.000154662" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="37.0006" LogicalOp="Inner Join" NodeId="1" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.00676144">
                  <OutputList>
                    <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="code" />
                    <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="method" />
                    <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="Comment" />
                    <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="id_import_fld" />
                    <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="rt" />
                    <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="rt_expected" />
                    <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="ar" />
                    <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="he" />
                  </OutputList>
                  <RunTimeInformation>
                    <RunTimeCountersPerThread Thread="0" ActualRows="2984" ActualEndOfScans="1" ActualExecutions="1" ActualElapsedms="2" ActualCPUms="2" />
                  </RunTimeInformation>
                  <NestedLoops Optimized="false">
                    <OuterReferences>
                      <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="id_header" />
                    </OuterReferences>
                    <RelOp AvgRowSize="4061" EstimateCPU="0.0001581" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Clustered Index Seek" NodeId="2" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="0.0032831" TableCardinality="10486">
                      <OutputList>
                        <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="id_header" />
                        <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="code" />
                        <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="method" />
                        <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="Comment" />
                      </OutputList>
                      <RunTimeInformation>
                        <RunTimeCountersPerThread Thread="0" ActualRows="84" ActualRowsRead="87" ActualEndOfScans="1" ActualExecutions="1" ActualElapsedms="0" ActualCPUms="0" ActualScans="1" ActualLogicalReads="6" ActualPhysicalReads="0" ActualReadAheads="0" ActualLobLogicalReads="0" ActualLobPhysicalReads="0" ActualLobReadAheads="0" />
                      </RunTimeInformation>
                      <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">
                        <DefinedValues>
                          <DefinedValue>
                            <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="id_header" />
                          </DefinedValue>
                          <DefinedValue>
                            <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="code" />
                          </DefinedValue>
                          <DefinedValue>
                            <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="method" />
                          </DefinedValue>
                          <DefinedValue>
                            <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="Comment" />
                          </DefinedValue>
                        </DefinedValues>
                        <Object Database="[Year]" Schema="[dbo]" Table="[import_header]" Index="[p_code]" IndexKind="Clustered" Storage="RowStore" />
                        <SeekPredicates>
                          <SeekPredicateNew>
                            <SeekKeys>
                              <Prefix ScanType="EQ">
                                <RangeColumns>
                                  <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="p_" />
                                </RangeColumns>
                                <RangeExpressions>
                                  <ScalarOperator ScalarString="N'092D7G1'">
                                    <Const ConstValue="N'092D7G1'" />
                                  </ScalarOperator>
                                </RangeExpressions>
                              </Prefix>
                            </SeekKeys>
                          </SeekPredicateNew>
                        </SeekPredicates>
                        <Predicate>
                          <ScalarOperator ScalarString="NOT [Year].[dbo].[import_header].[code] like N'XC%'">
                            <Logical Operation="NOT">
                              <ScalarOperator>
                                <Intrinsic FunctionName="like">
                                  <ScalarOperator>
                                    <Identifier>
                                      <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="code" />
                                    </Identifier>
                                  </ScalarOperator>
                                  <ScalarOperator>
                                    <Const ConstValue="N'XC%'" />
                                  </ScalarOperator>
                                </Intrinsic>
                              </ScalarOperator>
                            </Logical>
                          </ScalarOperator>
                        </Predicate>
                      </IndexScan>
                    </RelOp>
                    <RelOp AvgRowSize="29" EstimateCPU="0.000197701" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="37.0006" LogicalOp="Clustered Index Seek" NodeId="3" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="0.0033227" TableCardinality="381661">
                      <OutputList>
                        <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="id_import_fld" />
                        <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="rt" />
                        <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="rt_expected" />
                        <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="ar" />
                        <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="he" />
                      </OutputList>
                      <RunTimeInformation>
                        <RunTimeCountersPerThread Thread="0" ActualRows="2984" ActualRowsRead="2984" ActualEndOfScans="84" ActualExecutions="84" ActualElapsedms="1" ActualCPUms="1" ActualScans="84" ActualLogicalReads="266" ActualPhysicalReads="0" ActualReadAheads="0" ActualLobLogicalReads="0" ActualLobPhysicalReads="0" ActualLobReadAheads="0" />
                      </RunTimeInformation>
                      <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">
                        <DefinedValues>
                          <DefinedValue>
                            <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="id_import_fld" />
                          </DefinedValue>
                          <DefinedValue>
                            <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="rt" />
                          </DefinedValue>
                          <DefinedValue>
                            <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="rt_expected" />
                          </DefinedValue>
                          <DefinedValue>
                            <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="ar" />
                          </DefinedValue>
                          <DefinedValue>
                            <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="he" />
                          </DefinedValue>
                        </DefinedValues>
                        <Object Database="[Year]" Schema="[dbo]" Table="[import_data]" Index="[id_header_import_data]" IndexKind="Clustered" Storage="RowStore" />
                        <SeekPredicates>
                          <SeekPredicateNew>
                            <SeekKeys>
                              <Prefix ScanType="EQ">
                                <RangeColumns>
                                  <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="id_header" />
                                </RangeColumns>
                                <RangeExpressions>
                                  <ScalarOperator ScalarString="[Year].[dbo].[import_header].[id_header]">
                                    <Identifier>
                                      <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_header]" Column="id_header" />
                                    </Identifier>
                                  </ScalarOperator>
                                </RangeExpressions>
                              </Prefix>
                            </SeekKeys>
                          </SeekPredicateNew>
                        </SeekPredicates>
                      </IndexScan>
                    </RelOp>
                  </NestedLoops>
                </RelOp>
                <RelOp AvgRowSize="61" EstimateCPU="0.0001581" EstimateIO="0.003125" EstimateRebinds="35.812" EstimateRewinds="0.188568" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Clustered Index Seek" NodeId="4" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="0.0304726" TableCardinality="597">
                  <OutputList>
                    <ColumnReference Database="[libs]" Schema="[dbo]" Table="[import_flds]" Column="s_name" />
                  </OutputList>
                  <RunTimeInformation>
                    <RunTimeCountersPerThread Thread="0" ActualRows="2984" ActualRowsRead="2984" ActualEndOfScans="2984" ActualExecutions="2984" ActualElapsedms="4" ActualCPUms="4" ActualScans="2984" ActualLogicalReads="5976" ActualPhysicalReads="0" ActualReadAheads="0" ActualLobLogicalReads="0" ActualLobPhysicalReads="0" ActualLobReadAheads="0" />
                  </RunTimeInformation>
                  <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">
                    <DefinedValues>
                      <DefinedValue>
                        <ColumnReference Database="[libs]" Schema="[dbo]" Table="[import_flds]" Column="s_name" />
                      </DefinedValue>
                    </DefinedValues>
                    <Object Database="[libs]" Schema="[dbo]" Table="[import_flds]" Index="[IX_id_import_fld]" IndexKind="Clustered" Storage="RowStore" />
                    <SeekPredicates>
                      <SeekPredicateNew>
                        <SeekKeys>
                          <Prefix ScanType="EQ">
                            <RangeColumns>
                              <ColumnReference Database="[libs]" Schema="[dbo]" Table="[import_flds]" Column="id_import_fld" />
                            </RangeColumns>
                            <RangeExpressions>
                              <ScalarOperator ScalarString="[Year].[dbo].[import_data].[id_import_fld]">
                                <Identifier>
                                  <ColumnReference Database="[Year]" Schema="[dbo]" Table="[import_data]" Column="id_import_fld" />
                                </Identifier>
                              </ScalarOperator>
                            </RangeExpressions>
                          </Prefix>
                        </SeekKeys>
                      </SeekPredicateNew>
                    </SeekPredicates>
                  </IndexScan>
                </RelOp>
              </NestedLoops>
            </RelOp>
          </QueryPlan>
        </StmtSimple>
      </Statements>
    </Batch>
  </BatchSequence>
</ShowPlanXML>
...
Рейтинг: 0 / 0
30.09.2018, 10:14
    #39710468
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в чтении плана
PizzaPizzaоткуда эти все риды?Все - это какие именно? Что вас там смущает?
Если выделенное жирным, то это количество прочитанных страниц индекса - Индекс читался 2984 раза (ActualScans), каждый раз от корня до листа. Итого читалось 5976 страниц (ActualLogicalReads).
...
Рейтинг: 0 / 0
30.09.2018, 10:33
    #39710470
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в чтении плана
invmPizzaPizzaоткуда эти все риды?Все - это какие именно? Что вас там смущает?
Если выделенное жирным, то это количество прочитанных страниц индекса - Индекс читался 2984 раза (ActualScans), каждый раз от корня до листа. Итого читалось 5976 страниц (ActualLogicalReads).

Вот это вот чтение 2984 раза всего индекса мне и не нравится. Там всего до 200 уникальных ключей для соединения и я не вижу повода ему на каждую строку первого соединения читать весь индекс из второго соединения.
...
Рейтинг: 0 / 0
30.09.2018, 10:45
    #39710473
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в чтении плана
PizzaPizzaВот это вот чтение 2984 раза всего индекса мне и не нравится.Тогда исключите Nested Loops - будут читаться таблицы/индексы целиком, но один раз. И где вы увидели чтение всего индекса?
PizzaPizzaя не вижу повода ему на каждую строку первого соединения читать весь индекс из второго соединения.Еще раз - где вы увидели чтение всего индекса?
...
Рейтинг: 0 / 0
30.09.2018, 18:56
    #39710606
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в чтении плана
invmЕще раз - где вы увидели чтение всего индекса?

Вот! В этом то и заключается вопрос :) в чтении плана.

Я вижу, что от первого соединения приходит 2984 строк и третья таблица возвращает 2984 строк соответственно. При этом первая таблица даёт ActualLogicalReads="6", вторая ActualLogicalReads="266", а третья сразу ActualLogicalReads="5976". Что у меня с таблицей или индексом на [import_flds] такое, что даёт такую разницу? Или я не понимаю семантику плана и так и должно быть?
...
Рейтинг: 0 / 0
30.09.2018, 19:45
    #39710627
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в чтении плана
PizzaPizzaИли я не понимаю семантику плана и так и должно быть?Похоже, вы не понимаете как работает поиск в индексе.
Для поиска значения по ключу необходимо пройти все уровни индекса от корневого до листового. Каждый уровень - логическое чтение страницы.
И так 2984 раза, потому что соединение по NL. Полученное ActualLogicalReads="5976" говорит, что в индекесе 2 уровня.
...
Рейтинг: 0 / 0
30.09.2018, 20:17
    #39710639
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в чтении плана
invm,

Теперь вижу. (Думать - тяжело). У меня есть рандомные ключи в левом соединении и я по каждому из них дёргаю индекс правой таблицы. Каждый ключ отдельно и для двух уровней по две страницы чтения.

Тогда я полагаю, что из первой и второй таблиц у меня выборки идут блоками подряд, поэтому страниц меньше выбирается, тк кластер.

Спасибо. Теперь стройнее картина.

Вот думаю не лучше было бы прочитать весь индекс из третей таблицы и сделать left join мерджем или хашем. А то получается если у меня в левом соединении из 2984 строк уникальных ключей только 200, то ему надо делать все равно 2984 отдельных чтений, вместо того, что бы выбрать весь индекс (600 строк). Попробую сегодня с хинтами.
...
Рейтинг: 0 / 0
30.09.2018, 21:29
    #39710656
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в чтении плана
PizzaPizzaВот думаю не лучше было бы прочитать весь индекс из третей таблицы и сделать left join мерджем или хашем. А то получается если у меня в левом соединении из 2984 строк уникальных ключей только 200, то ему надо делать все равно 2984 отдельных чтений, вместо того, что бы выбрать весь индекс (600 строк). Попробую сегодня с хинтами.Чтение страниц - подразумевается в памяти.
Физически, конечно, индекс читается один раз, и не весь, а используемые страницы (точнее, для оптимизации читаются блоки по 8 страниц).
Но поисков нужно 2984 * 2, что и отражается в плане.
...
Рейтинг: 0 / 0
30.09.2018, 21:33
    #39710657
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в чтении плана
invm,

Обновил статистику и теперь у меня hash match и одно выполнение index scan на второе соединение без всяких хинтов.
Просто чудо какое то.

Единственное, что не понятно теперь, это из-за трейса 2371 который я включил на моем 2014 экспрессе или просто само обновление статистики помогло.
...
Рейтинг: 0 / 0
30.09.2018, 21:58
    #39710662
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в чтении плана
alexeyvgPizzaPizzaВот думаю не лучше было бы прочитать весь индекс из третей таблицы и сделать left join мерджем или хашем. А то получается если у меня в левом соединении из 2984 строк уникальных ключей только 200, то ему надо делать все равно 2984 отдельных чтений, вместо того, что бы выбрать весь индекс (600 строк). Попробую сегодня с хинтами.Чтение страниц - подразумевается в памяти.
Физически, конечно, индекс читается один раз, и не весь, а используемые страницы (точнее, для оптимизации читаются блоки по 8 страниц).
Но поисков нужно 2984 * 2, что и отражается в плане.

Ну если бы тут было бы физических 2984 чтений, то вопросы у меня были бы другие. :)

Вот этот момент с поисками он не очевиден, его надо осмыслить, что когда на loop приходят не сортированные по ключу соединения данные, то loop делает индивидуальные поиски на каждую строку первого кортежа.
...
Рейтинг: 0 / 0
30.09.2018, 22:01
    #39710663
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в чтении плана
PizzaPizzaсамо обновление статистики помогло.Да.
...
Рейтинг: 0 / 0
30.09.2018, 23:55
    #39710688
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в чтении плана
invm,

Видимо мне надо посмотреть на трейс флаги для анализа статистики, а то сейчас я ориентируюсь только на разницу между актуальным выполнением и эстимейтом.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Прошу помощи в чтении плана / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]