powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация запроса
16 сообщений из 16, страница 1 из 1
Оптимизация запроса
    #39941617
gepard1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите как можно оптимизировать эту хранимую процедуру. Есть таблицы: Tasks (общие поля), Tasks_Changes_Parts (частные поля для каждого пользователя), Tasks_Common (дополнительная), Projects_Changes_Parts (проекты). Есть индексы по полям: uid_customer, email_performer (текстовое длиной 800 байт), email_user_cp, uid_project, uid_project_cp, uid_obj, uid_user, uid_task_cp, uid_user_cp.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE PROCEDURE dbo.GetAllNeedTasks (  @UserUID   UNIQUEIDENTIFIER, @UserEmail NVARCHAR(MAX))
AS

BEGIN

  SELECT * FROM Tasks AS t, Tasks_Changes_Parts AS p
  WHERE
          (t.uid_customer = @UserUID OR t.email_performer = @UserEmail OR EXISTS 
                    (SELECT uid_project_cp
                     FROM   Projects_Changes_Parts
                     WHERE  email_user_cp = @UserEmail AND uid_project = uid_project_cp)
           OR t.uid_obj IN (SELECT uid_task FROM Tasks_Common WHERE @UserUID = uid_user)
           )
         
          AND (t.uid_obj = p.uid_task_cp) AND (@UserUID = p.uid_user_cp)
  
END

GO
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39941618
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gepard1980
Есть таблицы: Tasks (общие поля), Tasks_Changes_Parts (частные поля для каждого пользователя), Tasks_Common (дополнительная), Projects_Changes_Parts (проекты). Есть индексы по полям: uid_customer, email_performer (текстовое длиной 800 байт), email_user_cp, uid_project, uid_project_cp, uid_obj, uid_user, uid_task_cp, uid_user_cp.

вы вместо этого скрипты создания таблиц и индексов приведите
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39941623
gepard1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msLex,


**********************************************************************************

Код: 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.
CREATE TABLE lion_data.dbo.lion_Tasks (
  uid_obj UNIQUEIDENTIFIER NOT NULL
 ,uid_parent UNIQUEIDENTIFIER NOT NULL
 ,uid_customer UNIQUEIDENTIFIER NOT NULL
 ,email_performer NVARCHAR(800) NOT NULL
 ,name NVARCHAR(MAX) NOT NULL
 ,comment NVARCHAR(MAX) NOT NULL
 ,status INT NOT NULL
 ,uid_project UNIQUEIDENTIFIER NOT NULL
 ,date_create DATETIME NULL
 ,date_modify DATETIME NULL
 ,__usn_field_uid_parent INT NOT NULL
 ,__usn_field_uid_customer INT NOT NULL
 ,__usn_field_email_performer INT NOT NULL
 ,__usn_field_name INT NOT NULL
 ,__usn_field_comment INT NOT NULL
 ,__usn_field_status INT NOT NULL
 ,__usn_field_date_modify INT NOT NULL
 ,__usn_field_uid_project INT NOT NULL
 ,customer_order INT NULL
 ,customer_date_begin DATETIME NULL
 ,customer_date_end DATETIME NULL
 ,__usn_field_customer_order INT NULL
 ,__usn_field_customer_date INT NULL
 ,CreateTime DATETIME NULL
 ,__usn_field_createtime INT NULL
 ,PerformTime DATETIME NULL
 ,__usn_field_performtime INT NULL
 ,SeriesType INT NULL
 ,SeriesAfterType INT NULL
 ,SeriesAfterCount INT NULL
 ,SeriesWeekCount INT NULL
 ,SeriesWeekMon INT NULL
 ,SeriesWeekTue INT NULL
 ,SeriesWeekWed INT NULL
 ,SeriesWeekThu INT NULL
 ,SeriesWeekFri INT NULL
 ,SeriesWeekSat INT NULL
 ,SeriesWeekSun INT NULL
 ,SeriesMonthType INT NULL
 ,SeriesMonthCount INT NULL
 ,SeriesMonthDay INT NULL
 ,SeriesMonthWeekType INT NULL
 ,SeriesMonthDayOfWeek INT NULL
 ,SeriesYearType INT NULL
 ,SeriesYearMonth INT NULL
 ,SeriesYearMonthDay INT NULL
 ,SeriesYearWeekType INT NULL
 ,SeriesYearDayOfWeek INT NULL
 ,SeriesEnd DATETIME NULL
 ,__usn_field_series INT NULL
 ,CompleteTime DATETIME NULL
 ,__usn_field_completetime INT NULL
 ,order_new FLOAT NULL
 ,__usn_field_order_new INT NULL
 ,PerformerReaded INT NULL
 ,__usn_field_performerreaded INT NULL
 ,plugin NVARCHAR(MAX) NULL
 ,__usn_field_plugin INT NULL
 ,time INT NULL
 ,__usn_field_time INT NULL
 ,InWorkTime DATETIME NULL
 ,__usn_field_inworktime INT NULL
 ,[plan] INT NULL
 ,__usn_field_plan INT NULL
 ,Emails NVARCHAR(MAX) NULL
 ,__usn_field_list_members INT NULL
 ,checklist NVARCHAR(MAX) NULL
 ,__usn_field_checklist INT NULL
 ,CONSTRAINT PK_lion_Tasks PRIMARY KEY CLUSTERED (uid_obj)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

CREATE INDEX IX_lion_Tasks_CustomerUID
ON lion_data.dbo.lion_Tasks (uid_customer)
ON [PRIMARY]
GO

CREATE INDEX IX_lion_Tasks_email_performer
ON lion_data.dbo.lion_Tasks (email_performer)
ON [PRIMARY]
GO

CREATE INDEX IX_lion_Tasks_uid_project
ON lion_data.dbo.lion_Tasks (uid_project)
ON [PRIMARY]
GO

************************************************************************

CREATE TABLE lion_data.dbo.lion_Tasks_Changes_Parts (
  uid_obj_cp UNIQUEIDENTIFIER NOT NULL
 ,uid_task_cp UNIQUEIDENTIFIER NOT NULL
 ,uid_user_cp UNIQUEIDENTIFIER NOT NULL
 ,_order_cp INT NOT NULL
 ,uid_marker_cp UNIQUEIDENTIFIER NOT NULL
 ,date_begin_cp DATETIME NULL
 ,date_end_cp DATETIME NULL
 ,readed_cp INT NOT NULL
 ,collapsed_cp INT NOT NULL
 ,__usn_entity_cp INT NOT NULL
 ,__usn_field_order_cp INT NOT NULL
 ,__usn_field_uid_marker_cp INT NOT NULL
 ,__usn_field_date_begin_cp INT NOT NULL
 ,__usn_field_date_end_cp INT NOT NULL
 ,__usn_field_readed_cp INT NOT NULL
 ,__usn_field_collapsed_cp INT NOT NULL
 ,__usn_field_list_tags_cp INT NULL
 ,Contacts NVARCHAR(MAX) NULL
 ,__usn_field_contacts_cp INT NULL
 ,uid_user_marker UNIQUEIDENTIFIER NULL
 ,__usn_field_uid_user_marker INT NULL
 ,focus_cp INT NULL
 ,__usn_field_focus_cp INT NULL
 ,CONSTRAINT PK_lion_Tasks_Changes_Parts PRIMARY KEY CLUSTERED (uid_obj_cp)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

CREATE INDEX IDX_lion_Tasks_Changes_Parts_uid_marker_cp
ON lion_data.dbo.lion_Tasks_Changes_Parts (uid_marker_cp)
ON [PRIMARY]
GO

CREATE INDEX IX_lion_Tasks_CP_Uid_Task
ON lion_data.dbo.lion_Tasks_Changes_Parts (uid_task_cp)
ON [PRIMARY]
GO

CREATE INDEX IX_lion_Tasks_CP_Uid_User
ON lion_data.dbo.lion_Tasks_Changes_Parts (uid_user_cp)
ON [PRIMARY]
GO

CREATE UNIQUE INDEX UK_lion_Tasks_Changes_Parts
ON lion_data.dbo.lion_Tasks_Changes_Parts (uid_task_cp, uid_user_cp)
WITH (IGNORE_DUP_KEY = ON)
ON [PRIMARY]
GO

****************************************************************************

CREATE TABLE lion_data.dbo.lion_Tasks_Common (
  uid_task UNIQUEIDENTIFIER NULL
 ,uid_user UNIQUEIDENTIFIER NULL
) ON [PRIMARY]
GO

CREATE INDEX IDX_lion_Tasks_Common_uid_task
ON lion_data.dbo.lion_Tasks_Common (uid_task)
ON [PRIMARY]
GO

CREATE INDEX IDX_lion_Tasks_Common_uid_user
ON lion_data.dbo.lion_Tasks_Common (uid_user)
ON [PRIMARY]
GO

****************************************************************************

CREATE TABLE lion_data.dbo.lion_Projects_Changes_Parts (
  uid_obj_cp UNIQUEIDENTIFIER NOT NULL
 ,email_user_cp NVARCHAR(800) NOT NULL
 ,uid_project_cp UNIQUEIDENTIFIER NOT NULL
 ,_order_cp INT NOT NULL
 ,collapsed_cp INT NOT NULL
 ,show_cp INT NULL
 ,favorite_cp INT NULL
 ,__usn_entity_cp INT NOT NULL
 ,__usn_field_order_cp INT NOT NULL
 ,__usn_field_collapsed_cp INT NOT NULL
 ,__usn_field_show_cp INT NULL
 ,__usn_field_favorite_cp INT NULL
 ,quiet_cp INT NULL
 ,__usn_field_quiet_cp INT NULL
 ,CONSTRAINT PK_lion_Projects_Changes_Parts PRIMARY KEY CLUSTERED (uid_obj_cp)
) ON [PRIMARY]
GO

CREATE INDEX IX_lion_Projects_Changes_Parts_email_user_cp
ON lion_data.dbo.lion_Projects_Changes_Parts (email_user_cp)
ON [PRIMARY]
GO

CREATE INDEX IX_lion_Projects_Changes_Parts_uid_project_cp
ON lion_data.dbo.lion_Projects_Changes_Parts (uid_project_cp)
ON [PRIMARY]
GO

CREATE UNIQUE INDEX UK_lion_Projects_Changes_Parts
ON lion_data.dbo.lion_Projects_Changes_Parts (email_user_cp, uid_project_cp)
WITH (IGNORE_DUP_KEY = ON)
ON [PRIMARY]
GO

...
Рейтинг: 0 / 0
Оптимизация запроса
    #39941691
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gepard1980, названия таблиц в запросе не совпадают с названиями в скрипте создания таблиц, поэтому сами поправьте как должно быть.

Код: 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.
-- индексы
/*
create nonclustered index IX_Tasks_CP_Uid_User1 on lion_data.dbo.Tasks_Changes_Parts (uid_user_cp) include (uid_task_cp)
create nonclustered index IX_Tasks_Uid_Obj1     on lion_data.dbo.Tasks               (uid_obj)     include (uid_customer, uid_project, email_performer)
*/

create table #T1
(
  uid_obj_cp      uniqueidentifier,
  uid_obj         uniqueidentifier,
  uid_customer    uniqueidentifier,
  uid_project     uniqueidentifier,
  email_performer nvarchar(800)
)

insert into #T1
  select
    p.uid_obj_cp,
    t.uid_obj,
    t.uid_customer,
    t.uid_project,
    t.email_performer
  from Tasks_Changes_Parts p
    inner join Tasks t on t.uid_obj = p.uid_task_cp
  where p.uid_user_cp = @UserUID

;with t1 as
(
  select uid_obj_cp from #T1 where uid_customer = @UserUID
)
, t2 as
(
  select uid_obj_cp from #T1 where email_performer = @UserEmail
)
, t3 as
(
  select uid_obj_cp from #T1 t where exists (select * from Projects_Changes_Parts where email_user_cp = @UserEmail and uid_project_cp = t.uid_project)
)
, t4 as
(
  select uid_obj_cp from #T1 t where exists (select * from Tasks_Common where uid_user = @UserUID and uid_task = t.uid_obj)
)
, tall as
(
  select uid_obj_cp from t1
  union
  select uid_obj_cp from t2
  union
  select uid_obj_cp from t3
  union
  select uid_obj_cp from t4
)
select
  t.*,
  p.*
from tall
  inner join Tasks_Changes_Parts p on p.uid_obj_cp = tall.uid_obj_cp
  inner join Tasks t               on t.uid_obj    = p.uid_task_cp

drop table #T1
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39941695
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Разучить таки INNER JOIN и не лениться его писать.
2. Не лениться писать aliases. Везде.
2. Понять, что OR - это зло.
3. Ну... фантазию проявить.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE PROCEDURE dbo.GetAllNeedTasks (  @UserUID   UNIQUEIDENTIFIER, @UserEmail NVARCHAR(MAX))
AS

BEGIN

with x as (select uid_obj FROM Tasks WHERE uid_customer = @UserUID
			union
			select uid_obj FROM Tasks WHERE email_performer = @UserEmail
			union
			SELECT uid_task FROM Tasks_Common WHERE uid_user = @UserUID
	     )
  select uid_obj into #uid_objS from x
;
alter table #uid_objS add primary key(uid_obj);

select * 
  from Tasks AS t 
          inner join ( select * from Tasks_Changes_Parts where uid_user_cp = @UserUID ) AS p on t.uid_obj = p.uid_task_cp
	  inner join #uid_objS as x on x.uid_obj = t.uid_obj
;
END
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39941728
gepard1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю за ответы! Пишу на ASP.NET, поэтому особо не силён в sql. В приведенных вами примерах используются в том числе временные таблицы, думаю это скорости не прибавит. Прикрепил стоимости планов выполнения.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39941729
gepard1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предложенный ROLpogo вариант:
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39941732
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gepard1980,

По моему плану вижу, что это только заливка в темп, а где сам селект? И индексов нет, которые я указал, поэтому и получили лишний лукап.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39941837
gepard1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ROLpogo, сам select вот. И стоимость низкая, но вот если вкупе с insert-ом во временную таблицу будет ли это быстрее начального варианта?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39941840
gepard1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ROLpogo, сейчас добавил индексы. План попроще стал, но стоимость всё равно 1,4.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39941860
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gepard1980,

Да, с временной должно быть быстрее. Не пойму зачем лукап делается при селекте из Tasks_Changes_Parts в темп? Индекс должен был обеспечить всеми нужными полями. Что там показывает в output на лукапе?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39942141
gepard1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ROLpogo,
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39942143
gepard1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ROLpogo, еще студия предлагает сделать некластеризованный индекс для ускорения инсерта:
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39942146
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gepard1980,

Картинки практически ни о чем. Выкладывайте актуальные планы в формате sqlplan.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39942169
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gepard1980, в моем индексе есть искомое поле uid_task_cp. Похоже вы его не создали и в запросе используется другой индекс IX_lion_Tasks_CP_Uid_User.

create nonclustered index IX_Tasks_CP_Uid_User1 on lion_data.dbo.Tasks_Changes_Parts (uid_user_cp) include (uid_task_cp)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39942247
gepard1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ROLpogo, благодарю за помощь! Сейчас как будет окно в разработке опять ваш вариант попробую.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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