Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Как явно указать индекс через 1C++ ??? (число прочтений - 1917 )
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Как явно указать индекс через 1C++ ???
23. Июля 2017 :: 13:05
Печать  
Добрый день.

В левой части SQL использует кластерный индекс и сваливается в SCAN
В правой части через EMS указал использовать Index=datetime и тогда никакого перебора.
Как через 1C++ явно указать использовать индекс?

Вот где здесь воткнуть (nolock index=datetime) ?
После FROM ругается...

Код (SQL)
Выбрать все
		|SET NOCOUNT ON
		|SELECT РезервыТМЦОстатки.Фирма [Фирма $Справочник.Фирмы]
		|	, РезервыТМЦОстатки.Номенклатура [Номенклатура $Справочник.Номенклатура]
		|	, РезервыТМЦОстатки.Склад [Склад $Справочник.Склады]
		|	, РезервыТМЦОстатки.ДоговорПокупателя [ДоговорПокупателя $Справочник.Договоры]
		|	, РезервыТМЦОстатки.ЗаявкаПокупателя [ЗаявкаПокупателя $Документ.ЗаявкаПокупателя]
		|	, $ЗаявкаПокупателя.ВидОперации [ВидОперации $Перечисление.ВидыОперацийЗаявок]
		|	, РезервыТМЦОстатки.Получатель [Получатель $Справочник.Контрагенты]
		|	, РезервыТМЦОстатки.Сотрудник [Сотрудник $Справочник]
		|	, Sum(РезервыТМЦОстатки.КоличествоОстаток) Количество
		|FROM $РегистрОстатки.РезервыТМЦ("+?(ОстаткиНаТА=0,":ТекДок~","")+",,"+

		?(НужныФирмы<>0,"(Фирма IN (SELECT Val FROM #текФирма)) AND","")+
		?(НуженСклад<>0,"(Склад IN (SELECT Val FROM #текСклад)) AND","")+
		?(СписокДоговоров<>0,"(ДоговорПокупателя IN (SELECT Val FROM #СпДоговоров)) AND","")+"
		|		(Номенклатура IN (SELECT val FROM #СпЗн)),
		|		(Фирма, Номенклатура, Склад, ДоговорПокупателя, ЗаявкаПокупателя, Получатель, Сотрудник),) AS РезервыТМЦОстатки
		|INNER JOIN $Документ.ЗаявкаПокупателя AS ЗаявкаПокупателя ON ЗаявкаПокупателя.IDDOC = РезервыТМЦОстатки.ЗаявкаПокупателя
		|GROUP BY РезервыТМЦОстатки.Фирма
		|	, РезервыТМЦОстатки.Номенклатура
		|	, РезервыТМЦОстатки.Склад
		|	, РезервыТМЦОстатки.ДоговорПокупателя
		|	, РезервыТМЦОстатки.ЗаявкаПокупателя
		|	, $ЗаявкаПокупателя.ВидОперации
		|	, РезервыТМЦОстатки.Получатель
		|	, РезервыТМЦОстатки.Сотрудник
		|";
 

  
Наверх
www  
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Как явно указать индекс через 1C++ ???
Ответ #1 - 23. Июля 2017 :: 13:37
Печать  
В SQl улетает вот такое

Код (SQL)
Выбрать все
SET NOCOUNT ON
SELECT РезервыТМЦОстатки.Фирма [Фирма $Справочник.Фирмы]
	, РезервыТМЦОстатки.Номенклатура [Номенклатура $Справочник.Номенклатура]
	, РезервыТМЦОстатки.Склад [Склад $Справочник.Склады]
	, РезервыТМЦОстатки.ДоговорПокупателя [ДоговорПокупателя $Справочник.Договоры]
	, РезервыТМЦОстатки.ЗаявкаПокупателя [ЗаявкаПокупателя $Документ.ЗаявкаПокупателя]
	, ЗаявкаПокупателя.sp4760 [ВидОперации $Перечисление.ВидыОперацийЗаявок]
	, РезервыТМЦОстатки.Получатель [Получатель $Справочник.Контрагенты]
	, РезервыТМЦОстатки.Сотрудник [Сотрудник $Справочник]
	, Sum(РезервыТМЦОстатки.КоличествоОстаток) Количество
FROM (
select
rr4480_vt.sp4475 as Фирма,
rr4480_vt.sp4477 as Номенклатура,
rr4480_vt.sp4476 as Склад,
rr4480_vt.sp4519 as ДоговорПокупателя,
rr4480_vt.sp4762 as ЗаявкаПокупателя,
rr4480_vt.sp29803 as Получатель,
rr4480_vt.sp33694 as Сотрудник,
sum(rr4480_vt.sp4479) as КоличествоОстаток
from (
select
rg4480_vt.sp4475,
rg4480_vt.sp4477,
rg4480_vt.sp4476,
rg4480_vt.sp4519,
rg4480_vt.sp4762,
rg4480_vt.sp29803,
rg4480_vt.sp33694,
rg4480_vt.sp4479
from rg4480 as rg4480_vt (nolock)
where rg4480_vt.period={d '2017-05-01'}
and ((rg4480_vt.sp4477 IN (SELECT val FROM #СпЗн)))
union all
select
ra4480_vt.sp4475,
ra4480_vt.sp4477,
ra4480_vt.sp4476,
ra4480_vt.sp4519,
ra4480_vt.sp4762,
ra4480_vt.sp29803,
ra4480_vt.sp33694,
case ra4480_vt.debkred when 1 then ra4480_vt.sp4479 else -ra4480_vt.sp4479 end
from ra4480 as ra4480_vt [color=#ff0000]WITH (NOLOCK INDEX=datetime) [/color]
where ra4480_vt.date_time_iddoc >= '201705175PL6WG 47BJ9OAЯ' and ra4480_vt.date_time_iddoc < '20170531Z'
and ((ra4480_vt.sp4477 IN (SELECT val FROM #СпЗн)))
) as rr4480_vt
group by
rr4480_vt.sp4475,
rr4480_vt.sp4477,
rr4480_vt.sp4476,
rr4480_vt.sp4519,
rr4480_vt.sp4762,
rr4480_vt.sp29803,
rr4480_vt.sp33694
having
sum(rr4480_vt.sp4479) <> 0
) as РезервыТМЦОстатки
INNER JOIN dh2457 AS ЗаявкаПокупателя ON ЗаявкаПокупателя.IDDOC = РезервыТМЦОстатки.ЗаявкаПокупателя
GROUP BY РезервыТМЦОстатки.Фирма
	, РезервыТМЦОстатки.Номенклатура
	, РезервыТМЦОстатки.Склад
	, РезервыТМЦОстатки.ДоговорПокупателя
	, РезервыТМЦОстатки.ЗаявкаПокупателя
	, ЗаявкаПокупателя.sp4760
	, РезервыТМЦОстатки.Получатель
	, РезервыТМЦОстатки.Сотрудник 



как вставить то что отмечено в коде красным?
т.е. конструкцией [co lor]WITH (NOLOCK INDEX=datetime) [/co lor]
  
Наверх
www  
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Как явно указать индекс через 1C++ ???
Ответ #2 - 23. Июля 2017 :: 14:12
Печать  
пока решил перехватчиком

Код (SQL)
Выбрать все
	vk_hook.ВключитьПодмену = 1;
	vk_hook.ТекстSQL = "ra4480_vt (nolock)";
	vk_hook.НовыйSQL = "ra4480_vt (nolock index=datetime)";
	vk_hook.УстановитьЗаменуSQL();
	глРС.ВыполнитьИнструкцию(ТекстЗапроса, ТаблицаРезервов);
	vk_hook.ВключитьПодмену = 0;
 



это конечно решение, но правильно ли...
  
Наверх
www  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как явно указать индекс через 1C++ ???
Ответ #3 - 24. Июля 2017 :: 07:14
Печать  
Пересчитай статистику. У тебя оценочная стоимость поддерева с указанием индекса в полтора раза дороже, по этому сервер его сам не выбирает.
  

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


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Как явно указать индекс через 1C++ ???
Ответ #4 - 24. Июля 2017 :: 18:31
Печать  
REDUILD или UPDATE STATISTICS достаточно?
  
Наверх
www  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как явно указать индекс через 1C++ ???
Ответ #5 - 04. Августа 2017 :: 03:39
Печать  
Лучше раз и навсегда решить проблему с индексами и статистиками. Например так:
https://blogs.msdn.microsoft.com/blogdoezequiel/2011/07/03/adaptive-index-defrag...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать