2016-03-23 7 views
0

У меня есть процесс, когда в какой-то момент я должен добавить новый столбец в таблицу типа INTEGER, тогда мне нужно заполнить этот новый столбец UPDATE. Я делаю это в C.sqlite оптимальное обновление после таблицы alter add

я могу наклониться мой код

CREATE table t (a integer, b integer) 
populate t 
CREATE INDEX t_ndx on t (a) 
ALTER TABLE t add c integer 

: 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); 
} 

порядка а являются то же самое для этого UPDATE, как указано при создании t.

Хотелось бы узнать, обнаружил ли механизм sqlite3 «последовательный» доступ и ускорил «где a =?» (т. е. сохранить своего рода кеширование предыдущего курсора?

Я также хотел бы знать, есть ли скрытая функция, такая как массив привязки (по крайней мере, при работе с INTEGER), чтобы избежать создания такого цикла и избегать всех эти переплеты и избежать байткод для выполнения всех тех, кто вставить что-то вдоль линии

sqlite3_stmt u; 
sqlite3_prepare_v2(db, "update t set c=? where a=?, -1, &u, 0); 
sqlite3_bind_int64_array(u, 1, c_a, n); 
sqlite3_bind_int64_array(u, 1, a_a, n); 
sqlite3_step_array(u,n); 

Thanx заранее Приветствия Phi

ответ

2

Ваш код уже в значительной степени является оптимальным. Поиск строки по a нужен поиск по одному индексу и поиск по одной таблице строк ; оба будут быстрыми, потому что нужные страницы, скорее всего, будут кэшироваться.

Вы можете ускорить поиск по a, сделав этот столбец INTEGER PRIMARY KEY, но это имеет смысл только в том случае, если 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 ценностей, это, вероятно, будет реализован как сканирование по столу, так что бы только смысл если вы можете вставить все значения в запрос, что невозможно для большой таблицы.

+0

Thanx CL для вашего ответа, я сохраню пример CASE для другой ситуации, которую я получил. Я создал индекс «a» в надежде, что он ускорит WHERE a =?, Я думал, что это облегчит сканирование, но =? порядок, который я предоставил, точно соответствует порядку строк в 't', может быть, тогда я могу принудительно выполнить сканирование с помощью rowid, если сканирование с помощью rowid выполняется быстрее, чем сканирование индексом на col 'a'. Я не знаю внутренних компонентов sqlite3. Опять thanx. фита – Phi

Смежные вопросы