Дизайн представления SQL Server - PullRequest
1 голос
/ 25 октября 2011

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

TABLE document (
Id int PRIMARY KEY,
    /*more metadata columns*/
)

TABLE name (
    Id int PRIMARY KEY,
    documentId int FOREIGN KEY REFERENCES document.Id,
    date DATETIME,
    text varchar(MAX)
)

TABLE description (
    Id int PRIMARY KEY,
    documentId int FOREIGN KEY REFERENCES document.Id,
    date DATETIME,
    text varchar(MAX)
)

Таким образом, идея состоит в том, что таблица 'document' содержит основную информацию о документе и Id, который связывает остальные таблицы с документом. Все остальные таблицы предназначены для отдельных атрибутов документа, которые можно обновлять. Каждое обновление получает свою строку с отметкой времени. Я хочу, чтобы представление получало по одной строке на документ с самыми последними версиями каждого атрибута, содержащимися в других таблицах (если это требует дальнейшей проработки или примера, пожалуйста, дайте мне знать, и я предоставлю). Каков наименее запутанный способ, которым я могу осуществить это? Использование SQL Server 2008.

Ответы [ 3 ]

4 голосов
/ 25 октября 2011

Вид не увеличит эффективность.Представление - это просто макрос, который расширяется.

В представлении нет никакой магии: но вы можете пострадать, если вы присоединитесь к этому представлению, потому что расширенные запросы могут стать массивными.

Вы можете индексировать представление, но это лучше всего работает с Enterprise Edition.если вы не хотите использовать подсказку NOEXPAND во всем.

Тем не менее, запрос довольно прост: если вы не хотите индексировать представление, когда у вас есть ограничения.

Один подход - это использование CTEпо подходу Стюарта Эйнсворта.Другой подход - «Максимум на группу», который я описал здесь на dba.se .Ни один из них не является безопасным для индексированных представлений.

2 голосов
/ 25 октября 2011

Вы можете использовать CTE для каждого атрибута в представлении, чтобы вернуть последние значения атрибута для documentmentid, например, так:

; WITH cName AS
(SELECT *
 FROM (SELECT ID, documentID, 
       date, text, 
       ranking = ROW_NUMBER () OVER (PARTITION BY documentID ORDER BY date DESC)
      FROM name) x
WHERE ranking = 1),
.... [more CTE's here]
SELECT columnlist
FROM document d JOIN cName cn ON d.id=cn.documentid
0 голосов
/ 25 октября 2011

Sql server 2008 поддерживает вычисляемый столбец в индексе. Таким образом, вы можете установить столбец - "is_latest" в 1 для строки с самым поздним временем для этого document_id. Теперь при запросе вы можете использовать столбец is_latest, и это будет намного быстрее. См. - http://msdn.microsoft.com/en-us/library/ms189292.aspx

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