Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Независимая транзакция  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Есть процедура актуализации кеша справочников. Если заказанные справочники устарели, то она удаляет много строк и вставляет много новых.
Есть прооцедура сохранения документа, которой нужен актуальный кеш нескольких справочников.

Беда в том, что сохранение идет в нескольких вложенных транзакциях. И если справочник актуален не был, то посчитав мы получим кучу блокировок висящих на нашей транзакции.

Есть ли какой-то волшебный способ изнутри сохранения дернуть обновлен кеша так, что бы кеш сразу закомитился и был доступен всем остальным соединениям.

Подумал было в второну брокера, но там же тожe пока сейв не заккомитится, сервис кеш считать не начнет...
23 мар 17, 09:37    [20324078]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Mike_za,

Если только SNAPSHOT
23 мар 17, 09:51    [20324134]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Mike_za
Беда в том, что сохранение идет в нескольких вложенных транзакциях.
не очень понятно о каких вложенных транзакциях вы говорите
Mike_za
Есть ли какой-то волшебный способ изнутри сохранения дернуть обновлен кеша так, что бы кеш сразу закомитился и был доступен всем остальным соединениям.
обновлять копию справочника, после окончательного коммита подменять справочники (например через алиасы).
23 мар 17, 10:09    [20324214]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
aleksrov
Mike_za,

Если только SNAPSHOT


Не подходит. Еще один клиент, который захочет сохранить документ, потребует той же актуализации кеша. и запустит считать еще один свой экземпляр. два писателя подерутся
23 мар 17, 12:43    [20325194]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Дедушка
Mike_za
Беда в том, что сохранение идет в нескольких вложенных транзакциях.
не очень понятно о каких вложенных транзакциях вы говорите
Mike_za
Есть ли какой-то волшебный способ изнутри сохранения дернуть обновлен кеша так, что бы кеш сразу закомитился и был доступен всем остальным соединениям.
обновлять копию справочника, после окончательного коммита подменять справочники (например через алиасы).


Импорт (тран1) вызывает -> сохранение документа (тран2) -> НУЖЕН АКТУАЛЬНЫЙ КЕН (тран3).

Копию справочника обновлять и подменять не получится.
К примеру если сложная функция (на входе дата начала + дата окончания) на выходе 10к строк.
сколько заказали периодов, столько и наборов таких срезов для одного справочника.
23 мар 17, 12:45    [20325212]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Mike_za,

что-то тут, странное, но снапшот к этому не имеет отношения, как и RCSI...

автор
Беда в том, что сохранение идет в нескольких вложенных транзакциях. И если справочник актуален не был, то посчитав мы получим кучу блокировок висящих на нашей транзакции.

сначала мы сделаем себе афигенные грабли, а потом дружно на них прыгнем...
23 мар 17, 12:48    [20325235]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
TaPaK, скажите как сделать по другому?
23 мар 17, 13:09    [20325367]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
TaPaK,

предметная область:
есть много видом документов (таблицы со своими структурами).
есть много справочников (отдельные сложные ИНФ-ки, со своими структурами).

когда документ соединяется со своими справочниками, компиляция таких запросов занимает до секунды. Выполнение тоже не всегда бывает быстрое. Плюс тут море динамики и прочего. Единственным вменяемым выход - кешируем актуальные срезы ( дата - дата - справчоник)...
так как справочников и срезов слишком дохрена, сразу все посчитать нельзя. какие именно срезы нужны становится ясно уже в момент сохранения.

Единственный вопрос, как так актуализировать кеш, что бы все были довольны.
23 мар 17, 13:15    [20325409]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Mike_za
Импорт (тран1) вызывает -> сохранение документа (тран2) -> НУЖЕН АКТУАЛЬНЫЙ КЕН (тран3).

Копию справочника обновлять и подменять не получится.
К примеру если сложная функция (на входе дата начала + дата окончания) на выходе 10к строк.
сколько заказали периодов, столько и наборов таких срезов для одного справочника.
из ваших слов не понятно ничего (кроме вас специфику вашей системы ни кто не знает).

1. архитектору системы "по шарам"
2. определитесь синхронная у вас система или асинхронная
3. попробуйте обновлять ваш "кеш" более мелкими частями
4. все остальные варианты (ну на вскидку) потребуют значительного изменения в вашей ситеме (конско-сферически)
23 мар 17, 13:16    [20325422]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Mike_za
когда документ соединяется со своими справочниками, компиляция таких запросов занимает до секунды. Выполнение тоже не всегда бывает быстрое. Плюс тут море динамики и прочего. Единственным вменяемым выход - кешируем актуальные срезы ( дата - дата - справчоник)...
так как справочников и срезов слишком дохрена, сразу все посчитать нельзя. какие именно срезы нужны становится ясно уже в момент сохранения.
как вы понимаете, что какой-то закешированный срез нужно обновить?
23 мар 17, 13:21    [20325455]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Mike_za,
использовать т.н. кеш, в системе где он быстро устаревает, выглядит странно. Тут наверное стоит сражаться за то, чтобы не считали по не актульным данным, пусть лучше уйдут с ничем
23 мар 17, 13:22    [20325463]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
TaPaK,

он устаревает не так уж и часто. Просто его может не оказаться в нужный момент.
23 мар 17, 13:29    [20325508]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Дедушка
Mike_za
когда документ соединяется со своими справочниками, компиляция таких запросов занимает до секунды. Выполнение тоже не всегда бывает быстрое. Плюс тут море динамики и прочего. Единственным вменяемым выход - кешируем актуальные срезы ( дата - дата - справчоник)...
так как справочников и срезов слишком дохрена, сразу все посчитать нельзя. какие именно срезы нужны становится ясно уже в момент сохранения.
как вы понимаете, что какой-то закешированный срез нужно обновить?


в момент модификации базовых данных, все зависящие от них срезы маркируются устаревшими.
в момент потребности в кеше, если кеша нет либо он устарел, то он считается.
23 мар 17, 13:30    [20325518]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Mike_za
в момент модификации базовых данных, все зависящие от них срезы маркируются устаревшими.
в момент потребности в кеше, если кеша нет либо он устарел, то он считается.
Mike_za
он устаревает не так уж и часто. Просто его может не оказаться в нужный момент.
тогда считайте эти ваши срезы по событию "все зависящие от них срезы маркируются устаревшими" отдельным процессом. с процессом "записи в таблицы" определитесь если возможность отдать ему "старый кеш" если новый в процессе перерасчёта.
23 мар 17, 13:37    [20325561]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Дедушка,
мысль понятно, можно тот же брокер натравить, и он будет постоянно актуализировать кеши.
Но как быть, если нужен кеш который еще не считали?
23 мар 17, 14:19    [20325911]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2202
Mike_za
TaPaK, скажите как сделать по другому?

Вообще отказаться от кеша
Индексы сделать и т.п.
23 мар 17, 14:25    [20325954]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2202
Дедушка
1. архитектору системы "по шарам"

тоже правильный совет
23 мар 17, 14:28    [20325976]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
s_ustinov
Mike_za
TaPaK, скажите как сделать по другому?

Вообще отказаться от кеша
Индексы сделать и т.п.
\
если, честно, то я бы при такой ситуации и смотрел в сторону оптимизации работы с источниками. Все варианты работы с сохранёнными витринами всегда упирались в поддержку актуальности, если это статика (типа посчитали -сохранили ) то есть варианты
23 мар 17, 14:29    [20325991]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
s_ustinov
Дедушка
1. архитектору системы "по шарам"

тоже правильный совет

какая именно часть системы вам смущает?
23 мар 17, 14:35    [20326041]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
s_ustinov
Mike_za
TaPaK, скажите как сделать по другому?

Вообще отказаться от кеша
Индексы сделать и т.п.


индексы ускорят выполнение, не не спасут от дорогих компиляцией и рекомпиляций.
23 мар 17, 14:35    [20326046]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Mike_za
s_ustinov
пропущено...

Вообще отказаться от кеша
Индексы сделать и т.п.


индексы ускорят выполнение, не не спасут от дорогих компиляцией и рекомпиляций.

tckb RIGHT(REPLICATE('0', 10) + CAST(a.Code AS varchar(10)), 10)если вы упираетесь в компиляцию, то что-то вы делаете не так... qury store там, прибейте планы...
23 мар 17, 14:38    [20326071]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
TaPaK,

я упираюсь в компиляции из-за внешних времянок, и пакости типа ##ываваыа_GUID...
меня тут ничего кроме упрощения планов не спасет
23 мар 17, 14:42    [20326098]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2202
Mike_za
s_ustinov
пропущено...

тоже правильный совет

какая именно часть системы вам смущает?


Вот эта:
Mike_za
есть много видом документов (таблицы со своими структурами).
есть много справочников (отдельные сложные ИНФ-ки, со своими структурами).

когда документ соединяется со своими справочниками, компиляция таких запросов занимает до секунды. Выполнение тоже не всегда бывает быстрое. Плюс тут море динамики и прочего. Единственным вменяемым выход - кешируем актуальные срезы ( дата - дата - справчоник)...

Внутренний голос настойчиво подсказывает, что схему БД делал человек с "не очень хорошим" пониманием теории баз данных.
Дабы перевести разговор в более конструктивное русло - можно пример одного из таких сложных справочников привести?
23 мар 17, 14:42    [20326100]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
s_ustinov
Mike_za
пропущено...

какая именно часть системы вам смущает?


Вот эта:
Mike_za
есть много видом документов (таблицы со своими структурами).
есть много справочников (отдельные сложные ИНФ-ки, со своими структурами).

когда документ соединяется со своими справочниками, компиляция таких запросов занимает до секунды. Выполнение тоже не всегда бывает быстрое. Плюс тут море динамики и прочего. Единственным вменяемым выход - кешируем актуальные срезы ( дата - дата - справчоник)...

Внутренний голос настойчиво подсказывает, что схему БД делал человек с "не очень хорошим" пониманием теории баз данных.
Дабы перевести разговор в более конструктивное русло - можно пример одного из таких сложных справочников привести?


с пониманием базы и реляционной теории у авторов было все хорошо...

картинка для устрашения
https://yadi.sk/i/ZHQxsb0q3GGzt9

+
ALTER function ..
(
	@StartDate datetime
	,@EndDate datetime
	,@Variant_ID uniqueidentifier
)
returns table 
as 
return
select
	[ИРХ_РЕГ2].ID as [IRH_REG2_ID]
	,[ИРХ_РЕГ2].AID as [IRH_REG2_AID]
	,[ИРХ_РЕГ2].Catalog_ID
	,[ИРХ_РЕГ2].Owner_ID
	,[ИРХ_РЕГ2].[IRH_REG2_Vers_ID]
	,[ИРХ_РЕГ2].[IRH_REG2_Vers_AID]
	,[ИРХ_РЕГ2].StartDate
	,[ИРХ_РЕГ2].EndDate
	,[ИРХ_РЕГ2].Variant_ID
	,[ИРХ_РЕГ2].[UBP_ID]
	,[ИРХ_РЕГ2].[EMail]
	,[ИРХ_РЕГ2].[Order_Number]
	,case
	when [Гос].[Gos_ID] is not null then 'Гос'
	when [ДепМНЦП].[DepMNCP_ID] is not null then 'ДепМНЦП'
	when [ДМС].[DMS_ID] is not null then 'ДМС'
	when [ЗАТО].[ZATO_ID] is not null then 'ЗАТО'
	when [КБС].[KBS_ID] is not null then 'КБС'
	when [МНЦП].[MNCP_ID] is not null then 'МНЦП'
	when [ПВОДМС].[PVODMS_ID] is not null then 'ПВОДМС'
	when [ПосОБР].[PosOBR_ID] is not null then 'ПосОБР'
	when [Рег].[Reg_ID] is not null then 'Рег'
	when [СБМНЦП].[SBMNCP_ID] is not null then 'СБМНЦП'
	when [СБС].[SBS_ID] is not null then 'СБС'
	when [ТГВФ].[TGVF_ID] is not null then 'ТГВФ'
	when [УК].[UK_ID] is not null then 'УК'
	else '_Неизвестный'
end as [Catalog_Code]
	,coalesce([Гос].[code], [ДепМНЦП].[code], [ДМС].[code], [ЗАТО].[code], [КБС].[code], [МНЦП].[code], [ПВОДМС].[code], [ПосОБР].[code], [Рег].[code], [СБМНЦП].[code], [СБС].[code], [ТГВФ].[code], [УК].[code]) as [code]
	,coalesce([Гос].[Name], [ДепМНЦП].[Name], [ДМС].[Name], [ЗАТО].[Name], [КБС].[Name], [МНЦП].[Name], [ПВОДМС].[Name], [ПосОБР].[Name], [Рег].[Name], [СБМНЦП].[Name], [СБС].[Name], [ТГВФ].[Name], [УК].[Name]) as [Name]
	,[ИРХ_РЕГ2].[Parent_IRH_REG2_ID]
	,[ИРХ_РЕГ2].Property
from
	(
	select
		E.ID
		,E.AID
		,E.Catalog_ID
		,E.Owner_ID
		,V.ID as [IRH_REG2_Vers_ID]
		,V.AID as [IRH_REG2_Vers_AID]
		,V.StartDate
		,V.EndDate
		,V.Variant_ID
		,E.[UBP_ID]
		,V.[EMail]
		,V.[Order_Number]
		,V.[Parent_IRH_REG2_ID]
		,V.Property
	from
		spr.[IRH_REG2] as E
		inner join spr.[IRH_REG2_Vers] as V on
			V.[IRH_REG2_ID] = E.ID
	) as [ИРХ_РЕГ2]
	left join spr.[ifn_KBS](@StartDate, @EndDate, @Variant_ID) as [КБС] on
		[КБС].[KBS_ID] = [ИРХ_РЕГ2].ID
	left join spr.[ifn_Reg](@StartDate, @EndDate, @Variant_ID) as [Рег] on
		[Рег].[Reg_ID] = [ИРХ_РЕГ2].ID
	left join spr.[ifn_TGVF](@StartDate, @EndDate, @Variant_ID) as [ТГВФ] on
		[ТГВФ].[TGVF_ID] = [ИРХ_РЕГ2].ID
	left join spr.[ifn_Gos](@StartDate, @EndDate, @Variant_ID) as [Гос] on
		[Гос].[Gos_ID] = [ИРХ_РЕГ2].ID
	left join spr.[ifn_ZATO](@StartDate, @EndDate, @Variant_ID) as [ЗАТО] on
		[ЗАТО].[ZATO_ID] = [ИРХ_РЕГ2].ID
	left join spr.[ifn_SBMNCP](@StartDate, @EndDate, @Variant_ID) as [СБМНЦП] on
		[СБМНЦП].[SBMNCP_ID] = [ИРХ_РЕГ2].ID
	left join spr.[ifn_UK](@StartDate, @EndDate, @Variant_ID) as [УК] on
		[УК].[UK_ID] = [ИРХ_РЕГ2].ID
	left join spr.[ifn_PosOBR](@StartDate, @EndDate, @Variant_ID) as [ПосОБР] on
		[ПосОБР].[PosOBR_ID] = [ИРХ_РЕГ2].ID
	left join spr.[ifn_PVODMS](@StartDate, @EndDate, @Variant_ID) as [ПВОДМС] on
		[ПВОДМС].[PVODMS_ID] = [ИРХ_РЕГ2].ID
	left join spr.[ifn_DMS](@StartDate, @EndDate, @Variant_ID) as [ДМС] on
		[ДМС].[DMS_ID] = [ИРХ_РЕГ2].ID
	left join spr.[ifn_MNCP](@StartDate, @EndDate, @Variant_ID) as [МНЦП] on
		[МНЦП].[MNCP_ID] = [ИРХ_РЕГ2].ID
	left join spr.[ifn_SBS](@StartDate, @EndDate, @Variant_ID) as [СБС] on
		[СБС].[SBS_ID] = [ИРХ_РЕГ2].ID
	left join spr.[ifn_DepMNCP](@StartDate, @EndDate, @Variant_ID) as [ДепМНЦП] on
		[ДепМНЦП].[DepMNCP_ID] = [ИРХ_РЕГ2].ID
where
	[ИРХ_РЕГ2].Variant_ID = @Variant_ID
	and [ИРХ_РЕГ2].StartDate = (
											select
												max(_VERS.StartDate) as StartDate 
											from
												spr.[IRH_REG2_Vers] as _VERS
											where
												_VERS.[IRH_REG2_ID] = [ИРХ_РЕГ2].ID
												and _VERS.Variant_ID = @Variant_ID
												and (
														_VERS.StartDate < @EndDate
														or @EndDate is null
													)
										)
	and ([ИРХ_РЕГ2].EndDate > isnull(@StartDate, '19000101') or [ИРХ_РЕГ2].EndDate is null)
	and coalesce([КБС].[KBS_ID],[Рег].[Reg_ID],[ТГВФ].[TGVF_ID],[Гос].[Gos_ID],[ЗАТО].[ZATO_ID],[СБМНЦП].[SBMNCP_ID],[УК].[UK_ID],[ПосОБР].[PosOBR_ID],[ПВОДМС].[PVODMS_ID],[ДМС].[DMS_ID],[МНЦП].[MNCP_ID],[СБС].[SBS_ID],[ДепМНЦП].[DepMNCP_ID]) is not null 
23 мар 17, 14:58    [20326195]     Ответить | Цитировать Сообщить модератору
 Re: Независимая транзакция  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Mike_za
Но как быть, если нужен кеш который еще не считали?
а как вы его сейчас создаёте?
23 мар 17, 15:27    [20326334]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить