2017-01-30 2 views
1

У меня есть две таблицы, которые структурно идентичны и примерно 10k строк каждый:SQLITE повысить эффективность запроса

db1.people   db2.people 
*************** *************** 
name | number name | number 
--------------- --------------- 
mike |   bob | 
john |   Kev | 45 
mark |   mark | 16 
*************** *************** 

моя цель состоит в том, чтобы найти тот же человек в обеих таблицах и скопировать значение в число от db2 до DB1 , Это потребовало некоторого взлома, но я думаю, что у меня это работает:

UPDATE people SET number = (SELECT number FROM db2.people WHERE number > 0 AND name = main.people.name); 

И это работает, но очень тяжело. Я думаю, что его, выполнив следующие действия:

  • проходит через все 10k имена в db1.people.names
  • находит такое же имя в db2.people.names
  • если db2.people.number населен он ставит значение в main.people.number

Улов всего лишь около 200 из 10-килограммовых линий в db2.people заполняется цифрой.

Это то место, где я вышел из своей лиги; как ограничить вышеуказанный запрос, чтобы работать только для имен, имеющих соответствующее числовое значение в db2.people.number?

Это должно принести мой 10k^10k 200^10k

Спасибо,

+0

Есть ли какой-то способ положить UPDATE подзапрос в ЗЕЬЕСТ для db2.people WHERE число> 0? обратное моему текущему утверждению: пройдите через db2.people.number и посмотрите только на db1.people.name, когда db2.people.number заполнен? – apeg

ответ

1

Поскольку SQLite не поддерживает обновление присоединиться синтаксис, вы можете быть застрял текущий подход, включающий связанный подзапрос. При этом, если вы добавите индексы в таблицу db2.people на оба столбца, это может значительно ускорить обновление. Если вы добавите индекс на name и number, это позволит значительно быстрее искать время для каждой строки в db1.people во время обновления.

1

Я прочитал SQLITE поддерживает существует оговорка

UPDATE people 
SET number = 
(SELECT number FROM db2.people WHERE number > 0 AND name = main.people.name) 
where exists 
(SELECT number FROM db2.people WHERE number > 0 AND name = main.people.name); 
+0

Спасибо Дэнни, он отлично работает, но я удивлен, увидев только улучшение производительности на 15%? – apeg

+0

Жаль, что я мог бы сделать 15% своих сбережений. Потрясающие. – danny117

+0

ха-ха, правда, и больно! спасибо – apeg

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