2010-12-28 3 views
0

Можно создать дубликат:
SQL — How is DISTINCT so fast without an index?Как SELECT DISTINCT так быстро?

Привет,

У меня есть база данных с таблицей под названием 'ссылки' с 600 миллионами строк в ней в SQLite. В базе данных есть 2 столбца - столбец «src» и столбец «dest». В настоящее время нет индексов.

Существует множество общих значений между src и dest, но также справедливое количество дублированных строк.

Первое, что я пытаюсь сделать, это удалить все повторяющиеся строки, а затем выполнить некоторую дополнительную обработку результатов, однако я столкнулся с некоторыми странными проблемами.

Во-первых, SELECT * FROM ссылки WHERE src = 434923 И dest = 5010182. Теперь это возвращает один результат довольно быстро, а затем занимает довольно много времени для запуска, поскольку я предполагаю, что он выполняет таблицы в остальных 600-метровых рядах.

Однако, если я делаю SELECT DISTINCT * FROM ссылок, он сразу же начинает быстро возвращать строки. Вопрос в том, как это возможно? Разумеется, для каждой строки строка должна сравниваться со всеми остальными строками в таблице, но для этого потребуются таблицы остальных оставшихся строк в таблице, которые СЛЕДУЕТ требует возраста!

Любые идеи, почему SELECT DISTINCT намного быстрее, чем стандартный SELECT?

+2

Почему вы задаете точно такой же вопрос снова и из двух разных учетных записей с тем же именем ??? –

+1

Чтобы быть абсолютно честным, я понятия не имею. Я попытался опубликовать вопрос до этого, но получил ошибку с серверов здесь. Затем я попытался найти исходный вопрос, но он не был зарегистрирован под моей учетной записью (это все еще не так) и искал его (не смог найти), поэтому я полагал, что он не был отправлен. Извиняюсь за ошибку. –

ответ

1

Дубликат вопрос заслуживает дубликат ответа:

Чтобы быть более точным, один запрос не быстрее, чем другие. Точнее, время, затраченное на выполнение запроса, должно быть одинаковым для обоих запросов. Разница в том, что запрос с DISTINCT просто имеет больше строк для возврата, поэтому он реагирует быстрее, так как вы быстро получаете строки. Однако то, что происходит под капотом обоих, - это одно и то же сканирование таблицы. Различный запрос имеет структуру данных, хранящую то, что было возвращено, и фильтрует дубликаты. Поэтому ему ДОЛЖНО набирать больше времени, пока запрос не завершится, но (возвращенные строки)/время больше, так как есть просто больше строк, которые соответствуют. (Также обратите внимание: некоторые зрители добавляют ограничение на результат запроса, которое может заставить отчетный запрос работать быстрее (поскольку вы нажимаете предел результата и останавливаете)).

+0

Извинения за дубликат, честную ошибку (см. Мой комментарий выше). Спасибо за вашу помощь, очень ценю. –