powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что такое CWT_PrimaryKey и с чем его едят?
3 сообщений из 3, страница 1 из 1
Что такое CWT_PrimaryKey и с чем его едят?
    #40080406
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select --PlanAnalizeMarker
	objset.rs_rgobj_id
	, regobj.rgob_name
	, (
		select
			sum(dbo.IntersectPeriodsLength(:BeginDayTech, getdate(), sts.rs_bperiod, sts.rs_eperiod))
		from
			mre_regobj_states sts
		where
			sts.rs_regobj_id = regobj.rgob_id 
			and sts.rs_state_id = :EmergencyStateId
			and sts.rs_bperiod <= getdate() 
			and (sts.rs_eperiod > :BeginDayTech or sts.rs_eperiod is null)
		) EmergencyDay
from
	mre_regobj_setobj objset
	left join mre_regobjects_lst regobj on regobj.rgob_id = objset.rs_rgobj_id
where
	objset.rs_setobj_id = :rs_setobj_id


Выполняться он может двумя способами (планы прилагаю). Зависит это от опции FetchOptions.CursorKind: ckAutomatic = GoodShort, ckDynamic = BadShort (Delphi компонент доступа к БД FireDAC TFDQuery). Вопрос что за дикий план BadShort, где почитать про CWT_PrimaryKey, и каким хинтом прибить план к хорошему варианту?

mre_regobj_setobj Наборы объектов, 2 записи
rs_idrs_rgobj_idrs_setobj_id31433102433

mre_regobjects_lst Каталог объектов, 2 записи
rgob_idrgob_typergob_name10Объект 120Объект 2

mre_regobj_states Состояние объектов, 2 записи (с 2021-03-29 01:00:00.000 по 2021-03-30 06:00:00.000 в ремонте, после в работе по текущий момент)
rs_idrs_regobj_idrs_bperiodrs_eperiodrs_state_id112021-03-29 01:00:00.0002021-03-30 06:00:00.000435212021-03-30 06:00:00.000NULL437

Скалярная функция IntersectPeriodsLength просто считает пересечения интервалов, к таблицам не обращается.
ddl
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[mre_regobj_setobj](
	[rs_id] [bigint] IDENTITY(1,1) NOT NULL,
	[rs_rgobj_id] [int] NOT NULL,
	[rs_setobj_id] [int] NOT NULL,
	[jrn_create_date] [datetime] NOT NULL,
	[jrn_create_user_id] [int] NOT NULL,
	[jrn_modif_date] [datetime] NOT NULL,
	[jrn_modif_user_id] [int] NOT NULL,
 CONSTRAINT [PK_mre_regobj_setobj] PRIMARY KEY CLUSTERED 
(
	[rs_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[mre_regobj_setobj]  WITH CHECK ADD  CONSTRAINT [FK_mre_regobj_setobj_regobj] FOREIGN KEY([rs_rgobj_id])
REFERENCES [dbo].[mre_regobjects_lst] ([rgob_id])
GO

ALTER TABLE [dbo].[mre_regobj_setobj] CHECK CONSTRAINT [FK_mre_regobj_setobj_regobj]
GO

ALTER TABLE [dbo].[mre_regobj_setobj]  WITH CHECK ADD  CONSTRAINT [FK_mre_regobj_setobj_setobj] FOREIGN KEY([rs_setobj_id])
REFERENCES [dbo].[com_analitics_sp] ([ansp_id])
GO

ALTER TABLE [dbo].[mre_regobj_setobj] CHECK CONSTRAINT [FK_mre_regobj_setobj_setobj]
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ИД' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobj_setobj', @level2type=N'COLUMN',@level2name=N'rs_id'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Объект' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobj_setobj', @level2type=N'COLUMN',@level2name=N'rs_rgobj_id'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Набор объектов' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobj_setobj', @level2type=N'COLUMN',@level2name=N'rs_setobj_id'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Вхождение объектов в наборы' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobj_setobj'
GO

CREATE UNIQUE NONCLUSTERED INDEX [IX_mre_regobj_setobj_rs] ON [dbo].[mre_regobj_setobj]
(
	[rs_rgobj_id] ASC,
	[rs_setobj_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [IX_mre_regobj_setobj_setobj] ON [dbo].[mre_regobj_setobj]
(
	[rs_setobj_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO




CREATE TABLE [dbo].[mre_regobjects_lst](
	[rgob_id] [int] IDENTITY(1,1) NOT NULL,
	[rgob_type] [tinyint] NOT NULL,
	[rgob_object_id] [int] NULL,
	[rgob_image_id] [bigint] NULL,
	[rgob_name] [nvarchar](255) NULL,
	[rgob_shortname] [nvarchar](25) NULL,
	[jrn_create_date] [datetime] NOT NULL,
	[jrn_create_user_id] [int] NOT NULL,
	[jrn_modif_date] [datetime] NOT NULL,
	[jrn_modif_user_id] [int] NOT NULL,
 CONSTRAINT [PK_mre_regobjects_lst] PRIMARY KEY CLUSTERED 
(
	[rgob_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Тип карточки: 0 - ручное заведение объекта, 1 - по ссылке на mre_objects_lst' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobjects_lst', @level2type=N'COLUMN',@level2name=N'rgob_type'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Объект' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobjects_lst', @level2type=N'COLUMN',@level2name=N'rgob_object_id'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Изображение объекта' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobjects_lst', @level2type=N'COLUMN',@level2name=N'rgob_image_id'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Наименование (используется если тип ручной)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobjects_lst', @level2type=N'COLUMN',@level2name=N'rgob_name'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Краткое наименование' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobjects_lst', @level2type=N'COLUMN',@level2name=N'rgob_shortname'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Объекты для учёта состояния' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobjects_lst'
GO




CREATE TABLE [dbo].[mre_regobj_states](
	[rs_id] [bigint] IDENTITY(1,1) NOT NULL,
	[rs_regobj_id] [int] NOT NULL,
	[rs_bperiod] [datetime] NOT NULL,
	[rs_eperiod] [datetime] NULL,
	[rs_state_id] [int] NOT NULL,
	[jrn_create_date] [datetime] NOT NULL,
	[jrn_create_user_id] [int] NOT NULL,
	[jrn_modif_date] [datetime] NOT NULL,
	[jrn_modif_user_id] [int] NOT NULL,
 CONSTRAINT [PK_mre_regobj_states] PRIMARY KEY CLUSTERED 
(
	[rs_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[mre_regobj_states]  WITH CHECK ADD  CONSTRAINT [FK_mre_regobj_states_regobj] FOREIGN KEY([rs_regobj_id])
REFERENCES [dbo].[mre_regobjects_lst] ([rgob_id])
GO

ALTER TABLE [dbo].[mre_regobj_states] CHECK CONSTRAINT [FK_mre_regobj_states_regobj]
GO

ALTER TABLE [dbo].[mre_regobj_states]  WITH CHECK ADD  CONSTRAINT [FK_mre_regobj_states_state] FOREIGN KEY([rs_state_id])
REFERENCES [dbo].[com_analitics_sp] ([ansp_id])
GO

ALTER TABLE [dbo].[mre_regobj_states] CHECK CONSTRAINT [FK_mre_regobj_states_state]
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Объект' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobj_states', @level2type=N'COLUMN',@level2name=N'rs_regobj_id'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Действует с' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobj_states', @level2type=N'COLUMN',@level2name=N'rs_bperiod'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Действует по' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobj_states', @level2type=N'COLUMN',@level2name=N'rs_eperiod'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Состояние' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobj_states', @level2type=N'COLUMN',@level2name=N'rs_state_id'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Состояние объектов' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'mre_regobj_states'
GO


CREATE UNIQUE NONCLUSTERED INDEX [IX_mre_regobj_states_obj_bper_eper_u] ON [dbo].[mre_regobj_states]
(
	[rs_regobj_id] ASC,
	[rs_bperiod] ASC,
	[rs_eperiod] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO


CREATE NONCLUSTERED INDEX [IX_mre_regobj_states_state_obj_per] ON [dbo].[mre_regobj_states]
(
	[rs_state_id] ASC,
	[rs_regobj_id] ASC,
	[rs_bperiod] ASC,
	[rs_eperiod] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO



CREATE   FUNCTION [dbo].[IntersectPeriodsLength](@Period1Begin datetime, @Period1End datetime, @Period2Begin datetime, @Period2End datetime)
RETURNS bigint
AS
BEGIN
	if @Period1End < @Period1Begin or @Period2End < @Period2Begin
		return null;
	declare
		@PeriodBeginMaximum datetime, @PeriodEndMinimum datetime, @Result bigint;
	if @Period1Begin is null
		set @PeriodBeginMaximum = @Period2Begin
	else begin
		if @Period2Begin is null
			set @PeriodBeginMaximum = @Period1Begin
		else begin
			if @Period1Begin > @Period2Begin
				set @PeriodBeginMaximum = @Period1Begin
			else
				set @PeriodBeginMaximum = @Period2Begin;
		end;
	end;
	if @Period1End is null
		set @PeriodEndMinimum = @Period2End
	else begin
		if @Period2End is null
			set @PeriodEndMinimum = @Period1End
		else begin
			if @Period1End < @Period2End
				set @PeriodEndMinimum = @Period1End
			else
				set @PeriodEndMinimum = @Period2End;
		end;
	end;
	if @PeriodBeginMaximum is null or @PeriodEndMinimum is null
		set @Result = null
	else
		set @Result = datediff_big(second, @PeriodBeginMaximum, @PeriodEndMinimum);
	return @Result;
END
GO


...
Рейтинг: 0 / 0
Что такое CWT_PrimaryKey и с чем его едят?
    #40080445
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
istrebitel,

это настройка драйвера вашего провайдера данных (FireDAC), в случае если вы используете FetchOptions.CursorKind = ckDynamic,
драйвер посылает серверу неявную команду создать динамический курсор

в явном виде это выглядело бы как
DECLARE CURSOR DYNAMIC FOR
select from .... [ваш код]

но фишка в том что динамический курсор не всегда можно создать у вас в плане видно что запрошенный тип курсора Dynamic, а по факту используется Keyset который создает кластерный первичный ключ под собой.

тут внимательно читайте про настройки фетчинга строк:
http://docwiki.embarcadero.com/RADStudio/Sydney/en/Fetching_Rows_(FireDAC)
http://docwiki.embarcadero.com/Libraries/Sydney/en/FireDAC.Stan.Option.TFDFetchOptions.CursorKind

про неявные преобразования курсора где то была статья без привязки к поставщику, сейчас в поиске всплывает только по ODBC, мне лень искать погуглите сами чето типа "sql server implicit cursor type conversion"
https://www.sqlshack.com/implicit-conversion-in-sql-server/
...
Рейтинг: 0 / 0
Что такое CWT_PrimaryKey и с чем его едят?
    #40080451
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что такое CWT_PrimaryKey и с чем его едят?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]