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

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Логика запроса:
t_A_TaskType - задания на контакты по клиентам в зависимости от статуса (s_id) и источника клиента (i_id_source)
t_A_Agent - клиенты
t_A_Contact - контакты по клиентам
Необходимо выбрать первое по порядку (tt_order) невыполненное задание на контакт (c_taskCompleted != 1) по каждому клиенту.

Вот моя попытка. Запрос возвращает 127 000 записей за 6 секунд. Есть ли возможность существенно сократить это время? Все рекомендованные планом выполнения индексы созданы.

SELECT tt.tt_id, a.a_id, tt.i_id_source, tt.s_id, tt.tt_order, a.u_id, tt.i_id_source2, a.t_id_calltask, tt.i_id_grouping

	FROM dbo.t_A_TaskType AS tt INNER JOIN
	dbo.t_A_Agent AS a ON tt.i_id_source = a.i_id_source AND tt.s_id = a.s_id  
	
	cross apply (select top 1 tt2.tt_id from t_A_TaskType tt2 left join dbo.t_A_Contact AS td ON tt2.tt_id = td.tt_id AND a.a_id = td.a_id and c_taskCompleted = 1 
	where td.tt_id IS NULL and tt2.s_id = tt.s_id and tt2.i_id_source = tt.i_id_source order by tt2.tt_order) k

	WHERE tt.i_id_source != 5260  and tt.tt_id = k.tt_id
9 июн 19, 21:42    [21905537]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса, пожалуйста  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37200
План и структуру и с индексами.
9 июн 19, 21:49    [21905541]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса, пожалуйста  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
План прикрепил.
Уточните, пожалуйста, по структуре с индексами. Необходимо подготовить скрипт создания таблиц и индексов?

К сообщению приложен файл (plan.sqlplan - 94Kb) cкачать
9 июн 19, 21:55    [21905546]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса, пожалуйста  [new]
invm
Member

Откуда: Москва
Сообщений: 9687
Какие индексы вы там создавали нам неведомо.

Но нужны примерно вот такие:
- на t_A_TaskType (s_id, i_id_source, tt_order) include (tt_id)
- на t_A_Contact (tt_id, a_id, c_taskCompleted)
9 июн 19, 23:17    [21905563]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса, пожалуйста  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
У таблицы t_a_taskType только первичный ключ. Других индексов нет.

Вот индексы на таблице t_a_Contact

+
CREATE NONCLUSTERED INDEX [a_id_c_date] ON [dbo].[t_A_Contact]
(
	[s_id] ASC
)
INCLUDE ( 	[a_id],
	[c_date]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
GO


CREATE NONCLUSTERED INDEX [ContactFields] ON [dbo].[t_A_Contact]
(
	[ct_id] ASC,
	[c_date] ASC
)
INCLUDE ( 	[c_id],
	[a_id],
	[u_id],
	[s_id]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [ContactMail] ON [dbo].[t_A_Contact]
(
	[m_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, FILLFACTOR = 100) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [ContactTTID_Date] ON [dbo].[t_A_Contact]
(
	[tt_id] ASC,
	[c_date] 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, FILLFACTOR = 100) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [ContactUID_Date] ON [dbo].[t_A_Contact]
(
	[u_id] ASC,
	[c_date] ASC
)
INCLUDE ( 	[c_time1],
	[c_time2]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
GO

ALTER TABLE [dbo].[t_A_Contact] ADD  CONSTRAINT [PK__t_A_Cont__213EE77462C8CD8D] PRIMARY KEY CLUSTERED 
(
	[c_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [t_A_Contact_CTID_SID] ON [dbo].[t_A_Contact]
(
	[ct_id] ASC,
	[s_id] ASC
)
INCLUDE ( 	[c_id],
	[a_id]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [t_A_Contact_Index] ON [dbo].[t_A_Contact]
(
	[a_id] ASC
)
INCLUDE ( 	[c_date],
	[c_nextDate],
	[c_description]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [taskCompleted] ON [dbo].[t_A_Contact]
(
	[c_taskCompleted] ASC
)
INCLUDE ( 	[a_id],
	[tt_id]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [v_a_agentCParent] ON [dbo].[t_A_Contact]
(
	[c_parent] ASC
)
INCLUDE ( 	[c_id]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
GO


Уточните, пожалуйста, предложенный вами вариант индексов можно использовать?
И требуется ли как-то оптимизировать мою помойку индексов на таблице t_a_Contact?
9 июн 19, 23:29    [21905568]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса, пожалуйста  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Вот скрипт создания таблиц

+
create table t_A_TaskType
	(
		tt_id int identity(1, 1) primary key,
		i_id_source int,
		s_id int,
		tt_order int,
		i_id_source2 int,
		i_id_grouping int
	)

	create table t_A_Agent
	(
		a_id int identity(1, 1) primary key,
		i_id_source int,
		s_id int,
		u_id int,
		t_id_calltask int
	)

	create table t_A_Contact
	(
		c_id int identity(1, 1) primary key,
		a_id int, 
		c_taskCompleted int
	)
9 июн 19, 23:44    [21905573]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса, пожалуйста  [new]
aleks222
Member

Откуда:
Сообщений: 1295
Vsevolod V
Вот моя попытка. Запрос возвращает 127 000 записей за 6 секунд. Есть ли возможность существенно сократить это время?


select tt2.* 
     , a.*
  from t_A_TaskType tt2 
       INNER JOIN dbo.t_A_Agent AS a ON tt2.i_id_source = a.i_id_source AND tt2.s_id = a.s_id         
       left join dbo.t_A_Contact AS td ON tt2.tt_id = td.tt_id AND a.a_id = td.a_id and c_taskCompleted = 1 
	where td.tt_id IS NULL and tt2.i_id_source != 5260  
          and  row_number() over(partition by tt2.s_id, tt2.i_id_source order by tt2.tt_order ) = 1


Ну и надо помнить: "127 000 записей" надо еще на клиента передать.
В вашем тексте нипонятно, 6 сек включают передачу или нет.
Если включают, так оно и нормально. Быстрее не будет.
10 июн 19, 05:52    [21905614]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса, пожалуйста  [new]
PizzaPizza
Member

Откуда:
Сообщений: 422
Vsevolod V
Запрос возвращает 127 000 записей за 6 секунд


Сразу вопрос: а куда дальше идут эти 127 000 записей, которые вы хотите получать каждые 6 секунд и даже чаще?
Точнее спросить: а вы уверены, что вам надо тыщи записей получать каждые несколько секунд, причем, судя по структуре таблиц, это все айдишники цифровые.
10 июн 19, 06:55    [21905622]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса, пожалуйста  [new]
-- KAB --
Member

Откуда: Москва
Сообщений: 20
Vsevolod V
План прикрепил.
Уточните, пожалуйста, по структуре с индексами. Необходимо подготовить скрипт создания таблиц и индексов?


В плане же видна 98% = сортировка в кросс эпплай.
сделайте индекс такой
create index ix_какоетоимя on t_A_TaskType (s_id, i_id_source, tt_order)
10 июн 19, 09:37    [21905701]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить