2

データベース内のテーブルのグループごとに最大の n を計算するインデックス付きビューを作成しようとしています。ビューに対して3つの異なるクエリを試しましたが、それらはすべてSQLサーバーで許可されていないようです。テーブルは単なるファイルのリストであり、それぞれに ID、ユーザー ID、および日付があり、各ユーザーの最新のファイルを見つけようとしています。

ここで2 つの提案を試しましたが、インデックス付きビューでグループ化または外部結合を行うことは許可されていないというエラーが表示されました。ご覧いただけるように、ここに私の実装をコピーします。

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 は単一のユーザー ID が持つファイルの最大数です。ここに基本的なクエリがあります

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)

これは、特定のユーザー ID に対して最大で 2 つの行がある場合にのみ機能します。ここを参照してください。これをクエリの最後に追加した場合

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

その後、ユーザーごとに最大 3 つのファイルが機能しますが、問題が発生します。

この種のクエリのインデックス付きビューを作成する合理的な方法はありますか?

ありがとう。

EDIT:さらに、インデックス付きビューを実行する方法がなく、基本的に毎回クエリを実行するインデックスなしビューのままにした場合、膨大な数の行に対して非常に遅くなり、おそらく数百の何かになりますユーザーごとの行?userid と filedate にいくつかの非クラスター化インデックスを作成することを計画していました

4

1 に答える 1

2

いいえ、それはできません。もしそうなら、それはとても素晴らしいことです。http://connect.microsoft.comで見つけることができるすべてのインデックス付きビュー チケット (一部は私のもの) に賛成票を投じて、その機能を優先することをお勧めします。

あなたのアイデアのいくつかは、自己結合も許可されていないという事実にも失敗しています。許可されているものをリストする方が、許可されていないものよりも高速です

せいぜい、クエリの一部を具体化できます。

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

また、ファイルに結合するための便利なインデックスをファイルに追加します。これにより、おそらく全体的に非常に安価なクエリが得られます。

于 2013-04-18T21:47:39.800 に答える