2013-04-18 61 views
2

我試圖做一個索引視圖,計算我的數據庫中一個表的最大值。儘管我已經嘗試了三種不同的查詢查詢,但它們似乎都不被sql server允許。該表只是一個文件列表,每個文件都有一個ID,一個用戶標識和一個日期,並且我試圖爲每個用戶查找最新的文件。sql服務器:索引視圖包含每組最大的行

我嘗試了2條建議here,但他們給了我錯誤,說我不允許在索引視圖中進行分組或外連接。我將在這裏複製我的實現,以便您可以看到。

select f1.id, f1.userid, f1.filedate 
from files f1 
inner join(
    select userid, max(filedate) as maxDate 
    from files 
    group by userid 
) as f2 
on f1.userid = f2.userid and f1.maxdate = f2.maxdate 

select f1.id, f1.userid, f1.filedate 
from files f1 
left outer join files f2 
on (f1.userid = f2.userid and f1.filedate < f2.filedate) 
where f2.id is null; 

這兩項查詢的工作,但在創建視圖上的索引失敗,因爲它說,分組依據和外部連接是不允許的。

我也試過

SELECT f1.id, f1.userid, f1.filedate FROM [dbo].[DiagnosticFiles] as f1 
WHERE NOT EXISTS (
    SELECT f1.id FROM [dbo].[DiagnosticFiles] as f2 INNER JOIN [dbo].[DiagnosticFiles] as f3 ON f2.userid = f3.userid 
WHERE f1.id = f2.id AND f2.FileDate < f3.FileDate) 

,它說,當我試圖把它添加到索引

我對如何只用內部連接做到這一點的想法子查詢不允許,但問題似乎是需要n-1個連接,其中n是單個用戶標識具有的最大文件數。這裏是基本查詢

SELECT DISTINCT f1.id, f1.userid, f1.filedate 
FROM FILES f1 
INNER JOIN files f2 
ON (f1.userid = f2.userid and f1.filedate > f2.filedate) 

這隻適用於任何給定userid最多2行的情況。 See Here。如果我將此添加到查詢的末尾

INNER JOIN files f3 
ON (f2.userid = f3.userid and f2.filedate > f3.filedate) 

那麼它將最多爲每個用戶3個文件,但您會看到問題。

是否有一種合理的方式爲這種查詢創建索引視圖?

謝謝。

編輯:另外,如果沒有辦法做索引視圖,並且我將它作爲一個基本上每次都執行查詢的無索引視圖,那對於大量的行來說會非常緩慢,並且可能是某種在每個用戶數百行?我正計劃在用戶ID上創建一些非聚集索引並提交

回答

2

不,那是不可能的。如果是這樣,那將是非常棒的。我建議你upvote http://connect.microsoft.com所有索引視圖門票,你可以找到(有些是我的),以獲得該功能的一些優先事項。

你的一些想法也失敗了,因爲不允許自聯接。列出哪些允許哪些不是允許的更快。

在最好的情況,你可以兌現您的查詢的一部分:

select userid, max(filedate) as maxDate 
    from files 
    group by userid 

而且在文件添加有用的索引加盟回去吧。這可能會給你一個非常便宜的查詢整體。

+0

這樣做比僅僅將這些查詢中的一個作爲無索引視圖並正確索引原始表更好? – bdwain

+0

是的,因爲沒有索引的視圖根本沒有幫助。查看查詢計劃並進行比較以確定影響。 – usr