Я создал два варианта запроса, используемого в представлении, которое возвращает требуемые результаты. Мне нужно переписать любой вариант, чтобы его можно было использовать в с индексированным представлением. Оба не работают при создании уникального кластерного индекса на вид. Первый из них выходит из строя из-за LEFT OUTER JOIN, а второй не получается из-за подзапроса. Я считаю, что оба будут терпеть неудачу из-за .Невозможно создать CLUSTERED INDEX в представлении из-за LEFT JOIN или подзапроса
После нахождения Creating Indexed Views существует большой список синтаксических элементов TSQL, которые нельзя использовать. Среди них: производной таблицы, UNION, КРОМЕ, ПЕРЕСЕЧЕНИЕ, подзапросы, Outer или самостоятельно включается, TOP, ORDER BY, DISTINCT, MAX ...
запрос должен получить самый крупный CompanyID
для каждого уникального Company
. Также необходимо отобразить таблицу StatusName
в таблице Statuses
, и я добавляю только это, если это влияет на решение . В настоящее время это INNER JOIN
, поэтому это не создает проблемы с созданием индекса.
Пример для Companies
таблицы, со всеми 3 колонки быть INT
:
CompanyID Company Revision
1 1 1
2 1 2
3 2 1
4 2 2
Запрос должен возвращать:
CompanyID Company Revision
2 1 2
4 2 2
Вот два варианта я создал:
SELECT t1.CompanyID, t1.Company, t1.Revision, Statuses.StatusName
FROM dbo.Companies AS t1
LEFT OUTER JOIN dbo.Companies AS t2
ON t1.Company = t2.Company AND t1.CompanyID < t2.CompanyID
INNER JOIN dbo.Statuses
ON dbo.Statuses.StatusID = t1.StatusID
WHERE t2.Company IS NULL
И прочие:
SELECT t1.CompanyID, t1.Company, t1.Revision, Statuses.StatusName
FROM dbo.Companies AS t1
INNER JOIN dbo.Statuses
ON dbo.Statuses.StatusID = t1.StatusID
WHERE t1.Company NOT IN (SELECT t2.Company from dbo.Companies AS t2 WHERE t1.CompanyID < t2.CompanyID)
Итак, на мой вопрос, можно ли переписывать запрос, чтобы он использовался в индексированном виде?
Я использую MS SQL Server 2008 R2 и 2005.
Почему вы считаете, что единственное решение любой проблемы, с которой вы столкнулись (но вы не указали), - это индексированный вид? Не могли бы вы указать свою фактическую проблему, а не сообщать нам, почему вы не можете использовать индексированное представление для ее решения? –
Извините, позвольте мне уточнить. У нас ограниченная аппаратная производительность и мы стремимся повысить производительность запросов с минимальными изменениями в схеме базы данных. Неиндексированные представления уже существуют. В базовых таблицах будет 100 000 записей (в этом примере - компании), но обычно менее 100 будут возвращены из любого представления. Похоже, что индексированные представления были бы хорошим кандидатом для решения, если бы довольно простые запросы могли быть переписаны. – njb
Если вы нашли один способ построения набора результатов, и он находится в списке «запрещенных», вполне вероятно, что любой другой способ построения одного и того же набора результатов также потерпит неудачу. Список ограничений для индексированных представлений не был выбран случайным образом - они связаны с тем, как индексирование выполняется за кулисами. –