Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
 Re: Помогите оптимизировать запрос.  [new]
Алексей2003
Member

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

для спящего время бодрствования равносильно сну
10 авг 09, 14:13    [7517619]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Алексей2003
любой. будет хоть понятно что делается долго. и сколько строк выбирается. а то может там и оптимизировать нечего, если возвращается несколько тысяч строк..

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

1. Я сделал set showplan_all on, он мне выдал результат ввиде таблицы, как мне её сюда скопипастить, чтобы понятно было.
2. ЗАпрос возвращает 450 тыщ записей..
10 авг 09, 14:22    [7517664]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
x-x
Member

Откуда:
Сообщений: 230
minya13_85
Полный план, с индексом на identifier в inpos или его удалить? Я его удалил спустя 7 минут..
Что же это за таблица, что некластерный индекс на 20 тысячах записей делается 7 мин?
10 авг 09, 14:27    [7517705]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
x-x
Member

Откуда:
Сообщений: 230
Алексей2003
если возвращается несколько тысяч строк..

minya13_85
ЗАпрос возвращает 450 тыщ записей
Фигасе!
10 авг 09, 14:28    [7517711]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
x-x
minya13_85
Полный план, с индексом на identifier в inpos или его удалить? Я его удалил спустя 7 минут..
Что же это за таблица, что некластерный индекс на 20 тысячах записей делается 7 мин?
Индекс кластерный удалял. Таблица возможно реплицируемая..
10 авг 09, 14:29    [7517721]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Алексей2003
любой. будет хоть понятно что делается долго. и сколько строк выбирается. а то может там и оптимизировать нечего, если возвращается несколько тысяч строк..

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


  declare @sklad nvarchar(20), @datein datetime,@OrgId int, @proba int  set dateformat dmy	1	1	0	NULL	NULL	1	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	SET CMD	0	NULL
 set @proba=585	2	2	0	NULL	NULL	2	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	ASSIGN	0	NULL
 set @datein='1/6/2009'	3	3	0	NULL	NULL	3	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	ASSIGN	0	NULL
 set @OrgId=1	4	4	0	NULL	NULL	4	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	ASSIGN	0	NULL
 set @sklad=N'склад10'	5	5	0	NULL	NULL	5	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	ASSIGN	0	NULL
 SELECT    o.identifier,   MAX(1000000*convert(bigint,o.docID)+(case when o.motion=1      then o.masterID else 0 end))-1000000*convert(bigint,MAX(o.docID)) as masterid   from    main.dbo.izdelia as izd with (nolock)    inner join main.dbo.ostatki as o with (nolock) on izd.identifier=o.identifier    INNER join attrib.dbo.firmname as f with (nolock) on o.masterid=f.firmid    Inner join mainex.dbo.docsdate as docsdate with (nolock) on o.docid=docsdate.docid      inner join tempdb..filter Fltr on o.masterid = Fltr.masterid                        and Fltr.OrgId = @OrgId                         and Fltr.Sklad = @sklad      left join general.dbo.inpos as inpos with(nolock) on inpos.identifier=o.identifier    where    izd.proba = @proba    and docsdate.docexecutedate<@datein       and inpos.identifier is null    and isnull(o.deleted,0)=0    and isnull(o.stateid,-1)<>6      group by    o.identifier, f.globalid  having    sum(o.motion)=1 and MAX(1000000*convert(bigint,o.docID)+(case when o.motion=1      then o.masterID else 0 end))-1000000*convert(bigint,MAX(o.docID)) <> 0	6	6	0	NULL	NULL	6	NULL	190,4358	NULL	NULL	NULL	41,64714	NULL	NULL	SELECT	0	NULL
  |--Compute Scalar(DEFINE:([Expr1018]=[Expr1016]-(1000000)*CONVERT(bigint,[Expr1017],0)))	6	7	6	Compute Scalar	Compute Scalar	DEFINE:([Expr1018]=[Expr1016]-(1000000)*CONVERT(bigint,[Expr1017],0))	[Expr1018]=[Expr1016]-(1000000)*CONVERT(bigint,[Expr1017],0)	190,4358	0	1,904358E-05	42	41,64714	[o].[identifier], [Expr1018]	NULL	PLAN_ROW	0	1
       |--Filter(WHERE:(([Expr1016]-(1000000)*CONVERT(bigint,[Expr1017],0))<>(0) AND [Expr1015]=(1)))	6	8	7	Filter	Filter	WHERE:(([Expr1016]-(1000000)*CONVERT(bigint,[Expr1017],0))<>(0) AND [Expr1015]=(1))	NULL	190,4358	0	0,003810957	46	41,64712	[o].[identifier], [Expr1016], [Expr1017]	NULL	PLAN_ROW	0	1
            |--Compute Scalar(DEFINE:([Expr1015]=CASE WHEN [Expr1035]=(0) THEN NULL ELSE [Expr1036] END))	6	9	8	Compute Scalar	Compute Scalar	DEFINE:([Expr1015]=CASE WHEN [Expr1035]=(0) THEN NULL ELSE [Expr1036] END)	[Expr1015]=CASE WHEN [Expr1035]=(0) THEN NULL ELSE [Expr1036] END	2761,563	0	0,003037719	50	41,64331	[o].[identifier], [Expr1015], [Expr1016], [Expr1017]	NULL	PLAN_ROW	0	1
                 |--Stream Aggregate(GROUP BY:([f].[globalID], [o].[identifier]) DEFINE:([Expr1035]=COUNT_BIG([main].[dbo].[ostatki].[motion] as [o].[motion]), [Expr1036]=SUM([main].[dbo].[ostatki].[motion] as [o].[motion]), [Expr1016]=MAX([Expr1019]), [Expr1017]=MAX([main].[dbo].[ostatki].[docID] as [o].[docID])))	6	10	9	Stream Aggregate	Aggregate	GROUP BY:([f].[globalID], [o].[identifier])	[Expr1035]=COUNT_BIG([main].[dbo].[ostatki].[motion] as [o].[motion]), [Expr1036]=SUM([main].[dbo].[ostatki].[motion] as [o].[motion]), [Expr1016]=MAX([Expr1019]), [Expr1017]=MAX([main].[dbo].[ostatki].[docID] as [o].[docID])	2761,563	0	0,003037719	50	41,64331	[o].[identifier], [Expr1016], [Expr1017], [Expr1035], [Expr1036]	NULL	PLAN_ROW	0	1
                      |--Sort(ORDER BY:([f].[globalID] ASC, [izd].[identifier] ASC))	6	11	10	Sort	Sort	ORDER BY:([f].[globalID] ASC, [izd].[identifier] ASC)	NULL	2761,563	0,01126126	0,04934642	77	41,64027	[izd].[identifier], [o].[identifier], [o].[docID], [o].[motion], [f].[globalID], [Expr1019]	NULL	PLAN_ROW	0	1
                           |--Filter(WHERE:([General].[dbo].[InPos].[identifier] as [inpos].[identifier] IS NULL))	6	12	11	Filter	Filter	WHERE:([General].[dbo].[InPos].[identifier] as [inpos].[identifier] IS NULL)	NULL	2761,563	0	0,001917066	77	41,57966	[izd].[identifier], [o].[identifier], [o].[docID], [o].[motion], [f].[globalID], [Expr1019]	NULL	PLAN_ROW	0	1
                                |--Hash Match(Left Outer Join, HASH:([o].[identifier])=([inpos].[identifier]), RESIDUAL:([General].[dbo].[InPos].[identifier] as [inpos].[identifier]=[main].[dbo].[ostatki].[identifier] as [o].[identifier]))	6	13	12	Hash Match	Left Outer Join	HASH:([o].[identifier])=([inpos].[identifier]), RESIDUAL:([General].[dbo].[InPos].[identifier] as [inpos].[identifier]=[main].[dbo].[ostatki].[identifier] as [o].[identifier])	NULL	3993,887	0	0,3103906	104	41,57775	[izd].[identifier], [o].[identifier], [o].[docID], [o].[motion], [f].[globalID], [inpos].[identifier], [Expr1019]	NULL	PLAN_ROW	0	1
                                     |--Merge Join(Inner Join, MERGE:([izd].[identifier])=([o].[identifier]), RESIDUAL:([main].[dbo].[izdelia].[identifier] as [izd].[identifier]=[main].[dbo].[ostatki].[identifier] as [o].[identifier]))	6	14	13	Merge Join	Inner Join	MERGE:([izd].[identifier])=([o].[identifier]), RESIDUAL:([main].[dbo].[izdelia].[identifier] as [izd].[identifier]=[main].[dbo].[ostatki].[identifier] as [o].[identifier])	NULL	3993,887	0	1,314912	77	41,07689	[izd].[identifier], [o].[identifier], [o].[docID], [o].[motion], [f].[globalID], [Expr1019]	NULL	PLAN_ROW	0	1
                                     |    |--Index Seek(OBJECT:([main].[dbo].[izdelia].[IX_izdelia_4] AS [izd]), SEEK:([izd].[proba]=[@proba]) ORDERED FORWARD)	6	15	14	Index Seek	Index Seek	OBJECT:([main].[dbo].[izdelia].[IX_izdelia_4] AS [izd]), SEEK:([izd].[proba]=[@proba]) ORDERED FORWARD	[izd].[identifier]	612708,6	2,02571	0,6741365	34	2,699846	[izd].[identifier]	NULL	PLAN_ROW	0	1
                                     |    |--Sort(ORDER BY:([o].[identifier] ASC))	6	16	14	Sort	Sort	ORDER BY:([o].[identifier] ASC)	NULL	10583,03	0,01126126	0,6495364	52	37,06213	[o].[identifier], [o].[docID], [o].[motion], [f].[globalID], [Expr1019]	NULL	PLAN_ROW	0	1
                                     |         |--Hash Match(Inner Join, HASH:([o].[docID])=([docsdate].[docID]), RESIDUAL:([main].[dbo].[ostatki].[docID] as [o].[docID]=[Mainex].[dbo].[docsDate].[docID] as [docsdate].[docID]))	6	17	16	Hash Match	Inner Join	HASH:([o].[docID])=([docsdate].[docID]), RESIDUAL:([main].[dbo].[ostatki].[docID] as [o].[docID]=[Mainex].[dbo].[docsDate].[docID] as [docsdate].[docID])	NULL	10583,03	0	1,501391	52	36,40133	[o].[identifier], [o].[docID], [o].[motion], [f].[globalID], [Expr1019]	NULL	PLAN_ROW	0	1
                                     |              |--Compute Scalar(DEFINE:([Expr1019]=(1000000)*CONVERT(bigint,[main].[dbo].[ostatki].[docID] as [o].[docID],0)+CONVERT_IMPLICIT(bigint,CASE WHEN [main].[dbo].[ostatki].[motion] as [o].[motion]=(1) THEN [main].[dbo].[ostatki].[masterID] as [o].[masterID] ELSE (0) END,0)))	6	18	17	Compute Scalar	Compute Scalar	DEFINE:([Expr1019]=(1000000)*CONVERT(bigint,[main].[dbo].[ostatki].[docID] as [o].[docID],0)+CONVERT_IMPLICIT(bigint,CASE WHEN [main].[dbo].[ostatki].[motion] as [o].[motion]=(1) THEN [main].[dbo].[ostatki].[masterID] as [o].[masterID] ELSE (0) END,0))	[Expr1019]=(1000000)*CONVERT(bigint,[main].[dbo].[ostatki].[docID] as [o].[docID],0)+CONVERT_IMPLICIT(bigint,CASE WHEN [main].[dbo].[ostatki].[motion] as [o].[motion]=(1) THEN [main].[dbo].[ostatki].[masterID] as [o].[masterID] ELSE (0) END,0)	10590,45	0	0,001059045	52	34,33237	[o].[identifier], [o].[docID], [o].[motion], [f].[globalID], [Expr1019]	NULL	PLAN_ROW	0	1
                                     |              |    |--Filter(WHERE:(isnull([main].[dbo].[ostatki].[deleted] as [o].[deleted],(0))=(0) AND isnull([main].[dbo].[ostatki].[stateID] as [o].[stateID],(-1))<>(6)))	6	19	18	Filter	Filter	WHERE:(isnull([main].[dbo].[ostatki].[deleted] as [o].[deleted],(0))=(0) AND isnull([main].[dbo].[ostatki].[stateID] as [o].[stateID],(-1))<>(6))	NULL	10590,45	0	0,01355578	48	34,33131	[o].[identifier], [o].[docID], [o].[motion], [o].[masterID], [f].[globalID]	NULL	PLAN_ROW	0	1
                                     |              |         |--Nested Loops(Inner Join, OUTER REFERENCES:([Uniq1004], [o].[identifier], [Expr1031]) OPTIMIZED WITH UNORDERED PREFETCH)	6	20	19	Nested Loops	Inner Join	OUTER REFERENCES:([Uniq1004], [o].[identifier], [Expr1031]) OPTIMIZED WITH UNORDERED PREFETCH	NULL	10590,45	0	0,04426808	52	34,31775	[o].[identifier], [o].[docID], [o].[motion], [o].[masterID], [o].[stateID], [o].[deleted], [f].[globalID]	NULL	PLAN_ROW	0	1
                                     |              |              |--Nested Loops(Inner Join, OUTER REFERENCES:([Fltr].[Masterid]) OPTIMIZED)	6	23	20	Nested Loops	Inner Join	OUTER REFERENCES:([Fltr].[Masterid]) OPTIMIZED	NULL	10590,45	0	0,04426808	46	0,108014	[Uniq1004], [o].[identifier], [o].[masterID], [f].[globalID]	NULL	PLAN_ROW	0	1
                                     |              |              |    |--Nested Loops(Inner Join, OUTER REFERENCES:([Fltr].[Masterid]))	6	25	23	Nested Loops	Inner Join	OUTER REFERENCES:([Fltr].[Masterid])	NULL	1	0	4,18E-06	15	0,00659216	[f].[globalID], [Fltr].[Masterid]	NULL	PLAN_ROW	0	1
                                     |              |              |    |    |--Table Scan(OBJECT:([tempdb].[dbo].[filter] AS [Fltr]), WHERE:([tempdb].[dbo].[filter].[OrgId] as [Fltr].[OrgId]=[@OrgId] AND CONVERT_IMPLICIT(nvarchar(127),[tempdb].[dbo].[filter].[Sklad] as [Fltr].[Sklad],0)=[@sklad]))	6	27	25	Table Scan	Table Scan	OBJECT:([tempdb].[dbo].[filter] AS [Fltr]), WHERE:([tempdb].[dbo].[filter].[OrgId] as [Fltr].[OrgId]=[@OrgId] AND CONVERT_IMPLICIT(nvarchar(127),[tempdb].[dbo].[filter].[Sklad] as [Fltr].[Sklad],0)=[@sklad])	[Fltr].[Masterid]	1	0,003125	0,0001691	22	0,0032941	[Fltr].[Masterid]	NULL	PLAN_ROW	0	1
                                     |              |              |    |    |--Clustered Index Seek(OBJECT:([attrib].[dbo].[firmName].[IX_firmName] AS [f]), SEEK:([f].[FirmID]=[tempdb].[dbo].[filter].[Masterid] as [Fltr].[Masterid]) ORDERED FORWARD)	6	29	25	Clustered Index Seek	Clustered Index Seek	OBJECT:([attrib].[dbo].[firmName].[IX_firmName] AS [f]), SEEK:([f].[FirmID]=[tempdb].[dbo].[filter].[Masterid] as [Fltr].[Masterid]) ORDERED FORWARD	[f].[globalID]	1	0,003125	0,0001581	11	0,0032831	[f].[globalID]	NULL	PLAN_ROW	0	1
                                     |              |              |    |--Index Seek(OBJECT:([main].[dbo].[ostatki].[IX_ostatki_2] AS [o]), SEEK:([o].[masterID]=[tempdb].[dbo].[filter].[Masterid] as [Fltr].[Masterid]) ORDERED FORWARD)	6	30	23	Index Seek	Index Seek	OBJECT:([main].[dbo].[ostatki].[IX_ostatki_2] AS [o]), SEEK:([o].[masterID]=[tempdb].[dbo].[filter].[Masterid] as [Fltr].[Masterid]) ORDERED FORWARD	[Uniq1004], [o].[identifier], [o].[masterID]	10590,45	0,04534722	0,0118065	42	0,05715372	[Uniq1004], [o].[identifier], [o].[masterID]	NULL	PLAN_ROW	0	1
                                     |              |              |--Clustered Index Seek(OBJECT:([main].[dbo].[ostatki].[IX_ostatki] AS [o]), SEEK:([o].[identifier]=[main].[dbo].[ostatki].[identifier] as [o].[identifier] AND [Uniq1004]=[Uniq1004]) LOOKUP ORDERED FORWARD)	6	32	20	Clustered Index Seek	Clustered Index Seek	OBJECT:([main].[dbo].[ostatki].[IX_ostatki] AS [o]), SEEK:([o].[identifier]=[main].[dbo].[ostatki].[identifier] as [o].[identifier] AND [Uniq1004]=[Uniq1004]) LOOKUP ORDERED FORWARD	[o].[docID], [o].[motion], [o].[stateID], [o].[deleted]	1	0,003125	0,0001581	17	34,16547	[o].[docID], [o].[motion], [o].[stateID], [o].[deleted]	NULL	PLAN_ROW	0	10590,45
                                     |              |--Nested Loops(Inner Join, OUTER REFERENCES:([Expr1033], [Expr1034], [Expr1032]))	6	46	17	Nested Loops	Inner Join	OUTER REFERENCES:([Expr1033], [Expr1034], [Expr1032])	NULL	163496,1	0,3875695	0,1800027	11	0,5675722	[docsdate].[docID]	NULL	PLAN_ROW	0	1
                                     |                   |--Compute Scalar(DEFINE:(([Expr1033],[Expr1034],[Expr1032])=GetRangeWithMismatchedTypes(NULL,[@datein],(10))))	6	47	46	Compute Scalar	Compute Scalar	DEFINE:(([Expr1033],[Expr1034],[Expr1032])=GetRangeWithMismatchedTypes(NULL,[@datein],(10)))	([Expr1033],[Expr1034],[Expr1032])=GetRangeWithMismatchedTypes(NULL,[@datein],(10))	1	0	0	0	0	[Expr1033], [Expr1034], [Expr1032]	NULL	PLAN_ROW	0	1
                                     |                   |    |--Constant Scan	6	48	47	Constant Scan	Constant Scan	NULL	NULL	1	0	0	0	0	NULL	NULL	PLAN_ROW	0	1
                                     |                   |--Index Seek(OBJECT:([Mainex].[dbo].[docsDate].[IX_Docexecute] AS [docsdate]), SEEK:([docsdate].[docExecuteDate] > [Expr1033] AND [docsdate].[docExecuteDate] < [Expr1034]) ORDERED FORWARD)	6	52	46	Index Seek	Index Seek	OBJECT:([Mainex].[dbo].[docsDate].[IX_Docexecute] AS [docsdate]), SEEK:([docsdate].[docExecuteDate] > [Expr1033] AND [docsdate].[docExecuteDate] < [Expr1034]) ORDERED FORWARD	[docsdate].[docID]	163496,1	0,3875695	0,1800027	11	0,5675722	[docsdate].[docID]	NULL	PLAN_ROW	0	1
                                     |--Table Scan(OBJECT:([General].[dbo].[InPos] AS [inpos]))	6	55	13	Table Scan	Table Scan	OBJECT:([General].[dbo].[InPos] AS [inpos])	[inpos].[identifier]	12587	0,1764583	0,0140027	36	0,190461	[inpos].[identifier]	NULL	PLAN_ROW	0	1

Вообще-то этот план ввиде таблицы, но не знаю как сюда скопипастить..
10 авг 09, 14:34    [7517750]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
x-x
Алексей2003
если возвращается несколько тысяч строк..

minya13_85
ЗАпрос возвращает 450 тыщ записей
Фигасе!

Почему-то так много записей? Объясняю: конечно юзеру это всё не просмотреть )) Это я делаю для того, чтобы эти данные вогнать во временную таблицу. и в дальнейшем её использовать.
10 авг 09, 14:37    [7517762]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
ладно, вопрос следующий. сколько по времени отработает select count(*) .........?

для спящего время бодрствования равносильно сну
10 авг 09, 14:45    [7517817]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
x-x
Member

Откуда:
Сообщений: 230
minya13_85
Вообще-то этот план ввиде таблицы, но не знаю как сюда скопипастить..

Сохраните как xml и приаттачьте.
Хотя уже ожидаемое количество строк как то не соотносится с 450тысячами.
Статистика давно обновлялась?
10 авг 09, 14:45    [7517820]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Алексей2003
ладно, вопрос следующий. сколько по времени отработает select count(*) .........?

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

select count(*) к чему?
10 авг 09, 14:49    [7517842]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
чтобы проверить сколько времени обрабатывается сам запрос. и сколько займет примерно пересылка всех данных. если 5 минут count(*) тогда есть что оптимизировать. если 10 секунд, тогда шлите меньше данных.

для спящего время бодрствования равносильно сну
10 авг 09, 14:51    [7517860]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Алексей2003
чтобы проверить сколько времени обрабатывается сам запрос. и сколько займет примерно пересылка всех данных. если 5 минут count(*) тогда есть что оптимизировать. если 10 секунд, тогда шлите меньше данных.

для спящего время бодрствования равносильно сну
я имел ввиду такой запрос:
SELECT 
	count(*) as c
from 
	main.dbo.izdelia as izd with (nolock) 
	inner join main.dbo.ostatki as o with (nolock) on izd.identifier=o.identifier 
	INNER join attrib.dbo.firmname as f with (nolock) on o.masterid=f.firmid 
	Inner join mainex.dbo.docsdate as docsdate with (nolock) on o.docid=docsdate.docid 
where 
	izd.proba = @proba 
	and docsdate.docexecutedate<@datein 
	and o.identifier not in (select identifier from  general.dbo.inpos with (nolock)) 
	and isnull(o.deleted,0)=0 
	and isnull(o.stateid,-1)<>6 
    and (	(@OrgId = 0 and @sklad = 'склад10' and o.masterid in (99998,88881)	)	--optest
		 or	(@OrgId = 0 and @sklad = 'склад4' and o.masterid in (33,88882)		)	
		 or (@OrgId = 1 and @sklad = 'склад10' and o.masterid in (99999,88888)	)	--td estet
		 or (@OrgId = 1 and @sklad = 'склад4' and o.masterid in (3383,88889)	)	
		 or	(@OrgId = 1 and @sklad = 'демзал' and o.masterid = 3518		)
		 or	(@OrgId = 1 and @sklad = 'демзал10' and o.masterid = 99995	)
		 or (@OrgId = 2 and @sklad = 'перевал' and o.masterid = 283788	)
		)
having 
	sum(o.motion)=1 and MAX(1000000*convert(bigint,o.docID)+(case when o.motion=1 
			then o.masterID else 0 end))-1000000*convert(bigint,MAX(o.docID)) <> 0
10 авг 09, 15:00    [7517911]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
minya13_85
Алексей2003
чтобы проверить сколько времени обрабатывается сам запрос. и сколько займет примерно пересылка всех данных. если 5 минут count(*) тогда есть что оптимизировать. если 10 секунд, тогда шлите меньше данных.

для спящего время бодрствования равносильно сну
я имел ввиду такой запрос:
SELECT 
	count(*) as c
from 
	main.dbo.izdelia as izd with (nolock) 
	inner join main.dbo.ostatki as o with (nolock) on izd.identifier=o.identifier 
	INNER join attrib.dbo.firmname as f with (nolock) on o.masterid=f.firmid 
	Inner join mainex.dbo.docsdate as docsdate with (nolock) on o.docid=docsdate.docid 
where 
	izd.proba = @proba 
	and docsdate.docexecutedate<@datein 
	and o.identifier not in (select identifier from  general.dbo.inpos with (nolock)) 
	and isnull(o.deleted,0)=0 
	and isnull(o.stateid,-1)<>6 
    and (	(@OrgId = 0 and @sklad = 'склад10' and o.masterid in (99998,88881)	)	--optest
		 or	(@OrgId = 0 and @sklad = 'склад4' and o.masterid in (33,88882)		)	
		 or (@OrgId = 1 and @sklad = 'склад10' and o.masterid in (99999,88888)	)	--td estet
		 or (@OrgId = 1 and @sklad = 'склад4' and o.masterid in (3383,88889)	)	
		 or	(@OrgId = 1 and @sklad = 'демзал' and o.masterid = 3518		)
		 or	(@OrgId = 1 and @sklad = 'демзал10' and o.masterid = 99995	)
		 or (@OrgId = 2 and @sklad = 'перевал' and o.masterid = 283788	)
		)
having 
	sum(o.motion)=1 and MAX(1000000*convert(bigint,o.docID)+(case when o.motion=1 
			then o.masterID else 0 end))-1000000*convert(bigint,MAX(o.docID)) <> 0
Если да, то он выполняется 2 минуты. Это запрос без изменений который. Он пока оптимальней, выше всех предложенных.
10 авг 09, 15:00    [7517917]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
x-x
Member

Откуда:
Сообщений: 230
x-x
Сохраните как xml и приаттачьте.
Хотя уже ожидаемое количество строк как то не соотносится с 450тысячами.
Статистика давно обновлялась?
?
10 авг 09, 15:12    [7517990]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Я думаю тут ничего не поможет!! ((( в таблице остатки dbo.ostatki как я упомянул в самом начале 33 млн записей. Даже простая выборка из таблицы, что-то вроде этой
select o.identifier
from main.dbo.ostatki as o
where isnull(o.deleted,0)=0 
	and isnull(o.stateid,-1)<>6 
Длится о-о-очень долго. просто в этой таблице содержится остаток на складе, на любую дату, т.е. с каждым днем таблица растет. Мне кажется там никакие индексы не спасут.. никакая оптимизация...((
10 авг 09, 15:12    [7517991]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
x-x
Member

Откуда:
Сообщений: 230
minya13_85
Я думаю тут ничего не поможет!!

А такая выборка сколько длится?
select o.docID
from main.dbo.ostatki as o
:)
10 авг 09, 15:18    [7518025]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
x-x
Member

Откуда:
Сообщений: 230
minya13_85
((( в таблице остатки dbo.ostatki как я упомянул в самом начале 33 млн записей.Мне кажется там никакие индексы не спасут.. никакая оптимизация...((

Ну и что. А вот в одной моей табличке 211327218 записей. И ничего, ни одного запроса по несколько минут не припоминаю
10 авг 09, 15:20    [7518036]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
iljy
Member

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

индексы как раз могут спасти. Проанализируйте, по каким критериям лучше всего отбираются записи - и попробуйте создать нужные индексы. Возможно - с включенными колонками, чтобы исбежать поиска в кластерном, если нужно ограниченное количество дополнительных полей. и еще - избегайте условий типа isnull(o.deleted,0)=0, вы мешаете оптимизатору использовать индекс по колонке если вдруг такой существует.

33млн - не критично, у меня на таблице в 30млн достаточно сложный запрос с объединением нескольких таблиц, фильтрами и рассчетами, отрабатывает 2сек. хотя конечно записей там выбирается не 450тыс, а всего 300тыс;) так что дерзайте
10 авг 09, 15:23    [7518059]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
x-x
minya13_85
Я думаю тут ничего не поможет!!

А такая выборка сколько длится?
select o.docID
from main.dbo.ostatki as o
:)
Это условие выполнится наверное через 20 минут или даже 30 минут, не хочу сервер нагружать. Ведь этот запрос должен вернуть, по идее33 млн записей Сколько времени займет просто отрисовка данных? какие-то данные он мне сразу показывает, но внизу еще крутит, идет Executing query. Чем больше условий задаем во where, я думаю, тем больше Машине облегчаем задачу выборки, благодаря индексам.
10 авг 09, 15:24    [7518066]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
Glory
Member

Откуда:
Сообщений: 104760
minya13_85
Чем больше условий задаем во where, я думаю, тем больше Машине облегчаем задачу выборки, благодаря индексам.

И вы думаете, что при where isnull(o.deleted,0)=0 and isnull(o.stateid,-1)<>6 серверу придется просканировать не 33млн. записей, а меньше ?
10 авг 09, 15:27    [7518083]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
x-x
Member

Откуда:
Сообщений: 230
minya13_85
x-x
minya13_85
Я думаю тут ничего не поможет!!

А такая выборка сколько длится?
select o.docID
from main.dbo.ostatki as o
:)
Это условие выполнится наверное через 20 минут или даже 30 минут, не хочу сервер нагружать. Ведь этот запрос должен вернуть, по идее33 млн записей Сколько времени займет просто отрисовка данных? какие-то данные он мне сразу показывает, но внизу еще крутит, идет Executing query. Чем больше условий задаем во where, я думаю, тем больше Машине облегчаем задачу выборки, благодаря индексам.
Этот запрос вернёт только одно поле, причем вернёт его после одного index scan, где размер индексированного поля 4 байта. Потому я и спросил именно такой запрос. Времени на него потребуется примерно секунд 30, если у нас сервера близки по характеристикам. Перед тем, как запостить я запросил одно int поле из индекса у себя для 24 млн записей. Полминуты для первичного ключа типа int.
10 авг 09, 15:28    [7518094]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
x-x
minya13_85
((( в таблице остатки dbo.ostatki как я упомянул в самом начале 33 млн записей.Мне кажется там никакие индексы не спасут.. никакая оптимизация...((

Ну и что. А вот в одной моей табличке 211327218 записей. И ничего, ни одного запроса по несколько минут не припоминаю
211 млн записей???. И просто
Select поле From table
. Выполняет за несколько секунд?? Это как? Как у вас построены индексы?
10 авг 09, 15:29    [7518098]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
x-x
Member

Откуда:
Сообщений: 230
x-x
x-x
Сохраните как xml и приаттачьте.
Хотя уже ожидаемое количество строк как то не соотносится с 450тысячами.
Статистика давно обновлялась?
?
???
10 авг 09, 15:29    [7518101]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
x-x
Member

Откуда:
Сообщений: 230
minya13_85
x-x
minya13_85
((( в таблице остатки dbo.ostatki как я упомянул в самом начале 33 млн записей.Мне кажется там никакие индексы не спасут.. никакая оптимизация...((

Ну и что. А вот в одной моей табличке 211327218 записей. И ничего, ни одного запроса по несколько минут не припоминаю
211 млн записей???. И просто
Select поле From table
. Выполняет за несколько секунд?? Это как? Как у вас построены индексы?
В таком запросе индексы не работают. Но одно дело сканить всю таблицу (кластерный индекс) для получения этого поля, и другое - запросить его из короткого индекса.
10 авг 09, 15:31    [7518115]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос.  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
x-x
x-x
x-x
Сохраните как xml и приаттачьте.
Хотя уже ожидаемое количество строк как то не соотносится с 450тысячами.
Статистика давно обновлялась?
?
???
Как его сохранить в xml?
10 авг 09, 15:33    [7518138]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить