大多数数据库都支持某种形式的“insert into select ...”语句。
insert into a
select value from b;
这是如何实现的?
我的理解:当语句开始执行时出现的那些行有资格被拾取,并且它们被插入到表a中。同时,新值可以插入到表b中,并且由于查询已经开始执行,因此不会“考虑”它们。
我的理解是否接近准确?任何参考文档都非常感谢。
谢谢!
答案 0 :(得分:1)
由于您没有特别谈论任何引擎,因此可能会发生这种情况。此外,数据库可能只会在当时选择一行。这一切都取决于引擎,以及应用于数据库的锁。
答案 1 :(得分:1)
大多数现代数据库的答案是multiversion concurrency control。
基本上每行都有一个从可见瞬间开始的时间戳。然后,select会考虑隔离级别,以查看在当前语句(用于读提交的隔离)之前或当前事务(用于可序列化隔离)之前已提交的事务所添加的行是否应对select可见。
答案 2 :(得分:0)
“可以插入新值”,具体取决于您的隔离级别;例如,如果它是可序列化的,则不会发生。
答案 3 :(得分:0)
我猜有数据库的具体差异,但我可以为大多数人提供一般答案。 执行“insert as select”时,RDBMS将执行SELECT语句。与任何其他SELECT语句一样,结果将存储在内存中的“虚拟表”中(每个数据库及其自己的缓存和RAM管理)。然后,INSERT语句变为普通的多行INSERT语句,因为内存中的结果与通过命令行提供的数据完全相同。 在此阶段,如果将任何新行插入“selected”表,则不会影响INSERT语句。 最后,如果SELECT因此产生太多行,或者会引用锁定表,则事情可能会发生变化,因为RDBMS会以不同方式选择值。
答案 4 :(得分: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/
Oracle选择性(这些文章再次引用索引选择性) - http://www.akadia.com/services/ora_index_selectivity.html - http://courses.csusm.edu/cs643yo/slides/optimization.htm(谈论架构,可能对你更有用)