Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 6 ОтправитьПечать
Очень популярная тема (более 25 ответов) Вопрос по ТП (число прочтений - 16217 )
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #30 - 13. Октября 2009 :: 12:51
Печать  
Провожу дальнейшие исследования на тему ускорения работы ТП.
Обнаружилась у меня одна базка, с бОООльшим количеством доков. Если открыть журнал на ТП, например за год, скроллинг тормозит секунды 3. Это сводит на нет всю идею реализации.

Вот, какую идею хочу обсудить:
1. Делаем временную таблицу, ##temp_1sjourn.
Код
Выбрать все
ТекстЗапроса = "
	|SELECT
	|	date_time_iddoc,
	|	iddoc,
	|	iddocdef,
	|	docno
	|into
	|	##temp_1sjourn
	|FROM
	|	_1sjourn
	|WHERE
	|	1 = 0
	|";
 


2. Загоняем в нее "ближайшие" для текущего документа доки .

Код
Выбрать все
ТекстЗапроса = "
	|INSERT
	|	##temp_1sjourn
	|SELECT
	|	top 100
	|	date_time_iddoc,
	|	iddoc,
	|	iddocdef,
	|	docno
	|FROM
	|	_1sjourn (NOLOCK INDEX=JOURNAL)
	|WHERE
	|	IDJOURNAL = " + МД.ИДОбъекта(Метаданные.Журнал("Акции")) + " and
	|	date_time_iddoc >= :Док
	|ORDER BY
	|	date_time_iddoc
	|";
 



Код
Выбрать все
ТекстЗапроса = "
	|INSERT
	|	##temp_1sjourn
	|SELECT
	|	top 100
	|	date_time_iddoc,
	|	iddoc,
	|	iddocdef,
	|	docno
	|FROM
	|	_1sjourn (NOLOCK INDEX=JOURNAL)
	|WHERE
	|	IDJOURNAL = " + МД.ИДОбъекта(Метаданные.Журнал("Акции")) + " and
	|	date_time_iddoc < :Док
	|ORDER BY
	|	date_time_iddoc DESC
	|";
 



3. В запросе для ТП ссылаемся на временную таблицу

Код
Выбрать все
|	FROM
|		##temp_1sjourn Журн (NOLOCK)-- _1SJourn Журн (NOLOCK INDEX=JOURNAL)
|	INNER JOIN
|		$Документ.ПриходАкций ПриходАкций
|	On
|		--IDJOURNAL = " + МД.ИДОбъекта(Метаданные.Журнал("Акции")) + " and
|		--Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата and
|		Журн.iddocdef = $ВидДокумента.ПриходАкций and
|		Журн.iddoc = ПриходАкций.iddoc
 



4. В обработке события ПриАктивизацииСтроки, обновляем временную таблицу.
5. В обработке события ПриНажатииКнопкиКлавиатуры обрабатываем "Номе" и "End".

У меня на боевой базе, даже при установке периода в 3 года , все летает.
Вопрос: Утопична ли такая реализация?

  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #31 - 13. Октября 2009 :: 13:21
Печать  
Так вроде ж поставщик для ТП примерно так и делает, как ты написал
Код
Выбрать все
|INSERT
	|	##temp_1sjourn
	|SELECT
	|	top 100
	|	date_time_iddoc,
	|	iddoc,
	|	iddocdef,
	|	docno
	|FROM
	|	_1sjourn (NOLOCK INDEX=JOURNAL)
	|WHERE
	|	IDJOURNAL = " + МД.ИДОбъекта(Метаданные.Журнал("Акции")) + " and
	|	date_time_iddoc < :Док
	|ORDER BY
	|	date_time_iddoc DESC
	|"; 


за счет чего ускорение-то не пойму...
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #32 - 13. Октября 2009 :: 13:38
Печать  
Насколько я понял, поставщик сначала делает полный запрос, а потом от него отрезает видимую часть.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #33 - 13. Октября 2009 :: 14:44
Печать  
Цитата:
4. В обработке события ПриАктивизацииСтроки, обновляем временную таблицу.
5. В обработке события ПриНажатииКнопкиКлавиатуры обрабатываем "Номе" и "End".

У меня на боевой базе, даже при установке периода в 3 года , все летает.
Вопрос: Утопична ли такая реализация?

Я только не понял а если другой пользователь изменит документ
(или вообще создаст новый  документ ) то как это попадет во
временную таблицу ?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #34 - 13. Октября 2009 :: 16:46
Печать  
chessman писал(а) 13. Октября 2009 :: 13:38:
Насколько я понял, поставщик сначала делает полный запрос, а потом от него отрезает видимую часть.

Скуля нет, поэтому проверить не могу, но очень сомневаюсь, что он работает именно так. Нафиг тогда он вообще нужен? Это равносильно выполнению запроса и отображению результата этого запроса ТЗ в ТП.
Может ты просто в индекс не попадаешь или ключ порядка выбран неверно?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #35 - 13. Октября 2009 :: 17:46
Печать  
JohnyDeath писал(а) 13. Октября 2009 :: 16:46:
Может ты просто в индекс не попадаешь или ключ порядка выбран неверно?

См. #2
  

1&&2&&3
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #36 - 14. Октября 2009 :: 08:12
Печать  
Да уж, с таким запросом конечно не просто. Правда непонятно, как на таком запросе проявится эффект с временной таблицей, вроде ничего существенного не изменится.
З.Ы. По поводу п.2 - мне кажется индекс DOCTYPE здесь будет более оптимальным, так как в журнале "Акции" находятся и документы "ПриходАкция" и "РасходАкция", да и еще какие-нибудь могут быть. При использовании же указанного мной индекса конечная выборка будет существенно меньше. Так же, при этом, условие на принадлежность к журналу "Акции" становится ненужным.
  
Наверх
ICQ  
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #37 - 14. Октября 2009 :: 08:20
Печать  
Вот, что приезжает в источник данных

Вариант 1. "Обычный" запрос для ТП:

Код
Выбрать все
select top 20
	tmp.date_time_iddoc as Д_Т_ИдДок,
	tmp.iddoc as Док,
	tmp.Док_вид as Док_вид,
	tmp.ДатаДок as ДатаДок,
	tmp.НомерДок as НомерДок,
	tmp.НомерСделки as НомерСделки,
	Акции.Code as АкцииКод,
	Акции.descr as Акции,
	dbo._format(tmp.Приход) as Приход,
	dbo._format(tmp.Расход) as Расход,
	Биржи.code as Биржа
from (SELECT
		Журн.date_time_iddoc,
		Журн.iddoc,
		Журн.iddocdef			Док_вид,
		Журн.date_time_iddoc	ДатаДок,
		Журн.docno				НомерДок,
		ПриходАкций.sp52573 	НомерСделки,
		ПриходАкций.sp54733		Акции,
		ПриходАкций.sp54736		Приход,
		0 						Расход,
		ПриходАкций.sp51143		Биржа
	FROM
		_1SJourn Журн (NOLOCK INDEX=ACDATETIME)
	INNER JOIN
		dh51158 ПриходАкций
	On
		IDJOURNAL = 51238 and
		Журн.date_time_iddoc BETWEEN '20090101     0     0   ' AND '20091231ZZZZZZZZZZZZZZZ' and
		Журн.iddoc = ПриходАкций.iddoc

	UNION ALL

	SELECT
		Журн.date_time_iddoc,
		Журн.iddoc,
		Журн.iddocdef,
		Журн.date_time_iddoc,
		Журн.docno,
		РасходАкций.sp52581,
		РасходАкций.sp54738		,
		0,
		РасходАкций.sp54741,
		РасходАкций.sp51163
	FROM
		dh51179 РасходАкций (NOLOCK)
	INNER JOIN
		_1SJourn Журн (NOLOCK INDEX=ACDATETIME) 	On
		IDJOURNAL = 51238 and
		Журн.date_time_iddoc BETWEEN '20090101     0     0   ' AND '20091231ZZZZZZZZZZZZZZZ' and
		Журн.iddoc = РасходАкций.iddoc

	) tmp
LEFT JOIN
	sc47536 Акции
On
	tmp.Акции = Акции.id
LEFT JOIN
	sc47525 Биржи
On
	tmp.Биржа = Биржи.id
where
	(1 = 1)
order by
	tmp.date_time_iddoc
 




Источник.УстКлючПорядка("Д_Т_ИдДок ASC");
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #38 - 14. Октября 2009 :: 08:22
Печать  
Вариант 2. "Изврат для ТП"

Код
Выбрать все
select top 22
	tmp.date_time_iddoc as Д_Т_ИдДок,
	tmp.iddoc as Док,
	tmp.Док_вид as Док_вид,
	tmp.ДатаДок as ДатаДок,
	tmp.НомерДок as НомерДок,
	tmp.НомерСделки as НомерСделки,
	Акции.Code as АкцииКод,
	Акции.descr as Акции,
	dbo._format(tmp.Приход) as Приход,
	dbo._format(tmp.Расход) as Расход,
	Биржи.code as Биржа
from (SELECT
		Журн.date_time_iddoc,
		Журн.iddoc,
		Журн.iddocdef			Док_вид,
		Журн.date_time_iddoc	ДатаДок,
		Журн.docno				НомерДок,
		ПриходАкций.sp52573 	НомерСделки,
		ПриходАкций.sp54733		Акции,
		ПриходАкций.sp54736		Приход,
		0 						Расход,
		ПриходАкций.sp51143		Биржа
	FROM
		##temp_1sjourn Журн (NOLOCK)
	INNER JOIN
		dh51158 ПриходАкций
	On
		Журн.iddocdef = 51158 and
		Журн.iddoc = ПриходАкций.iddoc

	UNION ALL

	SELECT
		Журн.date_time_iddoc,
		Журн.iddoc,
		Журн.iddocdef,
		Журн.date_time_iddoc,
		Журн.docno,
		РасходАкций.sp52581,
		РасходАкций.sp54738,
		0,
		РасходАкций.sp54741,
		РасходАкций.sp51163
	FROM
		dh51179 РасходАкций (NOLOCK)
	INNER JOIN
		##temp_1sjourn Журн (NOLOCK)
	On
		Журн.iddocdef = 51179 and
		Журн.iddoc = РасходАкций.iddoc
	) tmp
LEFT JOIN
	sc47536 Акции
On
	tmp.Акции = Акции.id
LEFT JOIN
	sc47525 Биржи
On
	tmp.Биржа = Биржи.id
order
	by tmp.date_time_iddoc 



Источник.УстКлючПорядка("Д_Т_ИдДок ASC");
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #39 - 14. Октября 2009 :: 08:24
Печать  
Вариант 1 - тормоза на 3-х летнем журнале.
Вариант 2 - проблем нет.

Где я лажаю?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #40 - 14. Октября 2009 :: 08:40
Печать  
Вон оно как. С таким запросом, конечно, как уже говорили, ничего хорошего не увидишь.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #41 - 14. Октября 2009 :: 08:40
Печать  
chessman писал(а) 14. Октября 2009 :: 08:24:
Вариант 1 - тормоза на 3-х летнем журнале.
Вариант 2 - проблем нет.

Где я лажаю?

речь о #37
так вроде обсуждали
надо использовать индекс (NOLOCK INDEX=JOURNAL)
Вы же явно указываете  (NOLOCK INDEX=ACDATETIME)
поэтому sql вынужден пробегать
весь журнал документов.
в #38  Вы не указываете индекс для
##temp_1sjourn и sql сам находит индекс наилучшим способом
исходя из своей статистики.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #42 - 14. Октября 2009 :: 08:49
Печать  
Z1 писал(а) 14. Октября 2009 :: 08:40:
chessman писал(а) 14. Октября 2009 :: 08:24:
Вариант 1 - тормоза на 3-х летнем журнале.
Вариант 2 - проблем нет.

Где я лажаю?

речь о #37
так вроде обсуждали
надо использовать индекс (NOLOCK INDEX=JOURNAL)
Вы же явно указываете  (NOLOCK INDEX=ACDATETIME)
поэтому sql вынужден пробегать
весь журнал документов.
в #38  Вы не указываете индекс для
##temp_1sjourn и sql сам находит индекс наилучшим способом
исходя из своей статистики.


Пробовал и тот и этот, результат не менялся.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #43 - 14. Октября 2009 :: 08:52
Печать  
JohnyDeath писал(а) 14. Октября 2009 :: 08:40:
Вон оно как. С таким запросом, конечно, как уже говорили, ничего хорошего не увидишь.


Так речь вроде шла про то, что у меня КП был "неправильный", в зависимости от колонки сортировки. Ну, вот я взял самый простой - по дате.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #44 - 14. Октября 2009 :: 09:02
Печать  
chessman писал(а) 14. Октября 2009 :: 08:52:
JohnyDeath писал(а) 14. Октября 2009 :: 08:40:
Вон оно как. С таким запросом, конечно, как уже говорили, ничего хорошего не увидишь.


Так речь вроде шла про то, что у меня КП был "неправильный", в зависимости от колонки сортировки. Ну, вот я взял самый простой - по дате.

я в Тп и Кп плохо разбираюсь больше в самом sql.
ответ написан чисто по тому что написано в  #37
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 6
ОтправитьПечать