|
v8: План запроса с Table Spool | ☑ | ||
---|---|---|---|---|
0
XSprinter
10.01.13
✎
13:58
|
8.2.16.368, SQL 2008(10.50.1600.1), самописная конфигурация. Поймал в ЦУП запрос обновления отображения формы списка. {Документ.ЗаказНаряд.Форма.ФормаСписка}/{ТабличноеПоле : Список}/{ОбновлениеОтображения} При анализе плана выполнения соответствующего запроса можно заметить что в одном месте встречается оператор Table Spool что как я понимаю означает создание временной таблицы на 9000 записей, при обновлении 43 строк формы списка. Вопрос зачем?
Запрос: SELECT TOP 43 Документ.ЗаказНаряд_T15.Номер, Документ.ЗаказНаряд_T15.ДатаЗакрытия, Документ.ЗаказНаряд_T15.СуммаУпр, Документ.ЗаказНаряд_T15.Подрядчик, Документ.ЗаказНаряд_T15.ДатаОткрытия, Документ.ЗаказНаряд_T15.СтатусОперативный, Документ.ЗаказНаряд_T15.ОтметкаСервиса, Документ.ЗаказНаряд_T15.ПланируемаяДатаОкончания, Документ.ЗаказНаряд_T15.Марка, Документ.ЗаказНаряд_T15.ЦеховаяГруппа, Документ.ЗаказНаряд_T15.Ответственный, Документ.ЗаказНаряд_T15.МероприятиеKDM, Документ.ЗаказНаряд_T15.ВнешняяСтоянка, Документ.ЗаказНаряд_T15.Контрагент, Документ.ЗаказНаряд_T15.РабочееМесто, Документ.ЗаказНаряд_T15.ТипПлательщика, Документ.ЗаказНаряд_T15.ТотальнаяМашина, Документ.ЗаказНаряд_T15.Заказчик, Документ.ЗаказНаряд_T15.АвторСкидки, Документ.ЗаказНаряд_T15.ПризнакНаличияТранспортногоСредства, Документ.ЗаказНаряд_T15.КузовГотов, Документ.ЗаказНаряд_T15.АвторВыдачи, Документ.ЗаказНаряд_T15.ГосударственныйНомер, Документ.ЗаказНаряд_T15.Нормировщик, Документ.ЗаказНаряд_T15.Модель, Документ.ЗаказНаряд_T15.ВидРемонта, Документ.ЗаказНаряд_T15.Дилер, Документ.ЗаказНаряд_T15.ДатаВыдачи, Документ.ЗаказНаряд_T15.МастерЦеха, Документ.ЗаказНаряд_T15.Цех, Документ.ЗаказНаряд_T15.Ссылка, Документ.ЗаказНаряд_T15.Дата, Документ.ЗаказНаряд_T15.ПометкаУдаления, Документ.ЗаказНаряд_T15.Проведен, Справочник.Контрагенты_T16.Наименование, Справочник.Сотрудники_T17.Наименование, Справочник.Контрагенты_T18.Наименование, Справочник.РабочиеМеста_T19.Наименование, Справочник.Контрагенты_T20.Наименование, Справочник.Пользователи_T21.Код, Справочник.Пользователи_T22.Код, Справочник.Пользователи_T23.Код, Справочник.МоделиТранспортныхСредств_T24.Наименование, Справочник.ВидыРемонта_T25.Наименование, Справочник.Дилеры_T26.Наименование, Справочник.Сотрудники_T27.Наименование, Справочник.Подразделения_T28.Наименование FROM Документ.ЗаказНаряд T15 WITH(NOLOCK) LEFT OUTER JOIN Справочник.Контрагенты T16 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.Подрядчик = Справочник.Контрагенты_T16.Ссылка LEFT OUTER JOIN Справочник.Сотрудники T17 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.Ответственный = Справочник.Сотрудники_T17.Ссылка LEFT OUTER JOIN Справочник.Контрагенты T18 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.Контрагент = Справочник.Контрагенты_T18.Ссылка LEFT OUTER JOIN Справочник.РабочиеМеста T19 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.РабочееМесто = Справочник.РабочиеМеста_T19.Ссылка LEFT OUTER JOIN Справочник.Контрагенты T20 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.Заказчик = Справочник.Контрагенты_T20.Ссылка LEFT OUTER JOIN Справочник.Пользователи T21 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.АвторСкидки = Справочник.Пользователи_T21.Ссылка LEFT OUTER JOIN Справочник.Пользователи T22 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.АвторВыдачи = Справочник.Пользователи_T22.Ссылка LEFT OUTER JOIN Справочник.Пользователи T23 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.Нормировщик = Справочник.Пользователи_T23.Ссылка LEFT OUTER JOIN Справочник.МоделиТранспортныхСредств T24 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.Модель = Справочник.МоделиТранспортныхСредств_T24.Ссылка LEFT OUTER JOIN Справочник.ВидыРемонта T25 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.ВидРемонта = Справочник.ВидыРемонта_T25.Ссылка LEFT OUTER JOIN Справочник.Дилеры T26 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.Дилер = Справочник.Дилеры_T26.Ссылка LEFT OUTER JOIN Справочник.Сотрудники T27 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.МастерЦеха = Справочник.Сотрудники_T27.Ссылка LEFT OUTER JOIN Справочник.Подразделения T28 WITH(NOLOCK) ON Документ.ЗаказНаряд_T15.Цех = Справочник.Подразделения_T28.Ссылка WHERE ((((Документ.ЗаказНаряд_T15.Организация IN (?, ?))) AND (Документ.ЗаказНаряд_T15.РабочееМесто = ?)) AND (Документ.ЗаказНаряд_T15.СтатусОперативный = ?)) AND Документ.ЗаказНаряд_T15.Дата < ? ORDER BY (Документ.ЗаказНаряд_T15.Дата) DESC, (Документ.ЗаказНаряд_T15.Ссылка) DESC |
|||
1
XSprinter
10.01.13
✎
13:59
|
Код SQL
<Code>SELECT TOP 43 T15._Number, T15._Fld891, T15._Fld3765, T15._Fld8910RRef, T15._Fld893, T15._Fld924RRef, T15._Fld3347, T15._Fld3066, T15._Fld12059RRef, T15._Fld5104RRef, T15._Fld909RRef, T15._Fld8997, T15._Fld7116, T15._Fld901RRef, T15._Fld917RRef, T15._Fld933RRef, T15._Fld7117, T15._Fld897RRef, T15._Fld4291RRef, T15._Fld912, T15._Fld8793, T15._Fld8790RRef, T15._Fld889, T15._Fld9112RRef, T15._Fld906RRef, T15._Fld885RRef, T15._Fld10127RRef, T15._Fld7406, T15._Fld6486RRef, T15._Fld935RRef, T15._IDRRef, T15._Date_Time, T15._Marked, T15._Posted, T16._Description, T17._Description, T18._Description, T19._Description, T20._Description, T21._Code, T22._Code, T23._Code, T24._Description, T25._Description, T26._Description, T27._Description, T28._Description FROM _Document77 T15 WITH(NOLOCK) LEFT OUTER JOIN _Reference22 T16 WITH(NOLOCK) ON T15._Fld8910RRef = T16._IDRRef LEFT OUTER JOIN _Reference49 T17 WITH(NOLOCK) ON T15._Fld909RRef = T17._IDRRef LEFT OUTER JOIN _Reference22 T18 WITH(NOLOCK) ON T15._Fld901RRef = T18._IDRRef LEFT OUTER JOIN _Reference45 T19 WITH(NOLOCK) ON T15._Fld917RRef = T19._IDRRef LEFT OUTER JOIN _Reference22 T20 WITH(NOLOCK) ON T15._Fld897RRef = T20._IDRRef LEFT OUTER JOIN _Reference38 T21 WITH(NOLOCK) ON T15._Fld4291RRef = T21._IDRRef LEFT OUTER JOIN _Reference38 T22 WITH(NOLOCK) ON T15._Fld8790RRef = T22._IDRRef LEFT OUTER JOIN _Reference38 T23 WITH(NOLOCK) ON T15._Fld9112RRef = T23._IDRRef LEFT OUTER JOIN _Reference27 T24 WITH(NOLOCK) ON T15._Fld906RRef = T24._IDRRef LEFT OUTER JOIN _Reference8 T25 WITH(NOLOCK) ON T15._Fld885RRef = T25._IDRRef LEFT OUTER JOIN _Reference10119 T26 WITH(NOLOCK) ON T15._Fld10127RRef = T26._IDRRef LEFT OUTER JOIN _Reference49 T27 WITH(NOLOCK) ON T15._Fld6486RRef = T27._IDRRef LEFT OUTER JOIN _Reference37 T28 WITH(NOLOCK) ON T15._Fld935RRef = T28._IDRRef WHERE ((((T15._Fld908RRef IN (?, ?))) AND (T15._Fld917RRef = ?)) AND (T15._Fld924RRef = ?)) AND T15._Date_Time < ? ORDER BY (T15._Date_Time) DESC, (T15._IDRRef) DESC </Code> |
|||
2
XSprinter
10.01.13
✎
13:59
|
И план выполнения:
+------+----------+--------------+------------+-------------+------------+------------------+--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Rows | Executes | EstimateRows | EstimateIO | EstimateCPU | AvgRowSize | TotalSubtreeCost | EstimateExecutions | StmtText | +------+----------+--------------+------------+-------------+------------+------------------+--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 8 | 1 | 24.2 | 0 | 2.42E-006 | 1329 | 55.3 | 1 | |--Top(TOP EXPRESSION:((43))) | | 8 | 1 | 24.2 | 0 | 0.0291 | 1329 | 55.3 | 1 | |--Parallelism(Gather Streams, ORDER BY:([T15].[_Date_Time] DESC, [T15].[_IDRRef] DESC)) | | 8 | 12 | 24.2 | 0 | 1.69E-005 | 1329 | 55.2 | 1 | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([T15].[_Fld935RRef])) | | 8 | 12 | 24.2 | 0 | 1.69E-005 | 1177 | 55.2 | 1 | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([T15].[_Fld6486RRef])) | | 8 | 12 | 24.2 | 0 | 0.000456 | 1125 | 55.2 | 1 | | |--Nested Loops(Left Outer Join, WHERE:([av_db].[dbo].[_Document77].[_Fld10127RRef] as [T15].[_Fld10127RRef]=[av_db].[dbo].[_Reference10119].[_IDRRef] as [T26].[_IDRRef])) | | 8 | 12 | 24.2 | 0 | 1.69E-005 | 1063 | 55.2 | 1 | | | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([T15].[_Fld885RRef])) | | 8 | 12 | 24.2 | 0 | 0.0201 | 1036 | 55.2 | 1 | | | | |--Nested Loops(Left Outer Join, WHERE:([av_db].[dbo].[_Document77].[_Fld906RRef] as [T15].[_Fld906RRef]=[av_db].[dbo].[_Reference27].[_IDRRef] as [T24].[_IDRRef])) | | 8 | 12 | 24.2 | 0 | 1.69E-005 | 984 | 55.1 | 1 | | | | | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([T15].[_Fld9112RRef])) | | 8 | 12 | 24.2 | 0 | 1.69E-005 | 948 | 55.1 | 1 | | | | | | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([T15].[_Fld8790RRef])) | | 8 | 12 | 24.2 | 0 | 1.69E-005 | 911 | 55 | 1 | | | | | | | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([T15].[_Fld4291RRef])) | | 8 | 12 | 24.2 | 0 | 1.69E-005 | 875 | 55 | 1 | | | | | | | | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([T15].[_Fld897RRef])) | | 8 | 12 | 24.2 | 0 | 1.69E-005 | 773 | 54.9 | 1 | | | | | | | | | |--Nested Loops(Left Outer Join) | | 8 | 12 | 24.2 | 0 | 1.69E-005 | 671 | 54.9 | 1 | | | | | | | | | | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([T15].[_Fld901RRef])) | | 8 | 12 | 24.2 | 0 | 1.69E-005 | 569 | 54.8 | 1 | | | | | | | | | | | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([T15].[_Fld909RRef])) | | 8 | 12 | 24.2 | 0 | 1.69E-005 | 517 | 54.7 | 1 | | | | | | | | | | | | |--Nested Loops(Left Outer Join, OUTER REFERENCES:([T15].[_Fld8910RRef])) | | 8 | 12 | 24.2 | 0.00188 | 4.57E-005 | 415 | 54.7 | 1 | | | | | | | | | | | | | |--Sort(ORDER BY:([T15].[_Date_Time] DESC, [T15].[_IDRRef] DESC)) | | 8 | 12 | 24.2 | 54.5 | 0.0625 | 431 | 54.5 | 1 | | | | | | | | | | | | | | |--Clustered Index Scan(OBJECT:([av_db].[dbo].[_Document77].[PK___Documen__AC8ED0C453673394] AS [T15]), WHERE:([av_db].[dbo].[_Document77].[_Fld917RRef] as [T15].[_Fld917RRef]=[@P3] AND [av_db].[dbo].[_Document77].[_Fld924RRef] as [T15].[_Fld924RRef]=[@P4] AND [av_db].[dbo].[_Document77].[_Date_Time] as [T15].[_Date_Time]<[@P5] AND ([av_db].[dbo].[_Document77].[_Fld908RRef] as [T15].[_Fld908RRef]=[@P2] OR [av_db].[dbo].[_Document77].[_Fld908RRef] as [T15].[_Fld908RRef]=[@P1]))) | | 0 | 8 | 1 | 0.00313 | 0.000158 | 111 | 0.069 | 24.2 | | | | | | | | | | | | | |--Clustered Index Seek(OBJECT:([av_db].[dbo].[_Reference22].[PK___Referen__AC8ED0C45DC591CD] AS [T16]), SEEK:([T16].[_IDRRef]=[av_db].[dbo].[_Document77].[_Fld8910RRef] as [T15].[_Fld8910RRef]) ORDERED FORWARD) | | 8 | 8 | 1 | 0.00313 | 0.000158 | 61 | 0.0727 | 24.2 | | | | | | | | | | | | |--Clustered Index Seek(OBJECT:([av_db].[dbo].[_Reference49].[PK___Referen__AC8ED0C408BA1173] AS [T17]), SEEK:([T17].[_IDRRef]=[av_db].[dbo].[_Document77].[_Fld909RRef] as [T15].[_Fld909RRef]) ORDERED FORWARD) | | 8 | 8 | 1 | 0.00313 | 0.000158 | 111 | 0.0764 | 24.2 | | | | | | | | | | | |--Clustered Index Seek(OBJECT:([av_db].[dbo].[_Reference22].[PK___Referen__AC8ED0C45DC591CD] AS [T18]), SEEK:([T18].[_IDRRef]=[av_db].[dbo].[_Document77].[_Fld901RRef] as [T15].[_Fld901RRef]) ORDERED FORWARD) | | 8 | 8 | 1 | 0.00313 | 0.000158 | 111 | 0.00696 | 24.2 | | | | | | | | | | |--Clustered Index Seek(OBJECT:([av_db].[dbo].[_Reference45].[PK___Referen__AC8ED0C449D3A7B9] AS [T19]), SEEK:([T19].[_IDRRef]=[@P3]) ORDERED FORWARD) | | 8 | 8 | 1 | 0.00313 | 0.000158 | 111 | 0.0764 | 24.2 | | | | | | | | | |--Clustered Index Seek(OBJECT:([av_db].[dbo].[_Reference22].[PK___Referen__AC8ED0C45DC591CD] AS [T20]), SEEK:([T20].[_IDRRef]=[av_db].[dbo].[_Document77].[_Fld897RRef] as [T15].[_Fld897RRef]) ORDERED FORWARD) | | 0 | 8 | 1 | 0.00313 | 0.000158 | 43 | 0.066 | 24.2 | | | | | | | | |--Clustered Index Seek(OBJECT:([av_db].[dbo].[_Reference38].[PK___Referen__AC8ED0C475C73890] AS [T21]), SEEK:([T21].[_IDRRef]=[av_db].[dbo].[_Document77].[_Fld4291RRef] as [T15].[_Fld4291RRef]) ORDERED FORWARD) | | 5 | 8 | 1 | 0.00313 | 0.000158 | 43 | 0.0654 | 24.2 | | | | | | | |--Clustered Index Seek(OBJECT:([av_db].[dbo].[_Reference38].[PK___Referen__AC8ED0C475C73890] AS [T22]), SEEK:([T22].[_IDRRef]=[av_db].[dbo].[_Document77].[_Fld8790RRef] as [T15].[_Fld8790RRef]) ORDERED FORWARD) | | 0 | 8 | 1 | 0.00313 | 0.000158 | 43 | 0.0128 | 24.2 | | | | | | |--Clustered Index Seek(OBJECT:([av_db].[dbo].[_Reference38].[PK___Referen__AC8ED0C475C73890] AS [T23]), SEEK:([T23].[_IDRRef]=[av_db].[dbo].[_Document77].[_Fld9112RRef] as [T15].[_Fld9112RRef]) ORDERED FORWARD) | | 9528 | 8 | 1.19E+003 | 0.01 | 0.000315 | 77 | 0.0267 | 24.2 | | | | | |--Table Spool | | 7146 | 6 | 1.19E+003 | 0.00757 | 0.00147 | 77 | 0.00904 | 1 | | | | | |--Index Scan(OBJECT:([av_db].[dbo].[_Reference27].[_Referenc27_Descr_SR] AS [T24])) | | 8 | 8 | 1 | 0.00313 | 0.000158 | 36 | 0.00696 | 24.2 | | | | |--Clustered Index Seek(OBJECT:([av_db].[dbo].[_Reference8].[PK___Referen__AC8ED0C4034B50E0] AS [T25]), SEEK:([T25].[_IDRRef]=[av_db].[dbo].[_Document77].[_Fld885RRef] as [T15].[_Fld885RRef]) ORDERED FORWARD) | | 216 | 8 | 27 | 0.0032 | 0.000108 | 87 | 0.00583 | 24.2 | | | |--Clustered Index Scan(OBJECT:([av_db].[dbo].[_Reference10119].[PK___Reference10119N__273D01E5] AS [T26])) | | 2 | 8 | 1 | 0.00313 | 0.000158 | 61 | 0.0683 | 24.2 | | |--Clustered Index Seek(OBJECT:([av_db].[dbo].[_Reference49].[PK___Referen__AC8ED0C408BA1173] AS [T27]), SEEK:([T27].[_IDRRef]=[av_db].[dbo].[_Document77].[_Fld6486RRef] as [T15].[_Fld6486RRef]) ORDERED FORWARD) | | 8 | 8 | 1 | 0.00313 | 0.000158 | 161 | 0.0102 | 24.2 | |--Clustered Index Seek(OBJECT:([av_db].[dbo].[_Reference37].[PK___Referen__AC8ED0C40EFCFAAE] AS [T28]), SEEK:([T28].[_IDRRef]=[av_db].[dbo].[_Document77].[_Fld935RRef] as [T15].[_Fld935RRef]) ORDERED FORWARD) | +------+----------+--------------+------------+-------------+------------+------------------+--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ |
|||
3
H A D G E H O G s
10.01.13
✎
14:04
|
Не увидел создания временной таблицы.
|
|||
4
H A D G E H O G s
10.01.13
✎
14:04
|
А что, медленно работает?
|
|||
5
XSprinter
10.01.13
✎
14:13
|
Нет, визуально проблем нет, но в Регламентном мониторинге в ЦУП данный запрос в первых рядах, поэтому стало интересно.
В плане запроса обратил внимание на |--Table Spool |--Index Scan(OBJECT:([av_db].[dbo].[_Reference27].[_Referenc27_Descr_SR] AS [T24])) где в колонке Rows указано 9528. PS: Пожалуйста, дайте ссылку на правильное оформление кода в сообщениях на форуме, в правилах не нашел. |
|||
6
H A D G E H O G s
10.01.13
✎
14:25
|
_Referenc27_Descr_SR
Странный какой-то индекс, если честно. Че он по нему ищет то |
|||
7
Fragster
гуру
10.01.13
✎
14:29
|
Нету индекса по Документ.ЗаказНаряд_T15.СтатусОперативный?
|
|||
8
Fragster
гуру
10.01.13
✎
14:30
|
ну и по хорошему - начальную дату надо тоже ограничивать
|
|||
9
H A D G E H O G s
10.01.13
✎
14:31
|
(8) А зачем Скан по индексу для наименования спр. Сотрудники?
|
|||
10
Fragster
гуру
10.01.13
✎
14:33
|
(9) если все необходимые данные содержаться в индексе, то скуль недавно(относительно, но с какой версии - не помню) научился не обращаться к основной таблице, а выбирать эти данные прямо из индекса.
|
|||
11
XSprinter
10.01.13
✎
15:01
|
В большинстве случаев (в этом плане запроса) 1С использует кластерный индекс справочников чтобы получить представление для ссылок.
Но в данном случае _Referenc27_Descr_SR - созданный платформой некластерный индекс включающий поля Ссылка и Наименование, и видимо опираясь на какие то статистики SQL Server решает что найти Наименование соответствующее Ссылке быстрее используя именно этот индекс. Не понятно что такое Table Spool |
|||
12
acsent
10.01.13
✎
15:06
|
Оператор Table Spool просматривает входную таблицу и помещает копию каждой строки в скрытую буферную таблицу, которая находится в базе данных tempdb
|
|||
13
acsent
10.01.13
✎
15:07
|
что за справочник?
|
|||
14
Fragster
гуру
10.01.13
✎
15:10
|
мне интересно, (7) помогло, или нет?
|
|||
15
acsent
10.01.13
✎
15:16
|
(14) а смысл? почему ты думаешь что система выберет его?
|
|||
16
Fragster
гуру
10.01.13
✎
15:25
|
(15) что-то мне подсказывает, что у него будет наилучшая селективность
|
|||
17
Fragster
гуру
10.01.13
✎
15:25
|
я ж телепат
|
|||
18
Jofa
10.01.13
✎
15:39
|
Fragster На скока обработки в 1С работают быстрее когда запрос написан на СКУЛе?
|
|||
19
Fragster
гуру
10.01.13
✎
15:39
|
(18) нинаскока
|
|||
20
Fragster
гуру
10.01.13
✎
15:41
|
это я про селекты. update/insert/delete из скуля в 100500 раз быстрее, но не отрабатывают встроенные механизмы 1с, а также модули конфигурации, так что нужно сначала думать, потому делать.
|
|||
21
Jofa
10.01.13
✎
15:41
|
(19)те одинаково? Можно реализовать Table Spool с помощью языка запросов 1С? Table Spool каким образом можно это пользовать?
|
|||
22
Fragster
гуру
10.01.13
✎
15:42
|
(21) в (0) - открытие/проматывание формы списка документа
|
|||
23
Fragster
гуру
10.01.13
✎
15:44
|
Table Spool там от безысходности
|
|||
24
Serginio1
10.01.13
✎
16:02
|
(11) Интересно, а если сделать временную таблицу куда поместить этот ссылку и наименование (код )справочника и проиндексировать по ._IDRRef.
И сделать джойн к этой таблице Появится ли этот Table Spool? |
|||
25
acsent
10.01.13
✎
16:07
|
может просто реиндекс сделать?
|
|||
26
Serginio1
10.01.13
✎
16:08
|
Судя по http://support.microsoft.com/kb/937533/ru
Table Spool создает уникальный кластеризованный индекс для столбца при формировании плана выполнения запроса |
|||
27
Fragster
гуру
10.01.13
✎
16:09
|
(24) оно там не от того
(25) скорее обновление статистики, если все индексы оптимальные |
|||
28
acsent
10.01.13
✎
16:13
|
тк в итоге выводится одно наименование, то скл посчитал что лучше не из таблицы брать, а из индекса, для этого считывается весь индекс
|
|||
29
Fragster
гуру
10.01.13
✎
16:14
|
(28) к (24), я так понимаю
|
|||
30
acsent
10.01.13
✎
16:15
|
(28) собственно скл сделал то что предложено сделать в (24) средствами 1с
|
|||
31
Serginio1
10.01.13
✎
16:24
|
(27) Ну для справочника уникальный индекс по _IDRRef по любому есть. Другой вопрос, что он не кластерный или длина записи слишком длинная и легче создать кластерный индекс с нужными данными если количество обращений большое и выгоднее чем обращаться к индексу затем к записи
|
|||
32
Fragster
гуру
10.01.13
✎
16:26
|
(31) table spool там не от того, что у справочника наименование фиговое, а от того, что из таблицы документа данные выбираются неоптимальным образом
|
|||
33
acsent
10.01.13
✎
16:31
|
план в читабельном виде
http://paste.org.ru/?lt90g0 |
|||
34
acsent
10.01.13
✎
16:33
|
(32) почему ты так решил?
|
|||
35
Fragster
гуру
10.01.13
✎
16:33
|
(33) я так понимаю, что он делает 8 соединений, кидает в ВТ, затем результат во врем. таблицу, затем еще 5 соединений...
|
|||
36
Serginio1
10.01.13
✎
16:33
|
(32) смотри 26 table spool создает кластерный индекс.
Кстати одно из решений перестроение идекса с Большим количеством индексоом на странице fill factor http://www.sql.ru/forum/actualthread.aspx?tid=270980 |
|||
37
acsent
10.01.13
✎
16:35
|
(35) а мне кажется что спул только таблицы 27 происходит
|
|||
38
Fragster
гуру
10.01.13
✎
16:36
|
(37) а смысл ее помещать в ВТ?
|
|||
39
Fragster
гуру
10.01.13
✎
16:36
|
кстати, max degree of parallelism стоит в 1?
|
|||
40
acsent
10.01.13
✎
16:40
|
(38) см. (28) ИМХО
|
|||
41
acsent
10.01.13
✎
16:41
|
в графическом виде бы посмотреть план
|
|||
42
acsent
10.01.13
✎
16:41
|
(40) а может ты и прав
|
|||
43
Fragster
гуру
10.01.13
✎
16:41
|
(40) т.е. table spool следствие того, что данные беруться только из индекса?
|
|||
44
Fragster
гуру
10.01.13
✎
16:42
|
тогда тормозить не должно. ну и да, *берутся
|
|||
45
Fragster
гуру
10.01.13
✎
17:04
|
кстати, по плану запроса большая часть тупизма происходит именно на выборке из таблицы документа, по этому мне интересен эффект от (7)
|
|||
46
Jaap Vduul
10.01.13
✎
17:25
|
spool обычно оптимизатор использует, когда используется неуникальное соединение (т.е. как в данном случае Descr_SR вместо PK).
|
|||
47
Serginio1
10.01.13
✎
17:26
|
(45) Ну судя по плану он просто сканирует кластерный индекс на условия это и самая дорогая операция
Clustered Index Scan(OBJECT:([av_db].[dbo].[_Document77].[PK___Documen__AC8ED0C453673394] AS [T15]), WHERE:([av_db].[dbo].[_Document77].[_Fld917RRef] as [T15].[_Fld917RRef]=[@P3] AND [av_db].[dbo].[_Document77].[_Fld924RRef] as [T15].[_Fld924RRef]=[@P4] AND [av_db].[dbo].[_Document77].[_Date_Time] as [T15].[_Date_Time]<[@P5] AND ([av_db].[dbo].[_Document77].[_Fld908RRef] as [T15].[_Fld908RRef]=[@P2] OR [av_db].[dbo].[_Document77].[_Fld908RRef] as [T15].[_Fld908RRef]=[@P1]))) |
|||
48
Fragster
гуру
10.01.13
✎
17:31
|
(47) кластерный индекс для документа - это по дате. из-за условия Дата < &Дата. Нужно проанализировать селективность полей. ИМХО некластерный индекс по СтатусОперативный будет в данном случае быстрее. Нужно смотреть, конечно, но учитывая (17) я думаю, что выводятся какие-нибудь "незакрытые заказы старше хх дней"
|
|||
49
Serginio1
10.01.13
✎
17:44
|
А разве кластерный индекс для документа не по IDDOC?
По дате он мог бы взять индекс по _Date_Time, но тогда пришлось бы прыгать от индекса к записи. И не факт, что СтатусОперативный не имеет большинство записей. |
|||
50
Serginio1
10.01.13
✎
17:46
|
При этом по уму ему то как раз и нужно иддти по дате, так в выбрать первые 43 как сортировка по Дате и IDDOC.
|
|||
51
Fragster
гуру
10.01.13
✎
17:51
|
ну тут надо смотреть, чего больше, документов < даты, или документов с нужным статусом. ИМХО с выбранным статусом должно быть документов меньше, чем всех документов до даты
|
|||
52
Fragster
гуру
10.01.13
✎
17:52
|
и вообще, автор уже мог бы попробовать (7) и ответить нам
|
|||
53
Fragster
гуру
10.01.13
✎
17:53
|
для этого даже не обязательно обновлять базу (по хорошему, конечно, надо), но ведь можно и в скуле индекс создать...
|
|||
54
Serginio1
10.01.13
✎
18:00
|
(53) Ты не забывай про
TOP(43) ORDER BY (T15._Date_Time) DESC, (T15._IDRRef) DESC Нужно всего то 43 записи сортированных по _Date_Time DESC и IDRRef DESC. Просто используя этот индекс можно пройтись по данным и остановиться на отборе 43 записей. И Это будет меньшей выборкой |
|||
55
Fragster
гуру
10.01.13
✎
18:03
|
(54) надо проверять, очень сильно зависит от данных.
|
|||
56
Fragster
гуру
10.01.13
✎
18:03
|
в любом случае прыгать для проверки организации (кстати, почему она составного типа??) и статуса
|
|||
57
Serginio1
10.01.13
✎
18:04
|
54 При твоем подходе нужно отобрать все записи по СтатусОперативный, затем отсортировать по дате и ссылке и выбрать первых 43 элемента. При этом количество отбранных записей может быть значительно выше чем при прохождении по дате с условием на максимальное количество выборки. Так как в этом случае не нужно ничего сортировать, так как уже при прохождении используется накладываемая сортировка
|
|||
58
acsent
10.01.13
✎
18:04
|
(54) только чтобы получить эти 43 приходится пролопатить пару тыщ
|
|||
59
Fragster
гуру
10.01.13
✎
18:05
|
(57) -> (56). вполне может быть, что документов 100к, с нужным статусом 1к, а с датой < &Дата - 90к
|
|||
60
Serginio1
10.01.13
✎
18:08
|
(59) Ну тут еще и организации и прочее. Но в основном записи более или менее распределены. То есть если записей с нужным статусом в 10 раз меньше, то и просканировать придется в 10 раз больше а это 430 записей, что меньше чем 1К
|
|||
61
Serginio1
10.01.13
✎
18:08
|
(58) смотри 60
|
|||
62
Demiurg
10.01.13
✎
18:09
|
http://www.gilev.ru/1c/cloud/IndexesClient82.dt запустите, скажите какие индексы для _Document77 он порекомендует
|
|||
63
Demiurg
10.01.13
✎
18:09
|
(47) просто нет нужного индекса
|
|||
64
Fragster
гуру
10.01.13
✎
18:10
|
(60) тут без автора не понять. у нас подобная форма, например была, когда народ смотрел неотгруженные заказы ранее определенной даты. в принципе, неотгруженных заказов по сравнению с остальными - очень мало
|
|||
65
acsent
10.01.13
✎
18:11
|
(61) там фильтров то поболее чем просто статус
|
|||
66
Serginio1
10.01.13
✎
18:15
|
(64) В общем согласен и будет зависеть от значения этого статуса. В одном случаее ты прав в другом я. Для этого оптимизатор и существует.
(65) Ну так они если они равномерно и распределены, то не имеет значения. |
|||
67
Demiurg
10.01.13
✎
18:17
|
не правы оба, можно понять по количеству логических чтений
|
|||
68
Demiurg
10.01.13
✎
18:19
|
правда тут есть претензия к тому как план запроса 1С придумала отображать )
|
|||
69
acsent
10.01.13
✎
18:20
|
(68) это скуль так в текстовом виде выдает
|
|||
70
Serginio1
10.01.13
✎
18:21
|
66 + еще интересно как будет реагировать план запрса если для списка ограничить диапозон дат
|
|||
71
Fragster
гуру
10.01.13
✎
18:21
|
(67) а? разве он не всю таблицу читает?
|
|||
72
acsent
10.01.13
✎
18:21
|
(71) нет конечно, там же топ стоит
|
|||
74
Fragster
гуру
10.01.13
✎
18:22
|
(72) топ - самая верхняя операция. а самая дорогая - Clustered Index Scan(OBJECT:([av_db].[dbo].[_Document77].[PK___Documen__AC8ED0C453673394] AS [T15]), WHERE:([av_db].[dbo].[_Document77].[_Fld917RRef] as [T15].[_Fld917RRef]=[@P3] AND [av_db].[dbo].[_Document77].[_Fld924RRef] as [T15].[_Fld924RRef]=[@P4] AND [av_db].[dbo].[_Document77].[_Date_Time] as [T15].[_Date_Time]<[@P5] AND ([av_db].[dbo].[_Document77].[_Fld908RRef] as [T15].[_Fld908RRef]=[@P2] OR [av_db].[dbo].[_Document77].[_Fld908RRef] as [T15].[_Fld908RRef]=[@P1])))
|
|||
75
acsent
10.01.13
✎
18:25
|
(74) там записей всего 24 потому что
|
|||
76
Serginio1
10.01.13
✎
18:33
|
75
EstimateRows Предполагаемое количество строк вывода от данного оператора. Только для строк типа PLAN_ROWS. EstimateIO Предполагаемые затраты на ввод-вывод* для данного оператора. Только для строк типа PLAN_ROWS. |
|||
77
Fragster
гуру
11.01.13
✎
17:37
|
как там?
|
|||
78
Fragster
гуру
15.01.13
✎
12:28
|
автор живой еще?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |