Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Триггер на Insert с обновлением некоторых колонок вставляемых данных? (число прочтений - 6700 )
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #15 - 02. Декабря 2011 :: 08:45
Печать  
Смысл в доп поле - отсутствие джойна лишней таблицы.
Более того, отсутствие джойна навернутой на всю бошку таблицы немаленьких размеров.

Цитата:
И, не у всех есть общие реквизиты докОснования.

Ну, во многих конфигурациях, наследованных от стандартных, этот реквизит есть (и он даже общий, хотя не всегда с отбором).
А если проектируешь базу "с нуля" - что мешает подумать о такм развитии событий.
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #16 - 02. Декабря 2011 :: 09:56
Печать  
Реальный пример. ПУБ, Регистра Партии, измерение Поставка имеет тип документ - вид - неопределенный.
Надо получить партии по FIFO, для этого надо сделать JOIN к журналу, но в журнале только 9 символов в ID, а в в измерении регистра - 13. Раньше делал через RIHGT, теперь можно напрямую.
Вот пример до того:
Код
Выбрать все
Declare @PERIODR DateTime
SET @PERIODR = Convert(DateTime,'20111201',112)

SELECT
	$TabR1.Счет AS Счет,
	$TabR1.МестоХранения AS МестоХранения,
	$TabR1.ТМЦ AS ТМЦ,
	$TabR1.Поставка AS Поставка,
	SUM($TabR1.ОстатокТовара) AS ОстатокТовара,
	SUM($TabR1.Стоимость)
FROM
	$РегистрИтоги.Партии AS TabR1 (NOLOCK)
	LEFT OUTER JOIN _1SJOURN AS Сорт_Поставка (NOLOCK) ON (Сорт_Поставка.IDDOC = RIGHT($TabR1.Поставка,9))
WHERE
	TabR1.PERIOD = @PERIODR

GROUP BY

	$TabR1.Счет,
	$TabR1.МестоХранения,
	$TabR1.ТМЦ,
	$TabR1.Поставка,
	Сорт_Поставка.DATE_TIME_IDDOC

ORDER BY
	$TabR1.Счет,
	$TabR1.МестоХранения,
	$TabR1.ТМЦ,
	Сорт_Поставка.DATE_TIME_IDDOC
 



А вот после добавление столбца IDDOC13:
Код
Выбрать все
Declare @PERIODR DateTime
SET @PERIODR = Convert(DateTime,'20111201',112)

SELECT
	$TabR1.Счет AS Счет,
	$TabR1.МестоХранения AS МестоХранения,
	$TabR1.ТМЦ AS ТМЦ,
	$TabR1.Поставка AS Поставка,
	SUM($TabR1.ОстатокТовара) AS ОстатокТовара,
	SUM($TabR1.Стоимость)
FROM
	$РегистрИтоги.Партии AS TabR1 (NOLOCK)
	LEFT OUTER JOIN _1SJOURN AS Сорт_Поставка (NOLOCK) ON (Сорт_Поставка.IDDOC13 = $TabR1.Поставка)
WHERE
	TabR1.PERIOD = @PERIODR

GROUP BY

	$TabR1.Счет,
	$TabR1.МестоХранения,
	$TabR1.ТМЦ,
	$TabR1.Поставка,
	Сорт_Поставка.DATE_TIME_IDDOC

ORDER BY
	$TabR1.Счет,
	$TabR1.МестоХранения,
	$TabR1.ТМЦ,
	Сорт_Поставка.DATE_TIME_IDDOC
 


В первом случае понятно что запрос выполняется быстрее при наличии индекса по IDDOC13 + DATE_TIME_IDDOC на таблицу _1SJOURN, а можно еще и на $TabR1.Поставка сделать индекс - будет еще лучше.
  
Наверх
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #17 - 02. Декабря 2011 :: 10:11
Печать  
я что-то не понял - у тебя поле IDDoc13 - оно не родное?
И каждый раз, как изменения затрагивают журнал, ты ручками восстанавливаешь и заполняешь эту колонку?
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #18 - 02. Декабря 2011 :: 10:16
Печать  
Satans Claws писал(а) 02. Декабря 2011 :: 10:11:
я что-то не понял - у тебя поле IDDoc13 - оно не родное?
И каждый раз, как изменения затрагивают журнал, ты ручками восстанавливаешь и заполняешь эту колонку?


Это делает SQL триггером, он сам это делает. Там не только IDDOC13, я еще сделал ДатаВремяДок - показывает нормальное Дата+Время в формате SQL. Единственное что, вот решаю, сделать отдельную таблицу с связью по ROW_ID или же добавить в _1SJOURN.
  
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #19 - 02. Декабря 2011 :: 10:16
Печать  
А в селект листе чего нет в запросе поля из date_time_iddoc ?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #20 - 02. Декабря 2011 :: 10:18
Печать  
Eprst писал(а) 02. Декабря 2011 :: 10:16:
А в селект листе чего нет в запросе поля из date_time_iddoc ?


а $TabR1.Поставка AS Поставка чем не нравится?

Тьфу, туплю.
Зачем в селекте позиция документа поставки?
по ней нужно просто отсортировать. А идентификатор поставки - это $TabR1.Поставка
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #21 - 02. Декабря 2011 :: 10:20
Печать  
Я про это поле:
Group by Сорт_Поставка.DATE_TIME_IDDOC

его же нет в селекте у тебя..
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #22 - 02. Декабря 2011 :: 10:21
Печать  
Eprst писал(а) 02. Декабря 2011 :: 10:16:
А в селект листе чего нет в запросе поля из date_time_iddoc ?


А он не нужен в результирующей выборке, по нему надо только отсортировать. Фактически можно было бы сделать MAX(), чтобы не включать в GROUP, но это может усложнить сортировку когда будут промежуточные итоги (WITH ROLLUP), но и это решаемо, надо проводить тесты какой запрос будет наиболее меньше требовать ресурсов.
  
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #23 - 02. Декабря 2011 :: 10:34
Печать  
в общем ясно..
И.. каков прирост в скорости ? примерно хоть.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #24 - 02. Декабря 2011 :: 11:25
Печать  
профит относительно чего?
относительно таблицы кросс-доков?
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #25 - 02. Декабря 2011 :: 11:31
Печать  
Вообще задача добиться Index seek вместо Index scan. Пока что это не удалось сделать, но look up уже не делает.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #26 - 02. Декабря 2011 :: 11:39
Печать  
(16) Вместо
SET @PERIODR = Convert(DateTime,'20111201',112)
пиши
SET @PERIODR = cast('20111201' as DateTime)


и все остальное как то не убедительно

насколько часто нужны запросы как (16) ?
Если не часто то подумай какой ценой ты получаешь этот
не очень большой выигрыш (выгрыш небольшой потому что просматриваем всего один месяц)
тригер это потери времени +
доп индекс это тоже потери времени +
увеличение длины поля _1sjourn это тоже потеря времени
для одних и тех же данных страниц будет просмотрено больше.
причем названные мной потери будут на любых запросах затрагивающих _1sjourn
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #27 - 02. Декабря 2011 :: 12:29
Печать  
Z1 писал(а) 02. Декабря 2011 :: 11:39:
(16) Вместо
SET @PERIODR = Convert(DateTime,'20111201',112)
пиши
SET @PERIODR = cast('20111201' as DateTime)


и все остальное как то не убедительно

насколько часто нужны запросы как (16) ?
Если не часто то подумай какой ценой ты получаешь этот
не очень большой выигрыш (выгрыш небольшой потому что просматриваем всего один месяц)
тригер это потери времени +
доп индекс это тоже потери времени +
увеличение длины поля _1sjourn это тоже потеря времени
для одних и тех же данных страниц будет просмотрено больше.
причем названные мной потери будут на любых запросах затрагивающих _1sjourn


Во всех модулях проведения документов, которые списывают складские позиции (их примерно от 300 до 800 в день).

Про потери наслышан и уже видел, поэтому и думаю сделать параллельно таблицу,  в которой сохранять нужные поля, опять же надо проводить тесты.
Самый простой тест, создать все как надо и перепровести документы за месяц. Если время уменьшиться - удачно.
Сейчас сделал хитрее, выборку делаю без джойна, а сортирую уже готовую таблицу. Но это нагрузка на сервер также, потому что 1С для этого делает курсор и получает документы по их ID чтобы потом получит DATE_TIME_IDDOC. Но этот подход дал прирост около 15%. Хотелось бы все таки все решить по максимуму производительности, вот и идет поиск решений.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #28 - 02. Декабря 2011 :: 13:07
Печать  
pvase писал(а) 02. Декабря 2011 :: 12:29:
Z1 писал(а) 02. Декабря 2011 :: 11:39:
(16) Вместо
SET @PERIODR = Convert(DateTime,'20111201',112)
пиши
SET @PERIODR = cast('20111201' as DateTime)


и все остальное как то не убедительно

насколько часто нужны запросы как (16) ?
Если не часто то подумай какой ценой ты получаешь этот
не очень большой выигрыш (выгрыш небольшой потому что просматриваем всего один месяц)
тригер это потери времени +
доп индекс это тоже потери времени +
увеличение длины поля _1sjourn это тоже потеря времени
для одних и тех же данных страниц будет просмотрено больше.
причем названные мной потери будут на любых запросах затрагивающих _1sjourn


Во всех модулях проведения документов, которые списывают складские позиции (их примерно от 300 до 800 в день).

Про потери наслышан и уже видел, поэтому и думаю сделать параллельно таблицу,  в которой сохранять нужные поля, опять же надо проводить тесты.
Самый простой тест, создать все как надо и перепровести документы за месяц. Если время уменьшиться - удачно.
Сейчас сделал хитрее, выборку делаю без джойна, а сортирую уже готовую таблицу. Но это нагрузка на сервер также, потому что 1С для этого делает курсор и получает документы по их ID чтобы потом получит DATE_TIME_IDDOC. Но этот подход дал прирост около 15%. Хотелось бы все таки все решить по максимуму производительности, вот и идет поиск решений.


И Вам нужно и партии тоже списывать в online ?
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Триггер на Insert с обновлением некоторых колонок вставляемых данных?
Ответ #29 - 02. Декабря 2011 :: 13:48
Печать  
Так вопрос как раз не про онлайн режим, а про ночное перепроведение, чтобы его ускорить.
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать