Вопросы о видах - PullRequest
       29

Вопросы о видах

0 голосов
/ 22 декабря 2010

Я поддерживаю SQL Server с 2000 по 2008R2 (все Standard Edition).

Вопрос 1

Пожалуйста, рассмотрите следующую гипотетическую ситуацию.Допустим, у вас есть 5 табличных представлений с внутренним соединением таблиц.Предположим также, что я извлекаю 10 полей из каждой таблицы, поэтому у меня есть представление с 50 полями в нем.Если бы я выбрал только 2 поля в представлении (по одному в каждой из двух таблиц), будет ли этот запрос медленнее, чем сценарий эквивалентного объединения таблиц, при условии, что у вас все одинаковые таблицы и объединения?

Вопрос 2

Что, если я создал общее представление с помощью сценария, подобного следующему:

Create View SomeView
AS

select * from SomeTable
Go

Эти таблицы имеют поля, добавленные к ним довольнорегулярно.Каждый раз, когда я добавляю поле в «SomeTable», представление будет работать автоматически, правильно?Это заметно медленнее, если у SomeTable было 50 полей, и я выбрал два из них из общего вида?Если я выберу два поля в представлении Select *, будет ли он запрашивать только эти поля?

Вопрос 3 Если я создам вид, подобный следующему

Create View Blah
AS
select (some fields) 
from TableA join TableB on TableA.Blah = TableB.Blah
Go 

Затем я использую вид, подобный следующему:

Select (some fields) from dbo.Blah where SomeDate >= '1/1/2008' 

Потеряю ли я какую-либо производительность?Будет ли оптимизатор на самом деле извлекать только те записи просмотра, которые применяются, или он будет извлекать все, а затем подбирать набор результатов?

TIA.

1 Ответ

2 голосов
/ 22 декабря 2010

Каждый раз, когда я добавляю поле в «SomeTable», представление будет работать автоматически, правильно?

Нет, см. Здесь как убедиться,что представление будет иметь базовые изменения таблицы с помощью sp_refreshview

Будет ли оптимизатор фактически извлекать только те записи представления, которые применяются, или он будет извлекать все, а затем перебирать набор результатов?

Представление - это не что иное, как хранимый запрос, оптимизатор достаточно умен, чтобы выполнять поиск по диапазону или сканировать только те данные, которые ему необходимы, вы можете убедиться в этом, посмотрев план выполнения

, поэтому у меня есть вид с 50 полями.Если бы я выбрал только 2 поля в представлении (по одному в каждой из двух таблиц), будет ли этот запрос медленнее, чем сценарий эквивалентного объединения таблиц, при условии, что у вас все одинаковые таблицы и объединения?

снова запустите статистику io или time для запроса с * и всего 2 столбцами и посмотрите, видите ли вы разницу в чтениях и времени

, например,

SET STATISTICS IO ON
GO

SELECT * FROM SomeView

SET STATISTICS IO OFF
GO



SET STATISTICS IO ON
GO

SELECT Col1, Col2 FROM SomeView

SET STATISTICS IO OFF
GO
...