sql server:每个组包含最大行的索引视图

时间:2013-04-18 21:43:16

标签: sql sql-server sql-server-2008 greatest-n-per-group

我正在尝试创建一个索引视图,用于计算数据库中表的每个组的最大n。我已经为视图尝试了三种不同的查询,而且它们似乎都不被sql server所允许。该表只是一个文件列表,每个文件都有一个id,一个用户ID和一个日期,我正在尝试为每个用户找到最新的文件。

我尝试了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;

这两个查询都有效,但是在视图上创建索引失败了,因为它表示不允许使用group bys和outer连接。

我也试过

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)

这仅适用于任何给定用户标识最多有2行的情况。 See Here。如果我将其添加到查询的末尾

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

那么每个用户最多可以处理3个文件,但是你看到了问题。

是否有合理的方法为此类查询制作索引视图?

感谢。

编辑:另外,如果没有办法做索引视图,并且我把它留作基本上每次执行查询的无索引视图,对于大量行来说这会非常慢,并且可能是每个用户数百行?我计划在userid上创建一些非聚簇索引并提交

1 个答案:

答案 0 :(得分:2)

不,那不可能。如果是这样的话会很棒。我建议你在http://connect.microsoft.com上推荐你可以找到的所有索引视图门票(有些是我的)以获得该功能的优先权。

您的一些想法也因为不允许自联接这一事实而失败。列出 允许什么不是。

的确更快

充其量,您可以实现查询的一部分:

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

并在文件上添加一个有用的索引以加入回来。这可能会给你一个非常便宜的查询。