1

私はこのクエリを思いつきました。賞賛中にエラーは発生しませんが、この selectステートメントを次のように使用できるかどうかはわかりませんvalue

insert into store(c1 ,artno, c3, c4, c5, c6, c7 )
           select '1', a.artno, 0,0.0,null,null,null 
           from art a
              left join store s on s.artno=a.artno
              inner join status b on a.artno = b.artno
    where b.state ='5'  
      and s.artno is null  
      and a.artgroup not in('63','280') 

insert使用できる別の代替手段も見ましたが、それが私の要件として使用できるかどうかはわかりません。これがストアドプロシージャで実装されているのを見たので、使用できるかどうかのアイデアをつかみましたか?

declare @artno as varchar(150); 
declare @count as tinyint

Declare cS CURSOR For
               select  a.artno
               from art a
              left join store s on s.artno=a.artno
              inner join status b on a.artno = b.artno
    where b.staus ='5'  
      and s.artno is null  
      and a.artgroup not in('63','280') 


Open cS
Fetch NEXT from cS into @artno

While @@FETCH_STATUS=0

select @count=COUNT(*) from store where artno=@artno
if @count=0 

 BEGIN

insert into store(c1 ,artno, c3, c4, c5, c6, c7 )
           values('1', a.artno, 0,0.0,null,null,null)                 

    fetch next from cS into @artno                 
 END 
 close cS
 deallocate cS

どちらを使用し、どれを使用しないか、およびその理由についての説明は、私の知識にも役立ちます。

4

2 に答える 2

1

カーソルはメモリを大量に消費し、時間がかかります。一方SELECT INTO、挿入するテーブル コンテンツは事前に構築されており、1 回のストレッチで実行できます。また、 の場合SELECT INTO、SQL エンジンはデータ フェッチを最適化する可能性がありcursorますが、 の場合、DB に行を順次フェッチするよう強制しているため、最適化は不可能です。

http://blog.sqlauthority.com/2011/08/10/sql-server-use-insert-into-select-instead-of-cursor/

私の声明を支持する上記のリンクにアクセスしてください。

于 2012-08-09T12:00:36.663 に答える
1

他のどこにも言及されていないので、カーソルには別の問題があります。データベースへのすべての挿入/更新には、クライアントからサーバーへの往復通信が必要です。

これは実際には、パフォーマンスの観点から考えるよりも悪いことです。多くの場合、データベースは、データをテーブルに効率的にバッチ挿入するように設計されています。100 行を挿入する労力が、1 行を挿入する労力の 100 倍になることはめったにありません。より一般的には、もう少しだけ長くなります。

カーソルを使用すると、操作の「シリアル化」が強制されます。したがって、2 番目の行に移動する前に、最初の行の操作全体を完了する必要があります。これにより、パフォーマンスが大幅に低下する可能性があります。

他の人が述べたように、可能な場合は常にセットベースの操作を使用してください。できない場合は、できるように問題を変更することを考えてください ;-)

于 2012-08-09T14:18:20.867 に答える