Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с оптимизацией запроса, пожалуйста / 9 сообщений из 9, страница 1 из 1
09.06.2019, 21:42
    #39824666
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с оптимизацией запроса, пожалуйста
Логика запроса:
t_A_TaskType - задания на контакты по клиентам в зависимости от статуса (s_id) и источника клиента (i_id_source)
t_A_Agent - клиенты
t_A_Contact - контакты по клиентам
Необходимо выбрать первое по порядку (tt_order) невыполненное задание на контакт (c_taskCompleted != 1) по каждому клиенту.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
09.06.2019, 21:49
    #39824670
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с оптимизацией запроса, пожалуйста
План и структуру и с индексами.
...
Рейтинг: 0 / 0
09.06.2019, 21:55
    #39824675
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с оптимизацией запроса, пожалуйста
План прикрепил.
Уточните, пожалуйста, по структуре с индексами. Необходимо подготовить скрипт создания таблиц и индексов?
...
Рейтинг: 0 / 0
09.06.2019, 23:17
    #39824689
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с оптимизацией запроса, пожалуйста
Какие индексы вы там создавали нам неведомо.

Но нужны примерно вот такие:
- на t_A_TaskType (s_id, i_id_source, tt_order) include (tt_id)
- на t_A_Contact (tt_id, a_id, c_taskCompleted)
...
Рейтинг: 0 / 0
09.06.2019, 23:29
    #39824694
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с оптимизацией запроса, пожалуйста
У таблицы t_a_taskType только первичный ключ. Других индексов нет.

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

Код: 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.
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?
...
Рейтинг: 0 / 0
09.06.2019, 23:44
    #39824699
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с оптимизацией запроса, пожалуйста
Вот скрипт создания таблиц

Код: 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.
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
	)

...
Рейтинг: 0 / 0
10.06.2019, 05:52
    #39824731
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с оптимизацией запроса, пожалуйста
Vsevolod VВот моя попытка. Запрос возвращает 127 000 записей за 6 секунд. Есть ли возможность существенно сократить это время?

Код: sql
1.
2.
3.
4.
5.
6.
7.
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 сек включают передачу или нет.
Если включают, так оно и нормально. Быстрее не будет.
...
Рейтинг: 0 / 0
10.06.2019, 06:55
    #39824736
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с оптимизацией запроса, пожалуйста
Vsevolod VЗапрос возвращает 127 000 записей за 6 секунд

Сразу вопрос: а куда дальше идут эти 127 000 записей, которые вы хотите получать каждые 6 секунд и даже чаще?
Точнее спросить: а вы уверены, что вам надо тыщи записей получать каждые несколько секунд, причем, судя по структуре таблиц, это все айдишники цифровые.
...
Рейтинг: 0 / 0
10.06.2019, 09:37
    #39824791
-- KAB --
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с оптимизацией запроса, пожалуйста
Vsevolod VПлан прикрепил.
Уточните, пожалуйста, по структуре с индексами. Необходимо подготовить скрипт создания таблиц и индексов?

В плане же видна 98% = сортировка в кросс эпплай.
сделайте индекс такой
create index ix_какоетоимя on t_A_TaskType (s_id, i_id_source, tt_order)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с оптимизацией запроса, пожалуйста / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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