Сколько времени займет мой SQL-запрос? - PullRequest
4 голосов
/ 05 июля 2010

У меня есть база данных в SQLite Administrator с 3 таблицами, скажем, A, B и C.

Таблица A имеет 3 столбца p1, p2 и p3, около 2 миллионов строк.
Таблица B имеет 2 столбца p1 и p4, а также около 2 миллионов строк.
Таблица C имеет 1 столбец p4 с 800 000 строк.

Запрос, который я пытаюсь выполнить, выглядит следующим образом:

SELECT A.p1, B.p4, A.p2, A.p3
FROM A,B,C
WHERE A.p1=B.p1 AND B.p4=C.p4

Запрос уже занял 3 дня, но все еще не завершен. Интересно, следует ли мне прервать его или подождать, пока он не завершится. Если это закончится в ближайшие 5-6 дней, я, вероятно, подожду, но если это займет больше, мне придется прервать его.

Должен ли я ждать или нет?

Мои характеристики ПК: Core 2 Duo 1,86 ГГц, 2 ГБ ОЗУ,

Ответы [ 2 ]

2 голосов
/ 05 июля 2010

Я бы сказал, что через 3 дня нет ничего странного (если нет индексов).

Если на A, B, C нет индексов, тогда ваш запрос выполнит полное сканирование A x B x C. Количество записей в A x B x C составляет

SELECT COUNT(*)
FROM A,B,C

, что (2*10^6) * (2*10^6) * (0.8*10^6) = 3.2 * 10^18

При условии, что вы можете применить условие where к миллиарду записей в секунду, вам все равно потребуется 3,2 * 10 ^ 9 секунд. Которому чуть более 101 года.

Однако, если у вас есть индексы на p1 и p4, приличная СУБД будет иметь возможность прямого доступа к результатам, а не сканировать полный декартовой продукт (ну, я думаю, что некоторые БД решат создавать временные индексы, которые все еще будут медленными но сделает запрос действительно выполненным).

0 голосов
/ 05 июля 2010

Есть ли у вас индексы на A.p1, B.p1, B.p4, C.p4? Если нет, то лучше прекратить его, он может работать несколько лет.

Для такого рода операций вам нужно нечто большее. Это не лайт вообще. Подумайте о переходе на другую СУБД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...