0

次のようにscope_testというテーブルがあります。

create table scope_test
(
id int identity(1,1),
val varchar(100)
)

このテーブルに行を挿入し、2 つの異なる SQL ステートメントでスコープ ID を選択すると、2 つのステートメントのパフォーマンスの違いが分かります。

insert into scope_test values('abcd')
select scope_identity() -- statement 1
select scope_identity() from scope_test -- statement 2

実行計画によると、ステートメント 1 はステートメント 2 よりも高速です。

ここに画像の説明を入力

私は知っておくべき好奇心です:1.このパフォーマンスの違いはなぜですか、そして2.ステートメント1で使用されているように、つまりテーブル名なしでスコープidentity()を使用しても安全ですか?

4

1 に答える 1

4

パフォーマンスの違いは、単純に、実行していることが異なるためです。の 2 番目の使用法はscope_identity、最後の ID を取得するだけでなく、テーブル内のすべてのレコードを取得し、テーブルscope_identity()内の各レコードの値を選択します。scope_identity()テーブルに存在するレコードごとに一度だけ値を取得します。

したがって、 の 2 番目の使用scope_identity()は単純に無意味であり、同じ値を 1 回以上返します (クエリで使用されるテーブルが空の場合は 0 回)。の値はscope_identity()、クエリで使用するテーブルとはまったく関係ありません。つまり、別のテーブルにレコードを挿入する場合、特定のテーブルに挿入された最後の ID を取得するために使用することはできません。

于 2012-10-10T06:12:17.450 に答える