Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) 1С не использует дополнительные индексы (число прочтений - 4354 )
Электроник
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 24. Июля 2009
1С не использует дополнительные индексы
23. Сентября 2010 :: 13:21
Печать  
Здравствуйте. Переписал модуль проведения документа на прямые запросы. Проанализировал план полученного запроса в SQL Studio, добавил в таблицу движений регистра дополнительный индекс по нужным полям (и добавил его в dds). В студии запрос использует новый индекс, а в 1С - нет, продолжает использовать индекс PK_RA328. Подскажите пожалуйста, как заставить оптимизатор использовать мой индекс.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: 1С не использует дополнительные индексы
Ответ #1 - 23. Сентября 2010 :: 13:23
Печать  
Покажи пожалуйста DDL для таблицы (из SQL студии), текст запроса и оба плана выполнения запросов.
  
Наверх
IP записан
 
Электроник
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 24. Июля 2009
Re: 1С не использует дополнительные индексы
Ответ #2 - 23. Сентября 2010 :: 13:26
Печать  
Извини за тупой вопрос, что значит показать DDL?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: 1С не использует дополнительные индексы
Ответ #3 - 23. Сентября 2010 :: 13:37
Печать  
Электроник писал(а) 23. Сентября 2010 :: 13:26:
Извини за тупой вопрос, что значит показать DDL?

Скрипт создания таблицы.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1С не использует дополнительные индексы
Ответ #4 - 23. Сентября 2010 :: 13:51
Печать  
выложи ( можно и картинку )
sp_help RA328 
чтобы видеть все созданные индексы.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1С не использует дополнительные индексы
Ответ #5 - 23. Сентября 2010 :: 14:29
Печать  
Электроник писал(а) 23. Сентября 2010 :: 13:21:
Здравствуйте. Переписал модуль проведения документа на прямые запросы. Проанализировал план полученного запроса в SQL Studio, добавил в таблицу движений регистра дополнительный индекс по нужным полям (и добавил его в dds). В студии запрос использует новый индекс, а в 1С - нет, продолжает использовать индекс PK_RA328. Подскажите пожалуйста, как заставить оптимизатор использовать мой индекс.

Как в 1с формируется запрос ?
если стандартным способом то скорее всего там стоят  хинты
если прямой запрос то приводи все полностью в том числе и сам запрос.
  
Наверх
 
IP записан
 
Электроник
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 24. Июля 2009
Re: 1С не использует дополнительные индексы
Ответ #6 - 23. Сентября 2010 :: 15:49
Печать  
Результаты sp_help RA328 (непустые):
-------------------
RA328      dbo      user table      2010-09-21 21:06:21.437
-- Столбцы
IDDOC      char      no      9                          no      no      no      Cyrillic_General_CI_AS
LINENO_      smallint      no      2      5          0          no      (n/a)      (n/a)      NULL
ACTNO      int      no      4      10        0          no      (n/a)      (n/a)      NULL
DEBKRED      bit      no      1                          no      (n/a)      (n/a)      NULL
SP4061      char      no      9                          no      no      no      Cyrillic_General_CI_AS
SP8773      char      no      9                          no      no      no      Cyrillic_General_CI_AS
SP331      char      no      9                          no      no      no      Cyrillic_General_CI_AS
SP340      char      no      9                          no      no      no      Cyrillic_General_CI_AS
SP341      char      no      9                          no      no      no      Cyrillic_General_CI_AS
SP1554      datetime      no      8                          no      (n/a)      (n/a)      NULL
SP7404      numeric      no      9      14        2          no      (n/a)      (n/a)      NULL
SP342      numeric      no      9      14        5          no      (n/a)      (n/a)      NULL
SP421      numeric      no      9      14        2          no      (n/a)      (n/a)      NULL
SP343      numeric      no      9      14        2          no      (n/a)      (n/a)      NULL
SP344      numeric      no      9      14        2          no      (n/a)      (n/a)      NULL
SP347      char      no      9                          no      no      no      Cyrillic_General_CI_AS
SP6818      numeric      no      9      17        2          no      (n/a)      (n/a)      NULL
SP7685      numeric      no      9      14        2          no      (n/a)      (n/a)      NULL
--- Индексы
i1      nonclustered located on PRIMARY      SP4061, SP8773, SP331, SP340
PK_RA328      clustered, unique, primary key located on PRIMARY      IDDOC, LINENO_, ACTNO
--- Ключи
PRIMARY KEY (clustered)      PK_RA328      (n/a)      (n/a)      (n/a)      (n/a)      IDDOC, LINENO_, ACTNO

Соответственно индекс "i1" создаю я.
Текст запроса в 1С - это простое получение остатков виртуальной таблицей:
Код
Выбрать все
ТекстЗапроса = "
    |SELECT
    |    Рег.Фирма as [Фирма $Справочник.Фирмы],
    |    Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
    |    Рег.СтатусПартии as [СтатусПартии $Перечисление.СтатусыПартии],
    |    Рег.Партия as [Партия $Справочник.Партии],
    |    $спрПартии.ПриходныйДокумент as [ПриходныйДокумент $Документ],
    |    Рег.ДатаПартии as [ДатаПартии $Дата],
    |    Рег.ЦенаПрод as [ЦенаПрод],
    |    Рег.КоличествоОстаток as Количество,
    |    Рег.СуммаУпрОстаток as СуммаУпр,
    |    Рег.СуммаРубОстаток as СуммаРуб,
    |    Рег.СуммаБезНДСОстаток as СуммаБезНДС
    |
    |FROM
    |  $РегистрОстатки.ПартииНаличие(:ДатаРасчета~,
    |                            ,%УслФирма% AND %УслНоменклатура% AND %УслСтатусПартии%,
    |                           (Фирма,Номенклатура,СтатусПартии,Партия,ДатаПартии,ЦенаПрод), (Количество,СуммаУпр,СуммаРуб,СуммаБезНДС)) as Рег
    |
    |LEFT JOIN
    |    $Справочник.Партии as спрПартии ON спрПартии.ID = Рег.Партия
    |"; 



Этот запрос из профайлера:
Код
Выбрать все
exec sp_executesql N'
SELECT
    Рег.Фирма as [Фирма $Справочник.Фирмы],
    Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
    Рег.СтатусПартии as [СтатусПартии $Перечисление.СтатусыПартии],
    Рег.Партия as [Партия $Справочник.Партии],
    спрПартии.sp216 as [ПриходныйДокумент $Документ],
    Рег.ДатаПартии as [ДатаПартии $Дата],
    Рег.ЦенаПрод as [ЦенаПрод],
    Рег.КоличествоОстаток as Количество,
    Рег.СуммаУпрОстаток as СуммаУпр,
    Рег.СуммаРубОстаток as СуммаРуб,
    Рег.СуммаБезНДСОстаток as СуммаБезНДС

FROM
  (
select
rr328_vt.sp4061 as Фирма,
rr328_vt.sp331 as Номенклатура,
rr328_vt.sp340 as СтатусПартии,
rr328_vt.sp341 as Партия,
rr328_vt.sp1554 as ДатаПартии,
rr328_vt.sp7404 as ЦенаПрод,
sum(rr328_vt.sp342) as КоличествоОстаток,
sum(rr328_vt.sp421) as СуммаУпрОстаток,
sum(rr328_vt.sp343) as СуммаРубОстаток,
sum(rr328_vt.sp344) as СуммаБезНДСОстаток
from (
select
rg328_vt.sp4061,
rg328_vt.sp331,
rg328_vt.sp340,
rg328_vt.sp341,
rg328_vt.sp1554,
rg328_vt.sp7404,
rg328_vt.sp342,
rg328_vt.sp421,
rg328_vt.sp343,
rg328_vt.sp344
from rg328 as rg328_vt (nolock)
where rg328_vt.period=@_CP_1
and (rg328_vt.sp4061 = ''     7   '' AND rg328_vt.sp331 IN (SELECT Val FROM #ВремНомен) AND rg328_vt.sp340 IN (''   2TB   '',''   2TC   '',''   2TD   '',''   2T3   '',''   2T4   '',''   2T5   '',''   2T6   '',''   2T7   '',''   2T8   '',''   2T9   '',''   2TA   '',''   69L   '',''    9B   '',''   67M   '' ))
union all
select
ra328_vt.sp4061,
ra328_vt.sp331,
ra328_vt.sp340,
ra328_vt.sp341,
ra328_vt.sp1554,
ra328_vt.sp7404,
case ra328_vt.debkred when 0 then ra328_vt.sp342 else -ra328_vt.sp342 end,
case ra328_vt.debkred when 0 then ra328_vt.sp421 else -ra328_vt.sp421 end,
case ra328_vt.debkred when 0 then ra328_vt.sp343 else -ra328_vt.sp343 end,
case ra328_vt.debkred when 0 then ra328_vt.sp344 else -ra328_vt.sp344 end
from ra328 as ra328_vt (nolock)
inner join _1sjourn as j328_vt (nolock) on j328_vt.iddoc = ra328_vt.iddoc
where j328_vt.date_time_iddoc > @_CP_2 and j328_vt.date_time_iddoc < @_CP_3
and j328_vt.rf328 = 0x1
and (ra328_vt.sp4061 = ''     7   '' AND ra328_vt.sp331 IN (SELECT Val FROM #ВремНомен) AND ra328_vt.sp340 IN (''   2TB   '',''   2TC   '',''   2TD   '',''   2T3   '',''   2T4   '',''   2T5   '',''   2T6   '',''   2T7   '',''   2T8   '',''   2T9   '',''   2TA   '',''   69L   '',''    9B   '',''   67M   '' ))
) as rr328_vt
group by
rr328_vt.sp4061,
rr328_vt.sp331,
rr328_vt.sp340,
rr328_vt.sp341,
rr328_vt.sp1554,
rr328_vt.sp7404
having
sum(rr328_vt.sp342) <> 0 or
sum(rr328_vt.sp421) <> 0 or
sum(rr328_vt.sp343) <> 0 or
sum(rr328_vt.sp344) <> 0
) as Рег

LEFT JOIN
    sc214 as спрПартии ON спрПартии.ID = Рег.Партия
',N'@_CP_1 smalldatetime,@_CP_2 char(8),@_CP_3 char(23)','Aug  1 2010 12:00:00:000AM','20100901','201009219J6OIO  FKPMЯЯЯ' 



Поля SP4061, SP8773, SP331 и SP340 соответствуют измерениям Фирма, Склад, Номенклатура и СтатусПартии регистра. Они участвуют в фильтре запроса (кроме Склада).
  
Наверх
 
IP записан
 
Электроник
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 24. Июля 2009
Re: 1С не использует дополнительные индексы
Ответ #7 - 23. Сентября 2010 :: 15:57
Печать  
Что получается: копирую запрос из профайлера в студию, смотрю план - индекс используется. Также увеличивается счетчик чтений индекса в представлении sys.dm_db_index_usage_stats. При проведении документа этот счетчик для i1 не увеличивается, а для PR_RA328 - увеличивается. К тому же, судя по планам запроса, использование i1 должно дать двукратное уменьшение времени выполнения запроса, чего также не наблюдалось. Пробовал обновлять статистику - тоже не помогло.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1С не использует дополнительные индексы
Ответ #8 - 23. Сентября 2010 :: 16:16
Печать  
не понимаю как sql может использовать
SP4061, SP8773, SP331 и SP340 если склад не задан
ведь в этом случае придеться просканировать всю ra
а это хуже чем кластерному индексу который будет связан
по iddoc c _1cjourn.

Может лучше включить в регистре
галку Отбор движений по измерению Партия или номенклатура?

  
Наверх
 
IP записан
 
Электроник
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 24. Июля 2009
Re: 1С не использует дополнительные индексы
Ответ #9 - 23. Сентября 2010 :: 16:20
Печать  
Цитата:
не понимаю как sql может использовать
SP4061, SP8773, SP331 и SP340 если склад не задан

Не знаю. Но ведь в плане запроса четко видно - i1.
Отбор движений создаст по отдельному индексу для каждого измерения, что тоже не поможет.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1С не использует дополнительные индексы
Ответ #10 - 23. Сентября 2010 :: 16:38
Печать  
Z1 писал(а) 23. Сентября 2010 :: 16:16:
не понимаю как sql может использовать
SP4061, SP8773, SP331 и SP340 если склад не задан
ведь в этом случае придеться просканировать всю ra

Ну не всю (по фирме то отбор задан), но, в принципе, да - индекс для этого запроса бестолковый.

Электроник писал(а) 23. Сентября 2010 :: 16:20:
Отбор движений создаст по отдельному индексу для каждого измерения, что тоже не поможет.

Как минимум, индекс по номенклатуре будет более избирательным, чем i1 - по фирме.
+ отбор движений сделает ненужным соединение с _1sjourn.

off: план запроса можно смотреть прямо в профайлере.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Электроник
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 24. Июля 2009
Re: 1С не использует дополнительные индексы
Ответ #11 - 23. Сентября 2010 :: 16:47
Печать  
Т.е. надо убрать поле склада из индекса, так? А отбор движений по номенклатуре стоял и был абсолютно бесполезен.
  
Наверх
 
IP записан
 
Электроник
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 24. Июля 2009
Re: 1С не использует дополнительные индексы
Ответ #12 - 23. Сентября 2010 :: 16:50
Печать  
Off: а как смотреть план в профайлере?  Озадачен
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1С не использует дополнительные индексы
Ответ #13 - 23. Сентября 2010 :: 17:25
Печать  
Добавить событие Performance\Execution Plan в свойствах трассировки.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Электроник
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 57
Зарегистрирован: 24. Июля 2009
Re: 1С не использует дополнительные индексы
Ответ #14 - 23. Сентября 2010 :: 17:50
Печать  
berezdetsky писал(а) 23. Сентября 2010 :: 17:25:
Добавить событие Performance\Execution Plan в свойствах трассировки.

Спасибо. Посмотрел. Неудобно как-то. Но зато подтвердилось, что мой индекс не используется.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать