Почему запрос будет быстрее в SQL Server 2005 только потому, что он в представлении? - PullRequest
1 голос
/ 13 ноября 2009

У нас есть (большой) запрос SELECT, выполнение которого может занять ~ 30 секунд. Мне говорят, что при размещении в представлении запуск занимает менее 5 секунд.

Я предполагаю, что SQL Server кэширует планы запросов для запросов, которые не изменяются, так почему здесь значительное улучшение производительности?

Просто чтобы прояснить, на самом деле это всего лишь случай принятия чего-то вроде:

select * from table /* Lots of joins, where clauses */

и сделаем вид:

create view myfirstview as select * from table /* Lots of joins, most of the where clauses */
select * from myfirstview where /* The rest of the where clauses (i.e. the ones that can change) */

Ответы [ 4 ]

4 голосов
/ 13 ноября 2009

"Мне сказали" ..... ты проверял и проверял это сам?

Я был бы удивлен, честно говоря ... "обычный" вид - это просто сохраненный оператор SQL - без кэширования, ничего

Если они не говорят о индексированном представлении ("материализованное" представление), которое в конце концов является действительно поддерживаемой системой таблицей - данные хранятся на диске, как нормальный стол.

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

3 голосов
/ 13 ноября 2009

Нет, представление, которое не проиндексировано / не материализовано, развернуто как макрос.

Не существует особой магии "взгляда", несмотря на то, что вам сказали.

1 голос
/ 18 ноября 2009

Держу пари, что человек, который сказал вам это, сделал тест примерно так:

Во-первых, сколько времени занимает SELECT сам по себе Далее, сколько времени занимает ПРОСМОТР

Проблема в том, что SELECT заставляет SQL Server считывать данные с диска. Попав в память, запрос будет выполнен быстрее. Вы заметили бы подобное улучшение, если бы вы просто запустили SELECT дважды или изменили порядок двух запросов выше.

Для истинного сравнения яблок с яблоками перед каждым запросом выполните следующие команды:

CHECKPOINT
DBCC DROPCLEANBUFFERS
1 голос
/ 13 ноября 2009

Может быть, то, что вам сказали, это Индексированные просмотры . Материализованные представления это стандартный термин

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...