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

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Есть вьюха с юнионами, при селекте из неё хотелось-бы что-б сервер лопатил только те таблицы которые нужны.
Попробовал вот такой скрипт:
USE TEMPDB
GO
CREATE TABLE tbl_Type1(C1 int, C2 char(1), F1 char(10), Tp char(1) default('1') CHECK(Tp = 1));
GO
CREATE TABLE tbl_Type2(C1 int, C2 char(1), F2 char(10), Tp char(1) default('2') CHECK(Tp = 2));
GO
CREATE TABLE tbl_Type3(C1 int, C2 char(1), F3 char(10), Tp char(1) default('3')  CHECK(Tp = 3));
GO
INSERT INTO tbl_Type1(C1,C2,F1) 
SELECT message_Id + 1000000, Left(text,1), RIGHT(Left(text,10),10) FROM sys.messages;
GO
INSERT INTO tbl_Type2(C1,C2,F2) 
SELECT message_Id + 2000000, Left(text,1), RIGHT(Left(text,20),10) FROM sys.messages;
GO
INSERT INTO tbl_Type3(C1,C2,F3) 
SELECT message_Id + 3000000, Left(text,1), RIGHT(Left(text,30),10) FROM sys.messages;
GO
CREATE VIEW vw_Unionized_View as
SELECT C1, C2, F1, null as F2, null as F3, Tp FROM tbl_Type1
WHERE Tp = 1
UNION ALL
SELECT C1, C2, null as F1, F2, null as F3, Tp FROM tbl_Type2
WHERE Tp = 2
UNION ALL
SELECT C1, C2, null as F1, null as F2, F3, Tp FROM tbl_Type3 
WHERE Tp = 3
GO
SET STATISTICS IO ON
GO
SELECT * FROM vw_Unionized_View
WHERE Tp in ('1','3') and C2 = 'B'
ORDER BY C1
/*
DROP VIEW vw_Unionized_View
GO
DROP TABLE tbl_Type1;
GO
DROP TABLE tbl_Type2;
GO
DROP TABLE tbl_Type3;
GO
*/

автор
/*------------------------
SELECT * FROM vw_Unionized_View
WHERE Tp in ('1','3') and C2 = 'B'
ORDER BY C1
------------------------*/

(826 row(s) affected)
Table 'tbl_Type3'. Scan count 1, logical reads 305, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'tbl_Type2'. Scan count 1, logical reads 305, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'tbl_Type1'. Scan count 1, logical reads 305, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)


Я ожидал что сервер должен проигнорировать 'tbl_Type2', а он всё равно её читает.
Индексы убыстряют выборку, но вторую таблицу всё равно лопатит.

Как исключить чтение из таблицы №2?

Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)

К сообщению приложен файл. Размер - 9Kb
13 дек 12, 23:37    [13629305]     Ответить | Цитировать Сообщить модератору
 Re: Как исключить селект таблицы во вьюхе?  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
Не нужно вольно обращаться с типами данных
CREATE TABLE tbl_Type1(C1 int, C2 char(1), F1 char(10), Tp char(1) default('1') CHECK(Tp = '1'));
GO
CREATE TABLE tbl_Type2(C1 int, C2 char(1), F2 char(10), Tp char(1) default('2') CHECK(Tp = '2'));
GO
CREATE TABLE tbl_Type3(C1 int, C2 char(1), F3 char(10), Tp char(1) default('3')  CHECK(Tp = '3'));
GO
14 дек 12, 00:05    [13629378]     Ответить | Цитировать Сообщить модератору
 Re: Как исключить селект таблицы во вьюхе?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
invm
Не нужно вольно обращаться с типами данных

Вы считаете что проблема в этом?
14 дек 12, 00:07    [13629383]     Ответить | Цитировать Сообщить модератору
 Re: Как исключить селект таблицы во вьюхе?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Спасибо. Действительно такой тривиал, а я-то голову сломал.
14 дек 12, 00:10    [13629393]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить