3


0

最初のレコードが返されてから最後のレコードが返されるまでの間にSQL Serverは何をしますか?

10,000件のレコードを返すクエリがあるとします。 最初のレコードが返されたら、クエリの状態について何を想定できますか?

  1. 終了し、サーバーから自分のレコードを返すだけです SSMSのインスタンス?

  2. クエリ自体はまだサーバーで実行されていますか?

  3. 10,000件のレコードがゆっくり返される原因は何ですか あるクエリと別のクエリのほぼ瞬時に?

3 Answer


1


サーバー側でのプログレッシブ処理、データのネットワーク転送、およびクライアントによるレンダリングが混在する可能性があります。

あるクエリが10,000行をすばやく返し、別のクエリがゆっくり(そして行サイズ、データ型などが似ていて、両方ともグリッドへの結果またはテキストへの結果を宛先とする)場合、分析する方法はほとんどありませんそれぞれの実行計画やクライアント統計を表示しない限り、違いがあります。 これらは、クエリの実行時にSSMSで設定できるオプションです。

余談ですが、結果をグリッドに、結果をテキストに切り替えると、実行時間がわずかに異なることに気付くかもしれません。 これは、ある場合には、Management Studioが列などを揃えるために一生懸命働く必要があるためです。


0


一般的な仮定を立てることはできません。クエリのプランは、さまざまな種類の操作、または反復子で構成されます。 これらの一部はナビゲーションベースであり、パイプラインのように機能しますが、その他はソートなどのセットベースの操作です。

クエリにセットベースの操作が含まれる場合、結果を出力する前にすべてのレコードが必要です(つまり、ステートメント内のorder by句)。ただし、セットベースのイテレータがない場合は、行がそれらが利用可能になります。


0


個々の質問に対する答えは「それは依存します」です。

たとえば、「order by」句を含めて、並べ替える列のインデックスがない場合を考えます。 この場合、サーバーは、最初のレコードを返す前に、クエリを満たすすべてのレコードを見つけて並べ替える必要があります。 これにより、最初のレコードを取得する前に長い一時停止が発生しますが、レコードを取得し始めるとすぐに(通常)取得できます。

「order by」句がない場合、サーバーは通常、各レコードを検出されたとおりに送信するため、最初のレコードがより早く表示されることがよくありますが、1つのレコードと次のレコードの間に長い一時停止が見られる場合があります。

単純に「あるクエリが別のクエリよりも速い理由」に関しては、利用可能なインデックスと、特定のクエリで使用できるかどうかに大きく依存します。 たとえば、「%something」のような「some_column」のようなものは、ほとんど常に非常に遅いでしょう。 先頭の「%」は、「some_column」にインデックスがある場合でも、インデックスを使用できないことを意味します。 `%something%`の代わりに `something%`を検索すると、簡単に100倍または1000倍高速になります。 前者が本当に必要な場合は、代わりに全文検索を使用します(全文インデックスを作成し、「like」の代わりに「contains()」を使用します。

もちろん、データベースが特定の列(または列のグループ)のインデックスを持っているかどうかによっても、多くのことが決まります。 適切なインデックスを使用すると、通常、クエリは非常に高速になります。