/ / Как е SELECT DISTINCT толкова бързо? [дубликат] - база данни, sqlite, оптимизация, sqlite3

Как SELECT DISTINCT е толкова бързо? [дубликат] - база данни, sqlite, оптимизация, sqlite3

Възможно дублиране:
SQL - Как е DISTINCT толкова бързо, без индекс?

Здравейте,

Имам база данни с таблица, наречена "връзки" с 600 милиона реда в нея в SQLite. В базата данни има 2 колони - колона "src" и колона "dest". Понастоящем няма индекси.

Съществуват справедлив брой общи стойности между src и dest, но и справедлив брой дублирани редове.

Първото нещо, което се опитвам да направя, е да премахна всички дублиращи се редове и след това да извърша допълнителна обработка на резултатите, но аз се натъкнах на някои странни въпроси.

Първо, SELECT * FROM връзки WHERE src = 434923 ANDЦел = 5,010,182. Сега това връща един резултат сравнително бързо и след това отнема доста време, за да тичам, тъй като предполагам, че изпълнява таблици, които могат да се видят на останалите редове от 600 метра.

Ако обаче правя връзки SELECT DISTINCT * FROM,след това веднага започва бързо връщането на редовете. Въпросът е: как е възможно това? Със сигурност за всеки ред редът трябва да бъде сравнен с всички останали редове в таблицата, но това ще изисква таблици от останалите редове в таблицата, които ТРЯБВА отнема много време!

Някакви идеи защо SELECT DISTINCT е толкова по-бърза от стандартния SELECT?

Отговори:

1 за отговор № 1

Дублиращият се въпрос заслужава дублиран отговор:

За да бъдете по-точни, една заявка не е по-бързаотколкото другия. По-точно, времето, необходимо за попълване на заявката, трябва да бъде една и съща и за двете заявки. Разликата е, че заявката с DISTINCT просто има повече редове, за да се върне, следователно тя изглежда да реагира по-бързо, тъй като получавате редове с бързи темпове. Обаче, това, което се случва под капака на двата вида, е същото сканиране на таблицата. Отделната заявка има структура от данни, в която се съхраняват данните, които са били върнати, и филтрите дублират. Следователно, действително трябва да отнеме повече време, докато заявката завърши, но (връщането на редове) / времето е по-голямо, тъй като има само повече редове, които съвпадат. (Също така имайте предвид, че някои зрители добавят лимит за резултатите от заявката, което може да накара отделната заявка да се появи по-бързо (тъй като удряте крайната граница и спирате)).