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

Откуда:
Сообщений: 1389
Здравствуйте, какой код быстрее отработает?
declare @m int,@dvc int
select @dvc=100500
select @m=max(t.cc)
			from (
					select count(*) cc from #analizspec where pcode = @dvc	--1
					union
					select count(*) cc from #analizspec_rk where pcode = @dvc	--2
					union
					select count(*) cc from #analizspec_u where pcode = @dvc	--3
					union
					select count(*) cc from #analizspec_v where pcode = @dvc	--4
					union
					select count(*) cc from #analizspec_t where pcode = @dvc	--5
				) t

или
declare @m int,@dvc int
select @dvc=100500
declare @t table (cc int)
insert into @t (cc)
select count(*) cc from #analizspec where pcode = @dvc	--1
insert into @t (cc)
select count(*) cc from #analizspec_rk where pcode = @dvc	--2
insert into @t (cc)
select count(*) cc from #analizspec_u where pcode = @dvc	--3
insert into @t (cc)
select count(*) cc from #analizspec_v where pcode = @dvc	--4
insert into @t (cc)
select count(*) cc from #analizspec_t where pcode = @dvc	--5

select @m=max(cc)
	from @t
28 сен 16, 06:20    [19716314]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
aleks2
Guest
На пяти записях - фсе по-барабану.
Но первый будет прытче.

И UNION на UNION ALL замени.
28 сен 16, 06:27    [19716318]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
aleks2
На пяти записях - фсе по-барабану.
Но первый будет прытче.

И UNION на UNION ALL замени.


А почему?
28 сен 16, 06:44    [19716336]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
aleks2
На пяти записях - фсе по-барабану.
Но первый будет прытче.

И UNION на UNION ALL замени.


Почему первый прытче )))
28 сен 16, 06:45    [19716337]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
aleks2
Guest
RMagistr2015
aleks2
На пяти записях - фсе по-барабану.
Но первый будет прытче.

И UNION на UNION ALL замени.


Почему первый прытче )))

Патаму, что таблицу не надо писать.
28 сен 16, 07:22    [19716373]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
RMagistr2015
aleks2
На пяти записях - фсе по-барабану.
Но первый будет прытче.

И UNION на UNION ALL замени.


Почему первый прытче )))
Ну и вообще, во втором 6 транзакций.
Каждую надо открыть, записать в лог, закрыть, записать в лог.
6 запросов, каждый нужно превратить в семантическое дерево, скомпилить, посмотреть статистику, выполнить.

А в первом варианте это один запрос, пусть и более тяжёлый.
28 сен 16, 15:08    [19718646]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
Ещё один вопрос по скорости:

Дано - две таблицы @t1 - 10 записей, @t2 - 100000 записей

Что быстрее?

select * 
    from @t1 t1
        join @t2 t2
            on t2.vcode=t1.pcode

или
select * 
    from @t2 t2
        join @t1 t1 
            on t2.vcode=t1.pcode

и играет ли роль если после ON менять местами:
t2.vcode=t1.pcode

или
t1.pcode=t2.vcode

?
29 сен 16, 07:07    [19721593]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
alexeyvg
RMagistr2015
пропущено...


Почему первый прытче )))
Ну и вообще, во втором 6 транзакций.
Каждую надо открыть, записать в лог, закрыть, записать в лог.
6 запросов, каждый нужно превратить в семантическое дерево, скомпилить, посмотреть статистику, выполнить.

А в первом варианте это один запрос, пусть и более тяжёлый.


Спасибо большое
29 сен 16, 07:07    [19721594]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
alexeyvg
RMagistr2015
пропущено...


Почему первый прытче )))
Ну и вообще, во втором 6 транзакций.
Каждую надо открыть, записать в лог, закрыть, записать в лог.
6 запросов, каждый нужно превратить в семантическое дерево, скомпилить, посмотреть статистику, выполнить.

А в первом варианте это один запрос, пусть и более тяжёлый.


Как вы видите из первого примера, второй вариант более предпочтительнее по скорости, но я использовал в подзапросе временные таблицы, которые предварительно наполнял данными
Что если в данном алгоритме заменить временные таблицы на подзапросы? и если данный алгоритм должен будет выполняться несколько раз? будет ли тут оправдано использование временных таблиц? или придётся всё время писать подзапросы?
29 сен 16, 07:18    [19721607]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
alexeyvg
RMagistr2015
пропущено...


Почему первый прытче )))
Ну и вообще, во втором 6 транзакций.
Каждую надо открыть, записать в лог, закрыть, записать в лог.
6 запросов, каждый нужно превратить в семантическое дерево, скомпилить, посмотреть статистику, выполнить.

А в первом варианте это один запрос, пусть и более тяжёлый.


И к тому же ещё один вопрос - что быстрее работает временная таблица? или табличная переменная? На сколько я помню там всё дело в организации памяти...?
29 сен 16, 07:20    [19721611]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
На этот вопрос нашёл ответ, извините
29 сен 16, 07:22    [19721614]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
Уважаемый Модератор, пожалуйста Удалите три моих сообщения, вопросы заданы не корректно, я прошу прощения (До "Спасибо большое")
29 сен 16, 07:24    [19721617]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
RMagistr2015
Member

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

Как можно ускорить этот код?

+ Код

use [ing20160922]
--allsee 1

declare @Pdoc_vcode			int				-- Код документа
	,@Pdoc_nomen			int				-- Номенклатура
	,@Pdoc_irs				varchar (300)	-- Заявка на испытание резиновой смеси
	,@irs_isp				int				-- флаг того что использовать: 0 - для резиновых смесей, 1 - для ГП и сырья

DECLARE @vcode int
		,@vc int
		,@irs varchar(100)
        ,@cc int
        ,@nomen int
		,@irsvc int
		,@str  nvarchar (4000)
SELECT @vcode=4465 --4707 --@Pdoc_vcode
		,@nomen=3255 --738 --@Pdoc_nomen
		,@irs='3428|3255_' --'3243|738_' --@Pdoc_irs
		,@irs_isp=1

-- Определяем рабочую таблицу
declare @doctable table (id int identity
				   ,vcode int --vcode pdoc'a
			       ,tdoc varchar(3) --Тип документа pdoc'a
			       ,pref varchar(100) --Префикс pdoc'a
			       ,numb varchar(100) --Номер pdoc'a
			       ,docvcode varchar(100) --Vcod выбранного документа, например Заказ на пр-во для АГП
			       ,docname varchar(100) --Номер заказа, в остальных случаях null
			       ,nomen int --Код номенклатуры из Номенклатора или из marka
			       ,nomenname varchar(300) --Наименование номенклатуры
			       ,nparty varchar(100) --Партия
                        )

SELECT @irsvc=convert(int,substring(@irs,1,CHARINDEX('|',@irs)-1))

--Заполняем временную табличку
if @irs_isp=0
	INSERT INTO @doctable (vcode,tdoc  ,pref,numb  ,docvcode,docname,nomen     ,nomenname    ,nparty)
	SELECT distinct a.vcode,z.TDOC,NULL,z.numb,z.VCODE ,NULL   ,zs.marknom,zs.markasmesi,zs.npart
			  /*null --zs.npart --Таня попросила сново раскоментарить это поле 20150826 */        
		FROM ZAYAVKAISP z (nolock)
			JOIN V_ZAYAVKAISPSPECS_IRS zs (nolock)
				on z.vcode=zs.pcode
			JOIN analiz a (nolock)
				on a.zsvcode=zs.vcode
		WHERE isnull(zs.flag,0)<>0
			AND z.VCODE=@irsvc 
	order by a.vcode 
	else 
INSERT INTO @doctable (vcode,tdoc  ,pref,numb  ,docvcode,docname,nomen     ,nomenname    ,nparty)
SELECT distinct a.vcode,z.TDOC,NULL,z.numb,z.VCODE ,NULL   ,zs.marknom,zs.markasmesi,zs.npart
          --null --zs.npart --Таня попросила сново раскоментарить это поле 20150826
	FROM ZAYAVKAISP z (nolock)
		JOIN V_ZAYAVKAISPSPECS_ISP zs (nolock)
			on z.vcode=zs.pcode
		JOIN analiz a (nolock)
			on convert (int,a.isp)=zs.vcode
	WHERE isnull(zs.flag,0)<>0
		AND z.VCODE=@irsvc 
order by a.vcode 	

--блок объявления временных таблиц ---------------------------------------------------------------------------------------------------------------------------------
--Таблица на вкладке "Вискозиметр"
declare @analizspec table (rn int,id int identity,[vcode] [int],[pcode] [int],[wuser] [varchar](100),
	[wdate] [datetime] NULL,[material] [varchar](100) NULL,[lot] [varchar](100) NULL,[rotortype] [varchar](100) NULL,[tc] [varchar](100) NULL,
	[lm] [varchar](100) NULL,[t5] [varchar](100) NULL,[nparty] [varchar](100) NULL,[nomer] [varchar](100) NULL,[unitcode] [int] NULL,
	[maxv] [money] NULL,[operator] [varchar](200) NULL,[mf] [varchar](300) NULL,[t3] [varchar](100) NULL,[typeisp] [int] NULL,
	[t35] [varchar](20) NULL,[t18] [money] NULL,[ispname] [varchar](100) NULL)
--таблица на вкладке "Реология"
declare @analizspec_rk table (rn int,id int identity,[vcode] [int] NOT NULL,[pcode] [int] NULL,[wuser] [varchar](100) NULL,[wdate] [datetime] NULL,
[dateisp] [datetime] NULL,[npart] [varchar](100) NULL,[material] [varchar](100) NULL,[mi] [varchar](100) NULL,[mh] [varchar](100) NULL,
[dm] [varchar](100) NULL,[t50] [varchar](100) NULL,[t90] [varchar](100) NULL,[rv] [varchar](100) NULL,[ts] [varchar](100) NULL,[tr] [varchar](100) NULL,
[tgp] [varchar](100) NULL,[ShkMt] [varchar](100) NULL,[ShkVr] [varchar](100) NULL,[cod] [int] NULL,[nomer] [int] NULL,[postavschik] [varchar](100) NULL,
[unitcode] [int] NULL,[typeisp] [int] NULL,[typeob] [int] NULL
		)
--Таблица на вкладке "Разрывная машина"
declare @analizspec_u table (rn int,id int identity,[vcode] [int] NOT NULL,[pcode] [int] NULL,[wuser] [varchar](100) NULL,[wdate] [datetime] NULL,
[marka] [varchar](500) NULL,[zapravka] [int] NULL,[rezhim] [varchar](100) NULL,[prochnost] [money] NULL,[udlin] [money] NULL,
[tverdost] [money] NULL,[unitcode] [int] NULL,[procent] [money] NULL,[pokazatel] [money] NULL,[typeisp] [int] NULL,[S] [money] NULL,
[ispname] [varchar](200) NULL,regim int null)
--Таблица на вкладке "Весы"
declare @analizspec_v table (rn int,id int identity,[vcode] [int] NOT NULL,[pcode] [int] NULL,[wuser] [varchar](100) NULL,[wdate] [datetime] NULL,
[typeisp] [int] NULL,[sredam] [varchar](100) NULL,[srmt] [money] NULL,[srmtime] [varchar](100) NULL,[srV] [varchar](100) NULL,
[srvt] [money] NULL,[srvtime] [varchar](100) NULL,[plotnost] [float] NULL,[unitcode] [int] NULL,[ispname] [varchar](200) NULL,
[t] [float] NULL,[massa] [money] NULL,[v] [money] NULL,[razmer] [money] NULL,regim int null)
--Таблица на вкладке "Старение/ОДС/Усадка"
declare @analizspec_t table (rn int,id int identity,[vcode] [int] NOT NULL,[pcode] [int] NULL,[wuser] [varchar](100) NULL,[wdate] [datetime] NULL,
[unitcode] [int] NULL,[typeisp] [int] NULL,[tdoposlestar] [varchar](100) NULL,[srt] [varchar](100) NULL,[srttime] [int] NULL,
[srtt] [varchar](100) NULL,[otnostdeffsrproc] [money] NULL,[otnostdeffsr] [varchar](100) NULL,[otnostdeffsrt] [money] NULL,
[ispname] [varchar](200) NULL,[ods] [money] NULL,[tposle] [varchar](100) NULL,[izmt] [int] NULL,[material] [varchar](100) NULL,
[proch] [varchar](100) NULL,[otnud] [varchar](100) NULL,[obrazec] [varchar](300) NULL,[usadka] [money] NULL,regim int null)
--Таблица на вкладке "Дополнительные показатели"
declare @analiz_pok table (rn int,id int identity,[vcode] [int] NOT NULL,[pcode] [int] NULL
	,[typeisp] [int] NULL,[nametypeisp] varchar (300),[regim] [int] NULL,[regimname] varchar (300) null
	,[ispcode] [int] NULL,[nameisp] [varchar](300) NULL,[rez] [varchar](300) NULL)

declare @tcc table (rn int,cc int,t int) --Таблица для подсчёта кол-ва записей в других таблицах
--блок записи во временные таблицы ---------------------------------------------------------------------------------------------------------------------------------
--Таблица на вкладке "Вискозиметр" --**** 1 ***--
insert into @analizspec 
      (rn,[vcode],[pcode],[wuser],[wdate],[material],[lot],[rotortype],[tc],[lm],[t5],[nparty],[nomer],[unitcode],[maxv]
		,[operator],[mf],[t3],[typeisp],[t35],[t18],[ispname])
select row_number() over (partition by pcode order by pcode,vcode)
		,[vcode],[pcode],[wuser],[wdate],[material],[lot],[rotortype],[tc],[lm],[t5],[nparty],[nomer],[unitcode],[maxv]
		,[operator],[mf],[t3],[typeisp],[t35],[t18],[ispname]
	from analizspec ac (nolock) 
	where ac.pcode in (select vcode from #doctable)

--select '#analizspec',* from #analizspec --***

--таблица на вкладке "Реология" --**** 2 ***--
insert into @analizspec_rk (rn,[vcode],[pcode],[wuser],[wdate],[dateisp],[npart],[material],[mi],[mh],[dm],[t50],[t90],[rv],[ts],[tr],[tgp]
,[ShkMt],[ShkVr],[cod],[nomer],[postavschik],[unitcode],[typeisp],[typeob])
select row_number() over (partition by pcode order by pcode,vcode)
		,[vcode],[pcode],[wuser],[wdate],[dateisp],[npart],[material],[mi],[mh],[dm],[t50],[t90],[rv],[ts],[tr],[tgp]
,[ShkMt],[ShkVr],[cod],[nomer],[postavschik],[unitcode],[typeisp],[typeob]
	from analizspec_rk rk (nolock) 
	where rk.pcode in (select vcode from #doctable)

--select '#analizspec_rk',* from #analizspec_rk --***

--Таблица на вкладке "Разрывная машина" --**** 3 ***--
insert into @analizspec_u (rn,[vcode],[pcode],[wuser],[wdate],[marka],[zapravka],[rezhim],[prochnost],[udlin],[tverdost],[unitcode]
,[procent],[pokazatel],[typeisp],[S],[ispname],[regim])
select row_number() over (partition by pcode order by pcode,vcode)
		,[vcode],[pcode],[wuser],[wdate],[marka],[zapravka],[rezhim],[prochnost],[udlin],[tverdost],[unitcode]
,[procent],[pokazatel],[typeisp],[S],[ispname],regim
	from analizspec_u au (nolock) 
	where au.pcode in (select vcode from #doctable)
	
--select '#analizspec_u',* from #analizspec_u --***

--Таблица на вкладке "Весы" --**** 4 ***--
insert into @analizspec_v (rn,[vcode],[pcode],[wuser],[wdate],[typeisp],[sredam],[srmt],[srmtime],[srV],[srvt],[srvtime]
,[plotnost],[unitcode],[ispname],[t],[massa],[v],[razmer],regim)
select row_number() over (partition by pcode order by pcode,vcode)
		,[vcode],[pcode],[wuser],[wdate],[typeisp],[sredam],[srmt],[srmtime],[srV],[srvt],[srvtime]
,[plotnost],[unitcode],[ispname],[t],[massa],[v],[razmer],regim
	from analizspec_v v (nolock) 
	where v.pcode in (select vcode from #doctable)

--select '#analizspec_v',* from #analizspec_v --***

--Таблица на вкладке "Старение/ОДС/Усадка" --**** 5 ***--
insert into @analizspec_t (rn,[vcode],[pcode],[wuser],[wdate],[unitcode],[typeisp],[tdoposlestar],[srt],[srttime],[srtt],[otnostdeffsrproc]
,[otnostdeffsr],[otnostdeffsrt],[ispname],[ods],[tposle],[izmt],[material],[proch],[otnud],[obrazec],[usadka],regim)
select row_number() over (partition by pcode order by pcode,vcode)
		,[vcode],[pcode],[wuser],[wdate],[unitcode],[typeisp],[tdoposlestar],[srt],[srttime],[srtt],[otnostdeffsrproc]
,[otnostdeffsr],[otnostdeffsrt],[ispname],[ods],[tposle],[izmt],[material],[proch],[otnud],[obrazec],[usadka],regim
	from analizspec_t at (nolock) 
	where at.pcode in (select vcode from #doctable)

--select '#analizspec_t',* from #analizspec_t --***

--Таблица на вкладке "Дополнительные показатели" --**** 6 ***--
insert into @analiz_pok (rn ,[vcode],[pcode]
	,[typeisp],[nametypeisp],[regim],[regimname],[ispcode],[nameisp],[rez])
select row_number() over (partition by pcode order by pcode,vcode) rn
		,[vcode],[pcode]
		,[typeisp],[nametypeisp],[regim],[regimname],[ispcode],[nameisp],[rez]
	from v_analiz_pok
	where pcode in (select vcode from #doctable)
------------------------------------------------------------------------------------------------------------------------
--Таблица скелет
declare @tab table (pcode int,regim int)
insert into @tab (pcode,regim)
	select distinct pcode,regim
		from 
		(
			select pcode,rn,0 as regim
				from @analizspec
			union all
			select pcode,rn,0 as regim
				from @analizspec_rk
			union all
			select pcode,rn,isnull (regim,0)
				from @analizspec_u
			union all
			select pcode,rn,isnull (regim,0)
				from @analizspec_v
			union all
			select pcode,rn,isnull (regim,0)
				from @analizspec_v
			union all
			select pcode,rn,isnull (regim,0)
				from @analizspec_t
			union all
			select pcode,rn,isnull (regim,0)
				from @analiz_pok
	) t

select t.*,'*t*'
		,ac.*,'*ac*'
		,rk.*,'*rk*'
		,u.*,'*u*'
		,v.*,'*v*'
		,tt.*,'*tt*'
		,ap.*,'*ap*'
	from 
		(select row_number() over (partition by pcode order by pcode,regim) r
		,* 
			from @tab 
			where pcode not in (select pcode from @tab where regim<>0)
				or regim<>0
		) t
		left join @analizspec ac 
			on t.pcode=ac.pcode
				and t.r=ac.rn
		left join @analizspec_rk rk
			on t.pcode=rk.pcode
				and t.r=rk.rn
		left join @analizspec_u u
			on t.pcode=u.pcode
				and t.r=u.rn
				and t.regim=u.regim
		left join @analizspec_v v
			on t.pcode=v.pcode
				and t.r=v.rn
				and t.regim=v.regim
		left join @analizspec_t tt
			on t.pcode=tt.pcode
				and t.r=tt.rn
				and t.regim=tt.regim
		left join @analiz_pok ap
			on t.pcode=ap.pcode
				and t.r=ap.rn
				and t.regim=ap.regim

29 сен 16, 07:39    [19721639]     Ответить | Цитировать Сообщить модератору
 Re: какой код быстрее?  [new]
aleks2
Guest
1. Понять, что он делает.
2. Сделать это же, но эффективнее (быстрее).
29 сен 16, 12:01    [19722835]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить