Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 scan direction + union all  [new]
любитель вьюшек
Guest
Коллеги, добрый вечер.
в спойлере код
+
set nocount on
use tempdb
go

if object_id('tempdb..t1') is not null
 drop table t1;
if object_id('tempdb..t2') is not null
 drop table t2;
if object_id('tempdb..t3') is not null
 drop table t3;
if object_id('tempdb..v_test', 'V') is not null
 drop view v_test;
 
create table t1 
( id	int identity(1,1) primary key clustered
, id2	int not null
, _uid	uniqueidentifier not null default(newid())
);
create table t2 
( id	int identity(1,1) primary key clustered
, id2	int not null
, _uid	uniqueidentifier not null default(newid())
);
create table t3
( id	int identity(1,1) primary key clustered
, id2	int not null
, _uid	uniqueidentifier not null default(newid())
);
go

insert into t1(id2)
select top (10000)
 dense_rank() over(order by ao.[object_id]) 
from master.sys.all_columns ao
cross join (select 1 as nn union all select 2 as nn) as mltpl
go
dbcc checkident ('t2', reseed, 10000)
insert into t2(id2)
select top (10000)
 dense_rank() over(order by ao.[object_id]) 
from master.sys.all_columns ao
cross join (select 1 as nn union all select 2 as nn) as mltpl
go
dbcc checkident ('t3', reseed, 20000)
insert into t3(id2)
select top (10000)
 dense_rank() over(order by ao.[object_id]) 
from master.sys.all_columns ao
cross join (select 1 as nn union all select 2 as nn) as mltpl
go

create index idx_test on t1(id2)
create index idx_test on t2(id2)
create index idx_test on t3(id2)
go

create view dbo.v_test
as
select id, id2, _uid from t1 union all
select id, id2, _uid from t2 union all
select id, id2, _uid from t3
go
select count(*) from dbo.t1 t

--set statistics profile on
select top 1 * from dbo.v_test order by id2 desc
go
select top 1 * from dbo.v_test order by id2 /*desc*/
go
--set statistics profile off

select top 1 * from
(
	select id, id2, _uid from t1 union all
	select id, id2, _uid from t2 union all
	select id, id2, _uid from t3
) as sub
order by id2 desc

Очень хочется получить Ordered = true + Scan direction backward для запроса с условием order by id2 desc
Может кто подскажет?
12 апр 12, 17:38    [12407660]     Ответить | Цитировать Сообщить модератору
 Re: scan direction + union all  [new]
любитель вьюшек
Guest
Подниму.

Одинаково работает на
Microsoft SQL Server 2005 - 9.00.4060.00 (X64) Mar 17 2011 13:06:52 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.0 (Build 6001: Service Pack 1)
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) Apr 22 2011 19:23:43 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.0 <X64> (Build 6001: Service Pack 1)
Microsoft SQL Server 2012 - 11.0.2100.60 (X64) Feb 10 2012 19:39:15 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Вопрос :
есть ли возможность для запроса
select top 1 * from dbo.v_test order by id2 desc
получить Ordered = true + Scan direction backward?
13 апр 12, 10:00    [12410003]     Ответить | Цитировать Сообщить модератору
 Re: scan direction + union all  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Можно, но я не уверен, что вам понравится, как.

create index IX__t1 on t1 ( id2 desc )
create index IX__t2 on t2 ( id2 desc )
create index IX__t3 on t3 ( id2 desc )
15 апр 12, 11:55    [12418591]     Ответить | Цитировать Сообщить модератору
 Re: scan direction + union all  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Будет Ordered = true + Scan direction forward + bookmark, но лучше, чем было до.
15 апр 12, 11:56    [12418593]     Ответить | Цитировать Сообщить модератору
 Re: scan direction + union all  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Или так, уже без view:

select top 1 * from
(
	select top 1 id, id2, _uid from t1 order by id2 desc union all
	select top 1 id, id2, _uid from t2 order by id2 desc union all
	select top 1 id, id2, _uid from t3 order by id2 desc 
) as sub
order by id2 desc
15 апр 12, 11:59    [12418595]     Ответить | Цитировать Сообщить модератору
 Re: scan direction + union all  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Гавриленко Сергей Алексеевич
Или так, уже без view:

select top 1 * from
(
	select top 1 id, id2, _uid from t1 order by id2 desc union all
	select top 1 id, id2, _uid from t2 order by id2 desc union all
	select top 1 id, id2, _uid from t3 order by id2 desc 
) as sub
order by id2 desc
Не, так нельзя. ORDER BY в каждом SELECTе UNIONа быть не может.
15 апр 12, 12:04    [12418601]     Ответить | Цитировать Сообщить модератору
 Re: scan direction + union all  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
iap
Не, так нельзя. ORDER BY в каждом SELECTе UNIONа быть не может.

Чо это? :)

К сообщению приложен файл. Размер - 8Kb
15 апр 12, 12:08    [12418606]     Ответить | Цитировать Сообщить модератору
 Re: scan direction + union all  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Кстати, у view и запроса с кучей top 1 результаты разные, но исключительно потому, что во всех трех таблицах одинаковый максимальный id2, но остальные значения полей разные.

Сообщение было отредактировано: 15 апр 12, 12:09
15 апр 12, 12:09    [12418608]     Ответить | Цитировать Сообщить модератору
 Re: scan direction + union all  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Гавриленко Сергей Алексеевич
iap
Не, так нельзя. ORDER BY в каждом SELECTе UNIONа быть не может.

Чо это? :)
Надо же! Как я заблуждался!
15 апр 12, 12:31    [12418639]     Ответить | Цитировать Сообщить модератору
 Re: scan direction + union all  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
iap
Надо же! Как я заблуждался!
Я тоже думал, что нельзя, но раз предоставился случай, решил попробовать. А оно и работает.
15 апр 12, 12:39    [12418651]     Ответить | Цитировать Сообщить модератору
 Re: scan direction + union all  [new]
любитель вьюшек
Guest
Гавриленко Сергей Алексеевич, iap
Коллеги, большое спасибо.
Проблема в следующем.
В рабочей системе была таблица, сейчас есть идея заменить эту таблицу на вьюшку, аналогичную описанной в первом посте.
Для того, чтобы решение было прозрачным для кода, переписывание запросов, обращающихся к вьюшке нежелательно, ввиду большого объема кода и риска что-то упустить.
Соответственно предложения Сергея Алексеевича с другим запросом не подходят.
По поводу индекса - да, это и рассматривается сейчас как крайнее решение, но я надеялся, что может кто предложит какое-нибудь другое.
Так или иначе, большое спасибо за участие. Если у кого будут ещё соображения - буду признателен.
17 апр 12, 23:32    [12430411]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить