9

500行の小さなテーブルがあります。このテーブルには、1 つの varchar(max) 列を含む 10 列があります。

このクエリを実行すると:

SELECT TOP 36 *
FROM MyTable
WHERE (Column1 = Value1)

3 分で約 36 行を取得します。varchar(max) 列には、各行に 3000 文字が含まれます。

1 行少ないだけを取得しようとすると、次のようになります。

SELECT TOP 35 *
FROM MyTable
WHERE (Column1 = Value1)

次に、クエリは 0 秒で 35 行を取得します。

私のクライアントの統計、サーバーから受信したバイト数には、次のものがあります。

0 秒でデータを取得するクエリの場合は 95 292

3 分間でデータを取得するクエリで 200 000 000 以上

由来って知ってる?

編集 --- これが私の実際のコードです:

select top 36 *
from Snapshots
where ExamId = 212

select top 35 *
from Snapshots
where ExamId = 212

編集 --- クライアント統計の詳細

大きな変動がある2つの統計は次のとおりです。

サーバーから受信したバイト数: 66 038 対 2 000 000 以上

サーバーから受信した TDS パケット 30 Vs 11000

4

7 に答える 7

0

よくわかりませんが、これを試してください。

ExamId =のスナップショットから*を選択します(ExamId = 212のスナップショットから上位36のExamIdを選択します)

于 2012-05-22T19:09:26.490 に答える
0

の代わりIndexExamIdも使用select field1,field2,etcselect * ...ます。

于 2012-05-22T18:42:56.693 に答える
0

実行時間は非常に短いはずですが、フェッチははるかに長くなります。SELECT TOP ステートメントから varchar(max) を削除し、特に必要な値のみを取得します。

于 2020-02-19T19:58:46.590 に答える
0

schema (datatype+existing index)他の人が言っているように、あなたはSnapshotテーブルから投げるべきです。

snapshotテーブルでは、一意ではない非クラスター化インデックスであると考えていexamidます。1 つにはexamid多くのレコードがあります。スナップショット テーブルには PK 列が必要です。

Top節は常にOrder by 節とともに使用する必要があります。Top句抜きOrder by句はNon Determinstic。何を基準に選ぶのかTop N。したがって、スナップショットのスキーマを知ってから、正しいインデックスを決定します。

Order by句を使用することもできますNon Determinsticが、これは別の議論です。

あなたはこれを試すことができます、

create  table #temp(PKID int)

insert into #temp(pkid)
select top 36 pkid
from dbo.Snapshots
where ExamId = 212

次に、これを行うことができます。

select col1,col2,col3,col4
from dbo.Snapshots S
where exists(select 1 from #temp t where t.pkid=s.pkid)

さて、あなたの主な質問と問題は、

35 行が 0 秒で取得され、36 行が 3 分で取得される理由。

すぐにここに書きます。その間、スナップショット テーブルの完全な構造を待っています。

于 2021-11-17T11:25:31.713 に答える