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

Откуда: Киев
Сообщений: 225
Доброго дня всем.
Очень долго обрабатывается запрос. Пытаюсь экспериментировать с индексами, но что-то плоховато выходит. Может кто поможет добрым советом, что можно сделать с индексами этих таблиц, чтобы облегчить работу сервера.
Если надо какая-либо доп информация по таблицам - только свисните.
Спасибо.
update imarpyt_vw
	set import_flag=0
from imarpyt_vw i, 
pcontrol_vw p
where i.process_ctrl_num=p.process_ctrl_num
and p.process_parent_app=20000--@process_id
and not exists (select 1 from master..sysprocesses m
	where m.login_time=p.process_start_date
		and m.spid=p.process_server_id)
  |--Sequence
       |--Index Update(OBJECT:([e_ctrl].[dbo].[imarpyt].[imarpyt_ind2]), SET:([company_code1022] = [e_ctrl].[dbo].[imarpyt].[company_code],[source_ctrl_num1023] = [e_ctrl].[dbo].[imarpyt].[source_ctrl_num],[trx_ctrl_num1024] = [e_ctrl].[dbo].[imarpyt].[trx_ctrl_num],[process_ctrl_num1025] = [e_ctrl].[dbo].[imarpyt].[process_ctrl_num],[import_flag1026] = [e_ctrl].[dbo].[imarpyt].[import_flag]) WITH ORDERED PREFETCH)
       |    |--Sort(ORDER BY:([e_ctrl].[dbo].[imarpyt].[import_flag] ASC, [e_ctrl].[dbo].[imarpyt].[process_ctrl_num] ASC, [e_ctrl].[dbo].[imarpyt].[company_code] ASC, [e_ctrl].[dbo].[imarpyt].[source_ctrl_num] ASC, [e_ctrl].[dbo].[imarpyt].[trx_ctrl_num] ASC, [Act1021] ASC))
       |         |--Filter(WHERE:(NOT [Expr1017]))
       |              |--Table Spool
       |                   |--Split
       |                        |--Clustered Index Update(OBJECT:([e_ctrl].[dbo].[imarpyt].[imarpyt_0]), SET:([e_ctrl].[dbo].[imarpyt].[import_flag] = [Expr1008]) WITH ORDERED PREFETCH)
       |                             |--Compute Scalar(DEFINE:([Expr1017]=[Expr1017], [Expr1018]=[Expr1018]))
       |                                  |--Compute Scalar(DEFINE:([Expr1017]=CASE WHEN [Expr1009] THEN (1) ELSE (0) END, [Expr1018]=CASE WHEN [Expr1009] THEN (1) ELSE (0) END))
       |                                       |--Compute Scalar(DEFINE:([Expr1008]=(0)))
       |                                            |--Sort(ORDER BY:([e_ctrl].[dbo].[imarpyt].[company_code] ASC, [e_ctrl].[dbo].[imarpyt].[source_ctrl_num] ASC, [e_ctrl].[dbo].[imarpyt].[trx_ctrl_num] ASC, [e_ctrl].[dbo].[imarpyt].[process_ctrl_num] ASC))
       |                                                 |--Top(ROWCOUNT est 0)
       |                                                      |--Compute Scalar(DEFINE:([Expr1009]=CASE WHEN [e_ctrl].[dbo].[imarpyt].[import_flag] = (0) THEN (1) ELSE (0) END))
       |                                                           |--Nested Loops(Left Semi Join, WHERE:([e_ctrl].[dbo].[pcontrol].[process_parent_company] as [p].[process_parent_company]=[e_data].[dbo].[glco].[company_code] as [g].[company_code]))
       |                                                                |--Hash Match(Right Anti Semi Join, HASH:(SYSPROCESSES.[login_time], [Expr1015])=([p].[process_start_date], [p].[process_server_id]), RESIDUAL:(SYSPROCESSES.[login_time]=[e_ctrl].[dbo].[pcontrol].[process_start_date] as [p].[process_start_date] AND [Expr1015]=[e_ctrl].[dbo].[pcontrol].[process_server_id] as [p].[process_server_id]))
       |                                                                |    |--Compute Scalar(DEFINE:([Expr1015]=CONVERT_IMPLICIT(int,SYSPROCESSES.[spid],0)))
       |                                                                |    |    |--Table-valued function
       |                                                                |    |--Nested Loops(Inner Join, OUTER REFERENCES:([p].[process_ctrl_num], [Expr1035]) OPTIMIZED WITH UNORDERED PREFETCH)
       |                                                                |         |--Clustered Index Scan(OBJECT:([e_ctrl].[dbo].[pcontrol].[pcontrol_ind_0] AS [p]), WHERE:([e_ctrl].[dbo].[pcontrol].[process_parent_app] as [p].[process_parent_app]=(20000)))
       |                                                                |         |--Index Seek(OBJECT:([e_ctrl].[dbo].[imarpyt].[_dta_index_imarpyt_6_1627152842__K67_K66_K1_K2_K3]), SEEK:([e_ctrl].[dbo].[imarpyt].[process_ctrl_num]=[e_ctrl].[dbo].[pcontrol].[process_ctrl_num] as [p].[process_ctrl_num]) ORDERED FORWARD)
       |                                                                |--Clustered Index Scan(OBJECT:([e_data].[dbo].[glco].[PK_glco] AS [g]))
       |--Index Update(OBJECT:([e_ctrl].[dbo].[imarpyt].[_dta_index_imarpyt_6_1627152842__K67_K66_K1_K2_K3]), SET:([company_code1027] = [e_ctrl].[dbo].[imarpyt].[company_code],[source_ctrl_num1028] = [e_ctrl].[dbo].[imarpyt].[source_ctrl_num],[trx_ctrl_num1029] = [e_ctrl].[dbo].[imarpyt].[trx_ctrl_num],[process_ctrl_num1030] = [e_ctrl].[dbo].[imarpyt].[process_ctrl_num],[import_flag1031] = [e_ctrl].[dbo].[imarpyt].[import_flag]) WITH ORDERED PREFETCH)
            |--Sort(ORDER BY:([e_ctrl].[dbo].[imarpyt].[process_ctrl_num] ASC, [e_ctrl].[dbo].[imarpyt].[import_flag] ASC, [e_ctrl].[dbo].[imarpyt].[company_code] ASC, [e_ctrl].[dbo].[imarpyt].[source_ctrl_num] ASC, [e_ctrl].[dbo].[imarpyt].[trx_ctrl_num] ASC, [Act1021] ASC))
                 |--Filter(WHERE:(NOT [Expr1018]))
                      |--Table Spool

imarpyt:
imarpyt_0	clustered, unique located on PRIMARY	company_code, source_ctrl_num, trx_ctrl_num, process_ctrl_num
imarpyt_ind1	nonclustered located on PRIMARY	trx_type, doc_ctrl_num, processed_flag
imarpyt_ind2	nonclustered located on PRIMARY	import_flag, process_ctrl_num
imarpyt_ind4	nonclustered located on PRIMARY	doc_desc
imarpyt_ind5	nonclustered located on PRIMARY	trx_type, record_id_num

pcontrol:
pcontrol_ind_0	clustered, unique located on PRIMARY	process_ctrl_num
pcontrol_ind_1	nonclustered located on PRIMARY	process_parent_app, process_server_id, process_start_date
4 июн 09, 11:40    [7264175]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Senya_L
Member

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

Давайте методом научного тыка :)
imarpyt_ind6	nonclustered located on PRIMARY	process_ctrl_num
4 июн 09, 11:48    [7264248]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Senya_L
Member

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

А еще
pcontrol_ind_2	nonclustered located on PRIMARY process_start_date
4 июн 09, 11:51    [7264268]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
update imarpyt_vw
	set import_flag=0
 from imarpyt_vw i
  join pcontrol_vw p on i.process_ctrl_num=p.process_ctrl_num
  left join master..sysprocesses m
   on m.login_time=p.process_start_date and m.spid=p.process_server_id
where p.process_parent_app=20000 and m.process_server_id is null
ну и пожалуй, так.


для спящего время бодрствования равносильно сну
4 июн 09, 12:01    [7264352]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
в догонку
pcontrol_ind_2 nonclustered located on PRIMARY process_parent_app, process_server_id, process_start_date, process_ctrl_num

остальные 2 индекса для этого запроса не нужны.

для спящего время бодрствования равносильно сну
4 июн 09, 12:03    [7264365]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Алексей2003
update imarpyt_vw
	set import_flag=0
 from imarpyt_vw i
  join pcontrol_vw p on i.process_ctrl_num=p.process_ctrl_num
  left join master..sysprocesses m
   on m.login_time=p.process_start_date and m.spid=p.process_server_id
where p.process_parent_app=20000 and m.process_server_id is null
ну и пожалуй, так.


для спящего время бодрствования равносильно сну
Не надо связку left join + is null. not exists лучше.
4 июн 09, 12:03    [7264367]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
сорри
update imarpyt_vw
	set import_flag=0
 from imarpyt_vw i
  join pcontrol_vw p on i.process_ctrl_num=p.process_ctrl_num
  left join master..sysprocesses m
   on m.login_time=p.process_start_date and m.spid=p.process_server_id
where p.process_parent_app=20000 and m.spid is null

для спящего время бодрствования равносильно сну
4 июн 09, 12:04    [7264374]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
Senya_L
Алексей2003
update imarpyt_vw
	set import_flag=0
 from imarpyt_vw i
  join pcontrol_vw p on i.process_ctrl_num=p.process_ctrl_num
  left join master..sysprocesses m
   on m.login_time=p.process_start_date and m.spid=p.process_server_id
where p.process_parent_app=20000 and m.process_server_id is null
ну и пожалуй, так.


для спящего время бодрствования равносильно сну
Не надо связку left join + is null. not exists лучше.


с чего вдруг лучше? not exists для каждой строки вызывается отдельно. а джоин он 1 раз на все записи.
4 июн 09, 12:05    [7264384]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Алексей2003
с чего вдруг лучше? not exists для каждой строки вызывается отдельно. а джоин он 1 раз на все записи.
С чего бы это?
StmtText
---------------------------------------------------------------------------------------------------------------
SELECT * FROM [Address] WHERE NOT EXISTS (SELECT * FROM [Smo] WHERE [Smo].[idAddress] = [Address].[idAddress])

(1 row(s) affected)

StmtText
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
  |--Nested Loops(Left Anti Semi Join, OUTER REFERENCES:([Polyclinic].[dbo].[Address].[idAddress]))
       |--Clustered Index Scan(OBJECT:([Polyclinic].[dbo].[Address].[PK_ADDRESS]))
       |--Top(TOP EXPRESSION:((1)))
            |--Clustered Index Scan(OBJECT:([Polyclinic].[dbo].[Smo].[PK_SMO]), WHERE:([Polyclinic].[dbo].[Smo].[idAddress]=[Polyclinic].[dbo].[Address].[idAddress]))
Как видите оптимизатор и операцию TOP добавил.
4 июн 09, 12:13    [7264435]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
Алексей2003
в догонку
pcontrol_ind_2 nonclustered located on PRIMARY process_parent_app, process_server_id, process_start_date, process_ctrl_num

остальные 2 индекса для этого запроса не нужны.

для спящего время бодрствования равносильно сну

Но по process_ctrl_num стоит кластерный индекс, а process_parent_app, process_server_id, process_start_date используются в pcontrol_ind_2. Так полагаю, поля кластерного индекса учитываются при использованиии "обычного" индекса.
4 июн 09, 13:00    [7264805]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
поля используются, но после просмотра 3х полей из индекса, идет поиск по таблице в основной (букмарк лукап), чтобы найти 4ое поле. а если все 4 поля в индексе, тогда будет просто просмотр индекса..

2Senya_L
и что?
create table #t (i int, s varchar(10))
create table #tt (i int)

insert into #t values (1, 'a')
insert into #t values (1, 'b')
insert into #t values (1, 'c')
insert into #t values (2, 'd')
insert into #t values (2, 'e')

insert into #tt values (1)
go
set showplan_all on
go

select * from #t t where not exists(select * from #tt tt where tt.i = t.i)
select t.* from #t t left join #tt tt on t.i = tt.i where tt.i is null
go
set showplan_all off
go
drop table #t
drop table #tt
смотрим внимательно на колонку estimate executions..
а то что сервер топ добавил, так это понятно.

для спящего время бодрствования равносильно сну
4 июн 09, 17:27    [7266644]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2kirser
если ничего не помогло, скажите в процентном отношении, что самое тяжелое для запроса получается..

для спящего время бодрствования равносильно сну
4 июн 09, 17:30    [7266660]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
Алексей2003
2kirser
если ничего не помогло, скажите в процентном отношении, что самое тяжелое для запроса получается..

для спящего время бодрствования равносильно сну

Сделал:
imarpyt_ind6 nonclustered located on PRIMARY process_ctrl_num
pcontrol_ind_2 nonclustered located on PRIMARY process_start_date
Получил:
  |--Index Update(OBJECT:([e_ctrl].[dbo].[imarpyt].[imarpyt_ind2]), SET:([company_code1019] = [e_ctrl].[dbo].[imarpyt].[company_code],[source_ctrl_num1020] = [e_ctrl].[dbo].[imarpyt].[source_ctrl_num],[trx_ctrl_num1021] = [e_ctrl].[dbo].[imarpyt].[trx_ctrl_num],[process_ctrl_num1022] = [e_ctrl].[dbo].[imarpyt].[process_ctrl_num],[import_flag1023] = [e_ctrl].[dbo].[imarpyt].[import_flag]) WITH ORDERED PREFETCH)
       |--Filter(WHERE:(NOT [Expr1016]))
            |--Split
                 |--Clustered Index Update(OBJECT:([e_ctrl].[dbo].[imarpyt].[imarpyt_0]), SET:([e_ctrl].[dbo].[imarpyt].[import_flag] = [Expr1007]) WITH UNORDERED PREFETCH)
                      |--Compute Scalar(DEFINE:([Expr1016]=[Expr1016]))
                           |--Compute Scalar(DEFINE:([Expr1016]=CASE WHEN [Expr1008] THEN (1) ELSE (0) END))
                                |--Compute Scalar(DEFINE:([Expr1007]=(0)))
                                     |--Top(ROWCOUNT est 0)
                                          |--Compute Scalar(DEFINE:([Expr1008]=CASE WHEN [e_ctrl].[dbo].[imarpyt].[import_flag] = (0) THEN (1) ELSE (0) END))
                                               |--Sort(DISTINCT ORDER BY:([e_ctrl].[dbo].[imarpyt].[company_code] ASC, [e_ctrl].[dbo].[imarpyt].[source_ctrl_num] ASC, [e_ctrl].[dbo].[imarpyt].[trx_ctrl_num] ASC, [e_ctrl].[dbo].[imarpyt].[process_ctrl_num] ASC))
                                                    |--Filter(WHERE:(SYSPROCESSES.[spid] IS NULL))
                                                         |--Hash Match(Right Outer Join, HASH:(SYSPROCESSES.[login_time], [Expr1014])=([p].[process_start_date], [p].[process_server_id]), RESIDUAL:(SYSPROCESSES.[login_time]=[e_ctrl].[dbo].[pcontrol].[process_start_date] as [p].[process_start_date] AND [Expr1014]=[e_ctrl].[dbo].[pcontrol].[process_server_id] as [p].[process_server_id]))
                                                              |--Compute Scalar(DEFINE:([Expr1014]=CONVERT_IMPLICIT(int,SYSPROCESSES.[spid],0)))
                                                              |    |--Table-valued function
                                                              |--Hash Match(Inner Join, HASH:([p].[process_ctrl_num])=([e_ctrl].[dbo].[imarpyt].[process_ctrl_num]), RESIDUAL:([e_ctrl].[dbo].[imarpyt].[process_ctrl_num]=[e_ctrl].[dbo].[pcontrol].[process_ctrl_num] as [p].[process_ctrl_num]))
                                                                   |--Nested Loops(Inner Join, WHERE:([e_ctrl].[dbo].[pcontrol].[process_parent_company] as [p].[process_parent_company]=[e_data].[dbo].[glco].[company_code] as [g].[company_code]))
                                                                   |    |--Clustered Index Scan(OBJECT:([e_ctrl].[dbo].[pcontrol].[pcontrol_ind_0] AS [p]),  WHERE:([e_ctrl].[dbo].[pcontrol].[process_parent_app] as [p].[process_parent_app]=(20000)) ORDERED FORWARD)
                                                                   |    |--Clustered Index Scan(OBJECT:([e_data].[dbo].[glco].[PK_glco] AS [g]))
                                                                   |--Index Scan(OBJECT:([e_ctrl].[dbo].[imarpyt].[imarpyt_ind2]), ORDERED FORWARD)
Самое тяжелое - HASH MATCh(47%) и INDEX SCAN (47%_Imarpyt.Imarpyt_ind_2)
4 июн 09, 18:14    [7266992]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
насколько я понимаю, сейчас запрос другой используется..
время изменилось, или осталось прежним?
сколько данных (строк) корректируется за одну транзакцию?
ну и этот индекс: imarpyt_ind2 nonclustered located on PRIMARY import_flag, process_ctrl_num
вообще для этой задачи накаким боком не нужен. он нужен для других? если да, то может стоит его отключать (индекс) и после заливки включать. избежите перестройки индексов в момент обновления.. что может положительно сказаться на производительности.

ЗЫ вместо Апдейт, пишем селект. какая разница во времени выполнения?

для спящего время бодрствования равносильно сну
4 июн 09, 19:13    [7267206]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
Алексей2003
насколько я понимаю, сейчас запрос другой используется..
время изменилось, или осталось прежним?
сколько данных (строк) корректируется за одну транзакцию?
ну и этот индекс: imarpyt_ind2 nonclustered located on PRIMARY import_flag, process_ctrl_num
вообще для этой задачи накаким боком не нужен. он нужен для других? если да, то может стоит его отключать (индекс) и после заливки включать. избежите перестройки индексов в момент обновления.. что может положительно сказаться на производительности.

ЗЫ вместо Апдейт, пишем селект. какая разница во времени выполнения?

для спящего время бодрствования равносильно сну


Все правильно, сейчас показан план по
update imarpyt_vw
	set import_flag=0
 from imarpyt_vw i
  join pcontrol_vw p on i.process_ctrl_num=p.process_ctrl_num
  left join master..sysprocesses m
   on m.login_time=p.process_start_date and m.spid=p.process_server_id
where p.process_parent_app=20000 and m.spid is null
Время выполнения практически одинаковое - около 850 мс. Обновляется 17700 строк.
Селект выполняется приблизительно за 580 мс в обоих скриптах.
imarpyt_ind2 я создавал именно для этого скрипта, считаете можно оставить только по полю process_ctrl_num?
5 июн 09, 10:45    [7268575]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
Алексей2003
насколько я понимаю, сейчас запрос другой используется..
время изменилось, или осталось прежним?
сколько данных (строк) корректируется за одну транзакцию?
ну и этот индекс: imarpyt_ind2 nonclustered located on PRIMARY import_flag, process_ctrl_num
вообще для этой задачи накаким боком не нужен. он нужен для других? если да, то может стоит его отключать (индекс) и после заливки включать. избежите перестройки индексов в момент обновления.. что может положительно сказаться на производительности.

ЗЫ вместо Апдейт, пишем селект. какая разница во времени выполнения?

для спящего время бодрствования равносильно сну

Еще одна особенность:
Создас индекс
imarpyt_ind6 nonclustered located on PRIMARY import_flag
и изменил
imarpyt_ind2 nonclustered located on PRIMARY process_ctrl_num

План выполнения постоянно выбирает индекс imarpyt_ind6, при этом операций чтения выполняется 125000, вместо 170000 , если использовать imarpyt_ind2 . Аномалия...
5 июн 09, 11:13    [7268753]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Ennor Tiegael
Member

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

exec sp_updatestats
, надеюсь, выполняли, перед тем как индексы начинать тюнить? А то на устаревшей статистике можно и не такие "аномалии" словить.
5 июн 09, 11:17    [7268780]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
Ennor Tiegael,
к моему стыду - нет...
После того как отписался подумал о том же.
Сейчас обновлю и проверю еще раз, отпишусь
5 июн 09, 11:33    [7268911]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
kiril_uaz@mail.ru
Guest
После обновления статистики ситуация не изменилась, план настойчиво выбирает индекс с Import_flag
5 июн 09, 12:11    [7269195]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
ну почему сразу аномалия...
раньше был индекс по import_flag + process_ctrl_num.
соответственно при апдейте перестраивается индекс. т.е. по import_flag перестраивается еще дополнительная колонка process_ctrl_num. изза чего и растут чтения.
сейчас когда индекс по одной колонке, то перестраивается индекс только по ней, и чтений несколько меньше.
попробуйте вообще удалить этот индекс по флагу. и посмотрите сколько чтений будет.

для спящего время бодрствования равносильно сну
5 июн 09, 12:14    [7269217]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
kiril_uaz@mail.ru
Guest
Алексей2003
ну почему сразу аномалия...
раньше был индекс по import_flag + process_ctrl_num.
соответственно при апдейте перестраивается индекс. т.е. по import_flag перестраивается еще дополнительная колонка process_ctrl_num. изза чего и растут чтения.
сейчас когда индекс по одной колонке, то перестраивается индекс только по ней, и чтений несколько меньше.
попробуйте вообще удалить этот индекс по флагу. и посмотрите сколько чтений будет.

для спящего время бодрствования равносильно сну

"Задизейбил" индекс по флагу, чтения возросли - 231000
5 июн 09, 12:21    [7269259]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
не знаю как так получается.. надо экспериментировать похоже, но я провел небольшой:
тест1:
set nocount on
create table t (i int, i2 int, i3 int)
declare @i int
set @i = 0
while @i < 10000 begin
 insert into t values (@i, rand() * 2, rand() * 3)
 set @i = @i + 1
end
--сюда вставлять индексы
go
SET STATISTICS IO on
go
update t set i3 = 0 where i2 = 1
go
SET STATISTICS IO off
go
drop table t
без индексов получилось
Table 't'. Scan count 1, logical reads 3312, physical reads 0, read-ahead reads 0.

тест2:
добавили индекс по i3 (которую обновляем)
create index ix_t_i3 on t(i3)
результат:
Table 't'. Scan count 5001, logical reads 23544, physical reads 0, read-ahead reads 0.


тест 3:
добавили индекс по отбираемому полю:
create index ix_t_i3 on t(i2)
результат:
Table 't'. Scan count 1, logical reads 5046, physical reads 0, read-ahead reads 0.

тест4:
добавили индекс по 2м колонкам, первая из них поле, которое апдейтим
create index ix_t_i3_i2 on t(i3, i2)
результат:
Table 't'. Scan count 5068, logical reads 24131, physical reads 0, read-ahead reads 0.

тест5:
добавил 2 индекса в которых есть изменяемая колонка:
create index ix_t_i3_i2 on t(i3, i2)
create index ix_t_i2 on t(i3)
результат:
Table 't'. Scan count 9921, logical reads 43516, physical reads 0, read-ahead reads 0.

думаю дальше не стоит приводить тесты? понятно, что с увеличением количества индексов, в которых содержится изменяемое поле, количество чтений увеличивается, так же как и увеличивается Scan count...

ЗЫ SQL 2000

для спящего время бодрствования равносильно сну
5 июн 09, 12:42    [7269368]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пож-та с индексами  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
Всем спасибо за помощь.
Думаю остановлюсь на варианте создания двух отдельных индексов по полям process_ctrl_num и import_flag.
В этом случае отработка скрипта проходит за самое приемлемое время с минимальной нагрузкой на винты. Скрипт оставляю подсказанный Алексей2003
5 июн 09, 14:40    [7270122]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить