SqlServer View всегда актуален? - PullRequest
2 голосов
/ 04 декабря 2009

Будет ли представление sqlserver всегда актуальным или с задержкой?

Ответы [ 6 ]

10 голосов
/ 04 декабря 2009

Это зависит от уровня изоляции транзакции , на котором выполняется представление. По умолчанию представления выполняются на READ COMMITTED. Представление вернет только зафиксированные данные. Пока ваше представление состоит только из одного оператора SQL и не вызывает пользовательских функций или расширенных процедур, оно будет согласованным.

Но представления также могут работать на более рискованном уровне изоляции. Например, это представление задает nolock, поэтому оно работает на READ UNCOMMITTED:

create view dbo.MyView
as select * from dbo.MyTable with (nolock)

Это представление может возвращать значения, являющиеся частью транзакции, которая будет откатываться (грязное чтение). Этот уровень изоляции транзакции обменивает согласованность на производительность.

4 голосов
/ 04 декабря 2009

неиндексированное представление по своей сути не может хранить устаревшие данные, оно эфирное и любой запрос к нему действительно попадает в базовую таблицу.

Индексированное представление сохраняет свою собственную копию, но в планах запросов вы увидите, что любая вставка / обновление / удаление также включает в себя соответствующие изменения в представлении, поэтому данные остаются согласованными.

2 голосов
/ 04 декабря 2009

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

1 голос
/ 03 января 2013

представление предоставляет актуальную информацию. но в некоторых сценариях произойдет сбой, т. е. когда в нашу таблицу будут вставлены массовые данные, они не обновят данные базовой таблицы для просмотра.

чтобы преодолеть вышеуказанную проблему, вам нужно использовать sp_refreshview 'ur view name'

0 голосов
/ 30 августа 2011

Я обнаружил, что представления действительно могут возвращать ошибочные данные при извлечении данных из другой базы данных. Например, в моей настройке у меня есть представление, которое делает простой выбор из таблицы на другой базе данных:

SELECT status FROM otherdb.dbo.mytable_t

и это возвращает:

NULL
ПРИНЯТ
AWAITRTR
IMPORTOK
IMPORTPB
INPROGRE
REJECTED

Однако выполнение состояния SELECT FROM mytable_t для otherdb возвращает:

ACTIVE
AFS
CHANGE
ПРОЕКТ
PENDCONF
PENDINIT
ОБЗОР
TERM

Единственный способ убедиться, что представление возвращает те же данные, что и SELECT в этом сценарии, - удалить и заново создать представление.

Я видел это довольно много раз на SQL Server 2000, 2005 и 2008.

0 голосов
/ 06 декабря 2009

Типичное представление (не проиндексированное / не материализованное) - это просто псевдоним для SELECT. Это не может быть устаревшим больше, чем может быть SELECT.

...