1

フォルダーとそのコンテンツでインデックス サービスを使用する ASP.net 2.0 イントラネット サイトがあります。OLEDB は、ここで説明したのと同じ手法を使用して、このフォルダー内のファイルを照会するために使用されます。これは別の開発者によって書かれたものですが、私は彼の作業方法を理解し始めています。

しかし、フォルダー内のすべてのファイルが一度に照会されるため、クライアントはページの読み込み時間が長いと不満を漏らしています。彼らはそれが遅いという事実について正しいので、ページングの使用を検討しました(linq Skip().Take()のように)。SQL では、これは次のように変換されることを知っています。

SELECT col1, col2 
FROM 
(
   SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum
   FROM MyTable
)
AS MyDerivedTable
WHERE MyDerivedTable.RowNum BETWEEN @startRow AND @endRow

しかし、何らかの理由で、これは OLEDB で使用すると機能しません。これはどのバージョンの SQL を使用していますか、またはページングの実装方法について提案を受けましたか?

編集: 上記の方法は sql Server 2005 以降を使用している場合にのみ使用できるため、2005 年より前の方法を試してみます。OLEDB は Row_Number() または Over をサポートしていないと思います。試してみる:

SELECT ... FROM Table WHERE PK IN 
  (SELECT TOP @PageSize PK FROM Table WHERE PK NOT IN
    (SELECT TOP @StartRow PK FROM Table ORDER BY SortColumn)
   ORDER BY SortColumn)
ORDER BY SortColumn
4

1 に答える 1

2

MSIDXS は多くの SQL 関数をサポートしていないようです。「選択」、「場所」、「並べ替え」などの基本のみが機能します。"Top"、"Rowcount"、"Over" などの他の機能は機能しません。「Count(*)」でも失敗します。

2 つの整数を持つ DataAdapter.Fill() メソッドを使用してページングを実装しました。startrecord と maxrecord。これは理想的ではありませんが、この場合の解決策としては最適です。これですべてのレコードが収集されますが、必要なものだけがデータセットに保存され、それが自分のクラスのコレクションに変換されます。

最初の行のみがループされて返されるため、これは最初のページで高速に機能します。ただし、20 ページある場合、最後のページはそれより前のすべてのレコードがループされるため、時間がかかります。

これを、ページ サイズ 20 と 400 の結果でテストしました。最初のページには 200 ミリ秒かかり、最後のページには約 1.6 秒かかりました。顕著な遅延ですが、最初の 10 ページではなく、最後のページでのみ発生します。検索と並べ替えのメカニズムがあるため、最後のページにはあまりアクセスしません。

于 2012-08-30T09:21:23.140 に答える