Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Медленное получение значения периодического реквизита (число прочтений - 10520 )
elkpro
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 145
Зарегистрирован: 19. Мая 2006
Re: Медленное получение значения периодического реквизита
Ответ #15 - 10. Декабря 2009 :: 08:35
Печать  
Ну если поставить TOP 1 понятно, что проблем бы не было. Только как ты это скажешь делать 1С?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Медленное получение значения периодического реквизита
Ответ #16 - 10. Декабря 2009 :: 09:27
Печать  
elkpro писал(а) 10. Декабря 2009 :: 08:35:
Ну если поставить TOP 1 понятно, что проблем бы не было. Только как ты это скажешь делать 1С?

Не понял кто мешает
вместо

Процедура Сформировать1()
     Спр1 = СоздатьОбъект("Справочник.Валюты");
     Спр1.ИспользоватьДату(Дата1);
     Спр1.НайтиЭлемент(Вал1);
     Зн1 = Спр1.Текущ_курс;
     Сообщить("метод1 на дату = " + Дата1 + " курс = " + Зн1);
КонецПроцедуры

использовать внутри сформировать1 прямой запрос

Select top 1 * from _1SCONST(NOLOCK)
where ID=92 and OBJID='     2   '
and DATE<='Oct  1 2009 12:00:00:000AM'
order by DATE DESC

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


I Love YaBB 2!

Сообщений: 145
Зарегистрирован: 19. Мая 2006
Re: Медленное получение значения периодического реквизита
Ответ #17 - 10. Декабря 2009 :: 09:55
Печать  
Так ты определись, что ты хочешь - всю конфигурацию перелопатить на предмет нахождения таких конструкций и замену их на прямой запрос или ничего не трогая ускорить их выполнение.
Практика показывает, что лучше переделать где это можно. Я тебе написал пример в посте #13.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Медленное получение значения периодического реквизита
Ответ #18 - 10. Декабря 2009 :: 10:02
Печать  
(elkpro) Давай не будем переходить на личности.
При 163  строках меня устроит любой метод. (валюта режется раз в год)

Ну а (all)  сможет из этой ветки выбрать что ему больше подходит.

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


I Love YaBB 2!

Сообщений: 145
Зарегистрирован: 19. Мая 2006
Re: Медленное получение значения периодического реквизита
Ответ #19 - 10. Декабря 2009 :: 10:18
Печать  
Никто не переходит на личности. Извини если что не так сказал.
Я просто обращаю внимание на то, что для начала нужно определить что в итоге хочешь достичь и какими средствами.
Твоя проблема была в медленном получении периодических реквизитах, а конкретно при выборке данных из таблицы _1sconst.
Здесь есть два решения:
1. Менее трудозатратный, но не всегда гарантирует результат
2. Трудозатратный, но с гарантированным результатом.

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Медленное получение значения периодического реквизита
Ответ #20 - 11. Декабря 2009 :: 06:38
Печать  
Сегодня проверил как работает $ПоследнееЗначение
Есть код
Код
Выбрать все
Процедура Сформировать4()
Запрос = СоздатьОбъект("ODBCRecordSet");
ТекстЗапроса = "
|SELECT  
|    $ПоследнееЗначение.Валюты.Текущ_курс(:ВыбID , :ВыбДата)
|";
Запрос.УстановитьТекстовыйПараметр("ВыбID", Вал1);
Запрос.УстановитьТекстовыйПараметр("ВыбДата", Дата1);
	Запрос.Отладка(1);
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
Сообщить("метод4 на дату = " + Дата1 + " курс = " + ТЗ.ПолучитьЗначение(1,1) );
КонецПроцедуры
 


код sql
SELECT  
   (
select top 1
cast(c92_vv.value as numeric(9, 4))
from
_1sconst as c92_vv (nolock)
where
c92_vv.id = 92 and
c92_vv.objid = '     2   ' and
(c92_vv.date <= '20091001')
order by c92_vv.date desc, c92_vv.time desc, c92_vv.docid desc, c92_vv.row_id desc
)
Т.е один в один что сказано в посте 6 или посте 13.

PS тоже в сортировке нет полей ID DESC, OBJID DESC
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Медленное получение значения периодического реквизита
Ответ #21 - 11. Декабря 2009 :: 06:43
Печать  
Остался один вопрос
Зачем в родном 1с запросе

exec sp_executesql N'Select * from _1SCONST(NOLOCK)
where ID=@P1 and OBJID=@P2 and DATE<=@P3
order by ID DESC, OBJID DESC, DATE DESC, TIME DESC, DOCID DESC'
, N'@P1 int,@P2 varchar(9),@P3 datetime', 92, '     2   ', 'Oct  1 2009 12:00:00:000AM'

сортировке используется ID DESC, OBJID DESC, в этом есть
какой-то смысл, это баг , может быть так надо было писать под sql 6.5 или что-то еще ?
Может этот вопрос вынести в отдельную тему ?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Медленное получение значения периодического реквизита
Ответ #22 - 11. Декабря 2009 :: 07:23
Печать  
ORDER BY от 1С нагляднее для программиста и не приводит к выполнению лишней работы сервером. Т.е. это не баг.
  

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


I Love YaBB 2!

Сообщений: 145
Зарегистрирован: 19. Мая 2006
Re: Медленное получение значения периодического реквизита
Ответ #23 - 11. Декабря 2009 :: 08:56
Печать  
Z1 писал(а) 11. Декабря 2009 :: 06:38:
Сегодня проверил как работает $ПоследнееЗначение
Есть код
Код
Выбрать все
Процедура Сформировать4()
Запрос = СоздатьОбъект("ODBCRecordSet");
ТекстЗапроса = "
|SELECT  
|    $ПоследнееЗначение.Валюты.Текущ_курс(:ВыбID , :ВыбДата)
|";
Запрос.УстановитьТекстовыйПараметр("ВыбID", Вал1);
Запрос.УстановитьТекстовыйПараметр("ВыбДата", Дата1);
	Запрос.Отладка(1);
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
Сообщить("метод4 на дату = " + Дата1 + " курс = " + ТЗ.ПолучитьЗначение(1,1) );
КонецПроцедуры
 


код sql
SELECT  
   (
select top 1
cast(c92_vv.value as numeric(9, 4))
from
_1sconst as c92_vv (nolock)
where
c92_vv.id = 92 and
c92_vv.objid = '     2   ' and
(c92_vv.date <= '20091001')
order by c92_vv.date desc, c92_vv.time desc, c92_vv.docid desc, c92_vv.row_id desc
)
Т.е один в один что сказано в посте 6 или посте 13.

PS тоже в сортировке нет полей ID DESC, OBJID DESC


В данном случае сортировка по дате, только для того, чтобы вытащить последнее значение из всего кол-ва значений по дате и видимо ID и OBJID не влияют на индекс, т.к. он уже отфильтрован по ним.
В плане запросе такой запрос не формирует раздела SORT
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Медленное получение значения периодического реквизита
Ответ #24 - 11. Декабря 2009 :: 08:57
Печать  
Цитата:
ORDER BY от 1С нагляднее для программиста и не приводит к выполнению лишней работы сервером. Т.е. это не баг.

Ну да по сравнению с тем что возвращается весь набор
значений вместо одной строки это вообще не ошибка ( даже под микроскопом не увидишь ).

Далее рассмотрим ситуацию этот запрос сидит в кеше запросов все ок
Если по каким либо причинам этот запрос часто перекомпилируется
то на то чтобы из сортировки выбросить поля ID OBJID (что показал план выполнения) оптимизатору запросов надо немного потратить свое время. Вот об этом ничтожном времени и идет речь.
  
Наверх
 
IP записан
 
elkpro
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 145
Зарегистрирован: 19. Мая 2006
Re: Медленное получение значения периодического реквизита
Ответ #25 - 11. Декабря 2009 :: 09:01
Печать  
Если поставить
order by c92_vv.ID, c92_vv.OBJID, c92_vv.date desc, c92_vv.time desc, c92_vv.docid desc, c92_vv.row_id desc
как в оригинале, то план запроса уже использует Cluster Index Scan.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Медленное получение значения периодического реквизита
Ответ #26 - 11. Декабря 2009 :: 09:10
Печать  
Z1 писал(а) 11. Декабря 2009 :: 08:57:
Если по каким либо причинам этот запрос часто перекомпилируется
то на то чтобы из сортировки выбросить поля ID OBJID (что показал план выполнения) оптимизатору запросов надо немного потратить свое время. Вот об этом ничтожном времени и идет речь.

Если бы, да кабы..  Злой Нет никакой ложки сортировки.
  

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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Медленное получение значения периодического реквизита
Ответ #27 - 11. Декабря 2009 :: 09:12
Печать  
elkpro писал(а) 11. Декабря 2009 :: 09:01:
Если поставить
order by c92_vv.ID, c92_vv.OBJID, c92_vv.date desc, c92_vv.time desc, c92_vv.docid desc, c92_vv.row_id desc
как в оригинале, то план запроса уже использует Cluster Index Scan.

В оригинале так:
order by c92_vv.ID desc, c92_vv.OBJID desc, c92_vv.date desc, c92_vv.time desc, c92_vv.docid desc, c92_vv.row_id desc
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Медленное получение значения периодического реквизита
Ответ #28 - 11. Декабря 2009 :: 09:49
Печать  
elkpro писал(а) 11. Декабря 2009 :: 09:01:
Если поставить
order by c92_vv.ID, c92_vv.OBJID, c92_vv.date desc, c92_vv.time desc, c92_vv.docid desc, c92_vv.row_id desc
как в оригинале, то план запроса уже использует Cluster Index Scan.

Да это не важно ( не об этом речь если sql выбрал другой индекс обхода с его точки зрения sql так запрос будет отработан быстрее )
а речь о том что если посмотришь план выполнения sort
то поля ID OBJID отброшены.
  

test1.JPG ( 69 KB | Загрузки )
test1.JPG
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Медленное получение значения периодического реквизита
Ответ #29 - 11. Декабря 2009 :: 10:20
Печать  
А теперь расскажи, как у тебя из select * получилось select cast(c92_vv.value... ?
Смех
  

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