2009-03-20 8 views
3

私は、クエリ表スプール/イーガースプール

select * into NewTab from OpenQuery(rmtServer, 'select c1, c2 from rmtTab') 

私は実行計画を見ると、それはそれは一時テーブルにデータを格納することを「表スプール/イーガースプール」を実行していることを私に告げるがあります巻き戻しを最適化するために

今はリワインドを予期しません。何らかのクラッシュがあった場合、新しいタブをドロップしてやり直すことができます。

一時テーブルにデータを格納する方法がありますか?

答えて

4

おそらくそれが原因のオープンクエリーです。

行数、統計情報、何もないので、SQL Serverは結果をスプールして、後で疑わしいビットを評価できるようにします。それが基本的な考えです。

newtabの作成と書き出しを分けることをお勧めします。

ところで、巻き戻しはロールバックされません。巻き戻しはトランザクションの安全性とは関係ありません。行の再利用を予期するのはSQL Serverです。オープンクエリーはブラックボックスなので正しいです。

巻戻しの場合は、このSimple Talk articleの下部を見てください。あなたは "リモートクエリ"を持っています。

編集

基づき1何か私は、sp_tableoption見先週見つけました。

インデックスなし テーブルにデータをインポートするOPENROWSETバルク 行セットプロバイダで使用する場合、TABLOCKが同時に 最適化されたロギングとターゲット表に データをロードする 複数のクライアントを可能と

ロック

あなたの塗りつぶしにTABLOCKを試してみてください。 .net SQLBulkCopyを使用して、非常に悪いパフォーマンスを与えるクライアント開発者と面白かったです。また、このから

Kalen Delaney

それは直感的ではありません。

+0

私は作成と記入を分けて(Mladenも示唆したように)試みましたが、私は同じクエリプランを持っていました。しかし、そのリンクは非常に興味深いです。 – cindi

+0

私は単純なクエリのビューは、リモートクエリは情報のテーブルを返すことです、選択/は空白のテーブルを作成し、それだけで新しいテーブルに取得する行をコピーするつもりです。だから、なぜこれを2回行うのですか? – cindi

+1

「INSERT INTO MyTable select * from LinkedServerSource'」から熱心なスプールを取り除こうとしているときにこのことが起こりました。 'TABLOCKX'を追加するとそれが取り除かれました。 –

1

最初にNewTabを作成し、次にopenqueryから挿入します。