我試圖做一個索引視圖,計算我的數據庫中一個表的最大值。儘管我已經嘗試了三種不同的查詢查詢,但它們似乎都不被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上創建一些非聚集索引並提交
這樣做比僅僅將這些查詢中的一個作爲無索引視圖並正確索引原始表更好? – bdwain
是的,因爲沒有索引的視圖根本沒有幫助。查看查詢計劃並進行比較以確定影響。 – usr