Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / сравнение запросов / 4 сообщений из 4, страница 1 из 1
24.07.2002, 17:32:33
    #32038573
AAron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сравнение запросов
всем привет. есть два запроса (суть одно и то же)
Код: plaintext
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.
select
	x,
	y,
	market_value = sum(market_value),
	par_amount_outstanding = sum(par_amount_outstanding),
	market_value_sum = sum(market_value),
	cnt = count(*)
from (
	select
	 x= case when _x>= 100000000  AND _x< 1500000000  then  1  else  9999  end,
	y= case when _y in ( 224 ) then  1  else  9999  end,
	*
	from (
		select
			_x = MarketData.par_amount_outstanding * VCC.SpotRate,
			_y = DescriptiveData.country_id,
			MarketData.market_value * VCC.SpotRate as market_value,
			MarketData.par_amount_outstanding * VCC.SpotRate as par_amount_outstanding
		from VIEW_INSTRUMENTS_LIGHT as DescriptiveData
			inner join VIEW_CROSS_CURRENCY as VCC on VCC.CX = DescriptiveData.currency_id and VCC.CY =  1  and VCC.Date = '20010930'
			inner join VIEW_BL_DAILY as MarketData on DescriptiveData.bond_id = MarketData.bond_id and MarketData.date='20010930'
			left join VIEW_BL_DAILY as BOM on DescriptiveData.bond_id = BOM.bond_id and BOM.date = '20010831'
			inner join BenchmarkMain on BenchmarkMain.ID =  1771 
		where DescriptiveData.country_id in ( 72 , 105 , 224 , 10 ) and DescriptiveData.SecurityType =  1 
	) as t1
) as t2
group by x,y with cube
order by x,y


и

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	select
		x = case when MarketData.par_amount_outstanding * VCC.SpotRate >=  100000000  AND MarketData.par_amount_outstanding * VCC.SpotRate < 1500000000  then  1  else  9999  end,
		y = case when DescriptiveData.country_id in ( 224 ) then  1  else  9999  end,
		market_value = sum(MarketData.market_value * VCC.SpotRate),
		par_amount_outstanding = sum(MarketData.par_amount_outstanding * VCC.SpotRate),
		market_value_sum = sum(MarketData.market_value * VCC.SpotRate),
		cnt = count(*)
	from VIEW_INSTRUMENTS_LIGHT as DescriptiveData
		inner join VIEW_CROSS_CURRENCY as VCC on VCC.CX = DescriptiveData.currency_id and VCC.CY =  1  and VCC.Date = '20010930'
		inner join VIEW_BL_DAILY as MarketData on DescriptiveData.bond_id = MarketData.bond_id and MarketData.date='20010930'
		left join VIEW_BL_DAILY as BOM on DescriptiveData.bond_id = BOM.bond_id and BOM.date = '20010831'
		inner join BenchmarkMain on BenchmarkMain.ID =  1771 
	where DescriptiveData.country_id in ( 72 , 105 , 224 , 10 ) and DescriptiveData.SecurityType =  1 
	group by
		case when MarketData.par_amount_outstanding * VCC.SpotRate >=  100000000  AND MarketData.par_amount_outstanding * VCC.SpotRate < 1500000000  then  1  else  9999  end,
		case when DescriptiveData.country_id in ( 224 ) then  1  else  9999  end
		with cube
	order by x,y


Должен сказать, что это лишь общая структура, т.к. запросы должны формироваться динамически. Эти два запроса оптимизатор преобразует к одному и тому же виду . Однако я не уверен, что в процессе работы так будет всегда.

Вот и хотелось услышать мнения на тему, что лучше и проще для сервера. Был бы рад, если бы кто-то сумел подтолкнуть меня к более преобразованию запросов в более простой вид.
Объемы данных примерно следующие
VIEW_INSTRUMENTS_LIGHT - ~20-40 тыс.строк
VIEW_BL_DAILY - ~5млн. строк
...
Рейтинг: 0 / 0
24.07.2002, 18:01:01
    #32038581
ТиБиБи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сравнение запросов
> Вот и хотелось услышать мнения на тему, что лучше и проще для сервера.

(для поддержания беседы)
Про сервер не знаю, но лично мне приятнее второй вариант.
...
Рейтинг: 0 / 0
24.07.2002, 18:23:53
    #32038584
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сравнение запросов
Если планы выполнения запросов одинаковы, то чего вы опасаетесь ?

У вас же все главное происходит в самом первом подзапросе. Остальные только используют его результаты.

P.S.
Я лично бы предпочел первый вариант, хотя бы из-за того, что выражения в CASE нужно изменять в одном месте, а не в 2-х.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select x, y, 
    market_value = sum(market_value), 
    par_amount_outstanding = sum(par_amount_outstanding),
    market_value_sum = sum(market_value_sum),
    cnt = count(*)
from
(select	
    x = case when MarketData.par_amount_outstanding * VCC.SpotRate >=  100000000  AND MarketData.par_amount_outstanding * VCC.SpotRate < 1500000000  then  1  else  9999  end,
    y = case when DescriptiveData.country_id in ( 224 ) then  1  else  9999  end,
    market_value = (MarketData.market_value * VCC.SpotRate),
    par_amount_outstanding = (MarketData.par_amount_outstanding * VCC.SpotRate),
    market_value_sum = (MarketData.market_value * VCC.SpotRate)
	from VIEW_INSTRUMENTS_LIGHT as DescriptiveData
		inner join VIEW_CROSS_CURRENCY as VCC on VCC.CX = DescriptiveData.currency_id and VCC.CY =  1  and VCC.Date = '20010930'
		inner join VIEW_BL_DAILY as MarketData on DescriptiveData.bond_id = MarketData.bond_id and MarketData.date='20010930'
		left join VIEW_BL_DAILY as BOM on DescriptiveData.bond_id = BOM.bond_id and BOM.date = '20010831'
		inner join BenchmarkMain on BenchmarkMain.ID =  1771 
	where DescriptiveData.country_id in ( 72 , 105 , 224 , 10 ) and DescriptiveData.SecurityType =  1 
) AS t1
group by x, y with cube
order by x,y
...
Рейтинг: 0 / 0
24.07.2002, 18:38:33
    #32038592
AAron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сравнение запросов
а нельзя ли как-то упростить GROUP BY конструкцию?
если бы там можно было написать GROUP BY x, y было бы все классно
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / сравнение запросов / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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