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

Откуда:
Сообщений: 1090
Необходимо выбрать данные из 3х документов за определенный интервал дат. Даты документов лежат в журнале
как лучше
+

select SUM(f1) f1
		,SUM(f2) f2
		,SUM(f3) f3
		,SUM(f4) f4
		,SUM(f5) f5
		,SUM(f6) f6
		,SUM(f7) f7
		,SUM(f8) f8
		,po
		
from 	
(
	select 
		sp86 po
		,case when sp85 in('     5   ','    11   ','    12   ') then sp84 end f1
		,case when sp85 in('     5   ','    11   ','    12   ') then sp472 end f2
		,case when sp85= '     6   ' then sp84 end f3
		,case when sp85='     6   ' then sp472 end f4
		,null f5
		,null f6
		,null f7
		,null f8
		
	from dh72 wei
	 inner join _1sjourn j (nolock)  
	on wei.iddoc=j.iddoc 
			and date_time_iddoc>=@from1
			and date_time_iddoc<=@periodto
			and j.ISMARK=0
	union all
	select 
		sp310
		,null,null,null,null
		,sp341
		,sp342
		,null
		,null
	
	from dh280 inv
	 inner join _1sjourn j (nolock)  
	on inv.iddoc=j.iddoc 
			and date_time_iddoc>=@from1
			and date_time_iddoc<=@periodto
			and j.ISMARK=0
	where sp634='     I   ' 
	union all
	select	sp243
		,null,null,null,null,null,null
		,sp239-sp240
		,sp246
		
	from DH237 cut
	 inner join _1sjourn j (nolock)  
	on cut.iddoc=j.iddoc 
			and date_time_iddoc>=@from1
			and date_time_iddoc<=@periodto
			and j.ISMARK=0
	where SP857='    15   '
	) FC

group by po
order by po


или так
+

select SUM(f1) f1
		,SUM(f2) f2
		,SUM(f3) f3
		,SUM(f4) f4
		,SUM(f5) f5
		,SUM(f6) f6
		,SUM(f7) f7
		,SUM(f8) f8
		,po
		
from 	
(
	select 
		sp86 po
		,case when sp85 in('     5   ','    11   ','    12   ') then sp84 end f1
		,case when sp85 in('     5   ','    11   ','    12   ') then sp472 end f2
		,case when sp85= '     6   ' then sp84 end f3
		,case when sp85='     6   ' then sp472 end f4
		,null f5
		,null f6
		,null f7
		,null f8
		,iddoc id
	from dh72 wei
	
	union all
	select 
		sp310
		,null,null,null,null
		,sp341
		,sp342
		,null
		,null
		,iddoc
	from dh280 inv
	
	where sp634='     I   ' 
	union all
	select	sp243
		,null,null,null,null,null,null
		,sp239-sp240
		,sp246
		,IDDOC
	from DH237 cut
	
	where SP857='    15   '
	) FC
 inner join _1sjourn j (nolock)  
on FC.id=j.iddoc 
			and date_time_iddoc>=@from1
			and date_time_iddoc<=@periodto
			and j.ISMARK=0
group by po
order by po


одним словом джойнить журнал в каждом union, или сначала union, а затем join
15 апр 14, 12:50    [15884452]     Ответить | Цитировать Сообщить модератору
 Re: Какой запрос "правильнее"?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
смотрите планы запросов
15 апр 14, 12:54    [15884478]     Ответить | Цитировать Сообщить модератору
 Re: Какой запрос "правильнее"?  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1090
Дедушка,
первый

К сообщению приложен файл (11.sqlplan - 144Kb) cкачать
15 апр 14, 13:10    [15884586]     Ответить | Цитировать Сообщить модератору
 Re: Какой запрос "правильнее"?  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1090
waszkiewicz,
второй

К сообщению приложен файл (22.sqlplan - 92Kb) cкачать
15 апр 14, 13:10    [15884590]     Ответить | Цитировать Сообщить модератору
 Re: Какой запрос "правильнее"?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
waszkiewicz,

22 лучше

если индексы добавить, то будет ваще красота

1ска?)))
15 апр 14, 15:00    [15885400]     Ответить | Цитировать Сообщить модератору
 Re: Какой запрос "правильнее"?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
waszkiewicz,

если для первого выключить параллелизм, то он отработает лучше чем отработал сейчас
но 2й все равно лучше
15 апр 14, 15:02    [15885414]     Ответить | Цитировать Сообщить модератору
 Re: Какой запрос "правильнее"?  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1090
TJ001
waszkiewicz,

22 лучше

если индексы добавить, то будет ваще красота

1ска?)))

она. посему индексы не особо добавишь
15 апр 14, 15:07    [15885442]     Ответить | Цитировать Сообщить модератору
 Re: Какой запрос "правильнее"?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
waszkiewicz,

при определенных хитростях можно
но все зависит от того, насколько она реализована на прямых запросах
а так: все легко
1. создаются индексы со специальными префиксами, чтобы можно было их отличить от автоматических
2. в хранимку, которую 1с использует для проверки структуры таблиц, вносится заглушка, которая смотрит, кто её вызывает. если вызывает 1с, то прячет индексы с тем самым префиксом и 1с не видит "лишних" индексов и нре ругается
3. при реструктуризации проиндексированных таблиц не забывать пересоздавать индексы

вот и вся история
15 апр 14, 15:14    [15885494]     Ответить | Цитировать Сообщить модератору
 Re: Какой запрос "правильнее"?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Вы спрашиваете, что быстрее посчитается - (a+b+c)*d или a*d+b*d+c*d
Однозначного ответа нет, имхо.
В зависимости от объемов a, b, c и d будут выгодны разные подходы
15 апр 14, 15:45    [15885756]     Ответить | Цитировать Сообщить модератору
 Re: Какой запрос "правильнее"?  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1090
Glory,
объем d - максимальный, ибо в нем хранятся ссылки на все заголовки всех документов
15 апр 14, 16:14    [15885976]     Ответить | Цитировать Сообщить модератору
 Re: Какой запрос "правильнее"?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Наилучший эффект заключается в общем наименьшем количестве проходов по таблицам.
Оптимизатор хитрит, конечно , пытается строить планы вида "средней температуры по больнице", но, в целом, вышесказанное справедливо.

Выгоднее пройти один раз по маленькой таблице и пять раз по большой, чем один раз по большой и миллион по маленькой.
15 апр 14, 16:52    [15886257]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить