2009-05-11 8 views
1

ほとんどのデータベースは、「insert into select ...」ステートメントのいくつかの形式をサポートしています。データベース挿入の理解

insert into a 
select value from b; 

これはどのように達成されていますか?

私の理解:ステートメントの実行開始時点に存在する行が選択され、テーブルaに挿入されます。同時に、新しい値をテーブルbに挿入することができ、クエリは既に実行を開始しているため、「考慮」されません。

私の理解は正確に近いですか?これについての任意のリファレンスドキュメントは非常に感謝しています。

ありがとうございます!

+0

データベース用語では、「選択性」とは非常に特異的なものを意味します。これは、select文やinsertではなく、索引と関連しています。 –

答えて

1

最新のデータベースの回答はmultiversion concurrency controlです。

基本的に、各行には、表示される瞬間からのタイムスタンプがあります。次に、selectは、現在のステートメントよりも前にコミットしたトランザクションによって追加された行か、現在のトランザクション(シリアライズ可能な分離)がselectから参照できるように、分離レベルを考慮します。

0

分離レベルに応じて「新しい値を挿入できます」。たとえば、それが起こらないシリアライズ可能な場合です。

1

特にエンジンについては話していないので、それが起こっている可能性があります。また、データベースがその時点で行を選択するポイントが存在する可能性があります。すべてがエンジンとデータベースに適用されるロックに依存します。

0

データベース固有の違いがあると思いますが、ほとんどの場合、一般的な回答が得られます。 「insert as select」を実行すると、RDBMSはSELECTステートメントを実行して実行します。他のSELECT文と同様に、結果はメモリ内の「仮想テーブル」(各データベースとそれ自身のキャッシュとRAM管理)に格納されます。次に、INSERTステートメントは、通常の複数行のINSERTステートメントになります。これは、メモリ内の結果がコマンドライン経由で提供されるデータとまったく同じように動作するためです。 この段階で、新しい行が「選択された」表に挿入されると、INSERT文には影響しません。 最後に、SELECTが結果として多すぎる行を生成するか、ロックされた表を参照すると、RDBMSが値を別々に選択するため、事態が変わる可能性があります。

0

SQL Serverの選択(あなたにも見てみたいと思うのインデックスを使用しています) - http://blog.namwarrizvi.com/?p=157 - http://www.sqlsolutions.com/articles/articles/How_Values_with_Irregular_Selectivity_Impact_SQL_Server_Database_Performance.htm - http://sqlserverpedia.com/blog/sql-server-bloggers/index-columns-selectivity-and-inequality-predicates/

オラクルの選択(再びこれらの記事は、インデックスの選択を参照してください) - http://www.akadia.com/services/ora_index_selectivity.html - http://courses.csusm.edu/cs643yo/slides/optimization.htm(アーキテクチャについてのお話は、ここをクリックしてください)

関連する問題