alter table add后的sqlite优化更新

alter table add后的sqlite优化更新,sqlite,optimization,sql-update,Sqlite,Optimization,Sql Update,我有一个过程,在某个时刻,我需要向INTEGER类型的表添加一个新列,然后用更新填充这个新列。我用C语言做这个 我可以把我的代码精简到 CREATE table t (a integer, b integer) populate t CREATE INDEX t_ndx on t (a) ALTER TABLE t add c integer 更新列“C”的C伪代码如下所示 sqlite3_stmt u; sqlite3_prepare_v2(db, "update t set c=? w

我有一个过程,在某个时刻,我需要向INTEGER类型的表添加一个新列,然后用更新填充这个新列。我用C语言做这个

我可以把我的代码精简到

CREATE table t (a integer, b integer)
populate t
CREATE INDEX t_ndx on t (a)
ALTER TABLE t add c integer  
更新列“C”的C伪代码如下所示

sqlite3_stmt u;
sqlite3_prepare_v2(db, "update t set c=? where a=?, -1, &u, 0);
for(i=0;i<n;i++)
{ c=c_a[i];
  a=a_a[i];
  sqlite3_bind_int64(u, 1, c);
  sqlite3_bind_int64(u, 1, a);
  sqlite3_step(u);
}
先发制人 干杯
Phi

您的代码已经非常优化了。按
a
搜索行需要一个索引查找和一个表行查找;两者都会很快,因为所需的页面可能已经被缓存

通过将此列设置为,可以加快对
a
的查找,但只有当
a
实际上是主键时,这才有意义

理论上,可以一次更新多行:

UPDATE t
SET c = CASE a
        WHEN :a1 THEN :c1
        WHEN :a2 THEN :c2
        WHEN :a2 THEN :c3
        END
WHERE a IN (:a1, :a2, :a3);

但是对于许多
a
值来说,这很可能是作为对表的扫描来实现的,因此只有当您可以将所有值都放入查询中时才有意义,这对于大型表来说是不可能的。

您的代码已经非常优化了。按
a
搜索行需要一个索引查找和一个表行查找;两者都会很快,因为所需的页面可能已经被缓存

通过将此列设置为,可以加快对
a
的查找,但只有当
a
实际上是主键时,这才有意义

理论上,可以一次更新多行:

UPDATE t
SET c = CASE a
        WHEN :a1 THEN :c1
        WHEN :a2 THEN :c2
        WHEN :a2 THEN :c3
        END
WHERE a IN (:a1, :a2, :a3);

但是对于许多
a
值,这很可能是作为对表的扫描来实现的,因此只有当您可以将所有值都放入查询中时才有意义,这对于大型表来说是不可能的。

Thanx CL对于您的回答,我将保留我得到的另一种情况的示例。我在“a”上创建了一个索引,希望它能加快WHERE a=?,我认为这会使扫描更容易,但是=?我将提供的顺序与“t”中的行顺序完全匹配,如果rowid扫描比列“a”上的索引扫描快,那么我可以强制按rowid扫描。我不知道sqlite3的内部结构。再次感谢你。PhiThanx CL对于您的回复,我将保留我得到的另一种情况的案例示例。我在“a”上创建了一个索引,希望它能加快WHERE a=?,我认为这会使扫描更容易,但是=?我将提供的顺序与“t”中的行顺序完全匹配,如果rowid扫描比列“a”上的索引扫描快,那么我可以强制按rowid扫描。我不知道sqlite3的内部结构。再次感谢你。Phi