2

コードでlinq to sqlを使用してSQL Server 2005を使用しています。

次のシナリオで TOP 300 を使用すると、速度が低下することに気付きました (100 レコードで 4 秒のリターンに対して 3 分)。

SELECT TOP (300) {fields HERE} FROM {database} WHERE {where clauses with a nested select} ORDER BY {order by values}

.Skip(0).Take(300).ToList<>() が呼び出されているため、これは linq によって作成されています。

.Skip(300).Take(300).ToList<>() が呼び出されると、linq はそれを TOP ではなく ROW_NUMBER に変換し、問題は解消されます。

TOPを使用しないlinqの回避策はありますか?

TOPの問題についていくつかのブログを読んだことがあります.101レコード以上をTOPすると、メモリではなくtempdbを使用してソートされます。

4

2 に答える 2

0

映画データベースがあります (50,000 本の映画が登録されています)。このリストを Web ページに表示する方法は、ポケットベルです。ロジックは完全に SQL で生成されます

WITH ct1 as
(
    SELECT ROW_NUMBER() OVER(ORDER BY some condition) num,
    {my fields}
)
SELECT {my fields} FROM ct1 
WHERE num BETWEEN (@PageNum - 1) * @ItemsPerPage + 1 
AND @PageNum * @ItemsPerPage

50,000 件を超えるレコードの場合、1 秒もかかりません。

于 2013-04-25T12:24:03.613 に答える
0

私たちは TOP を頻繁に使用していますが、これまでにパフォーマンスの問題が発生したことはありません。

もしかしたら、「ARITHABORT はデフォルトでオフになっている」という問題に直面しているのではないでしょうか?

選択する前に呼び出します:

new SqlCommand("SET ARITHABORT ON", connection).ExecuteNonQuery();
于 2013-04-24T22:14:18.843 に答える