Мифы SQL
Многие разработчики с немалым опытом разработки на любых императивных языках свято верят в то что SQL это тоже самое. Только синтаксис другой. После написания нескольких запросов для вытаскивания данных в свой сервер приложений начинают рождаться мифы о БД.
У меня примеры написаны и проверенны для Оракла, просто он мне ближе.
Но тоже самое действительно для любой СУБД.
UPD: Просили добавить описание что и почему. Добавил.
1. Магический параметр где-нибудь глубоко в конфигах сервера fast = true.
2. Скорость работы запроса оценивается по тому как быстро вывелись первые 20 строк.
3. Можно взять и оптимизировать любой отдельный запрос, или даже часть запроса не трогая ничего кроме него.
4. Понять как работает запрос и улучшить его можно просто посмотрев на код запроса.
5. Во временных таблицах не надо делать ни Primary Key, ни индексов.
6. Внешний ключ = Индекс по полю в дочерней таблице
7. Запрос с меньшей стоимостью обязан работать быстрее.
8. Абсолютная идентичность следующих вариантов кода.
declare
summ number(10);
i number(10);
cursor c is select a from test_pk;
begin
summ := 0;
open c;
loop
fetch c into i;
exit when c%notfound;
summ := summ + i;
end loop;
close c;
dbms_output.put_line(summ);
end;
и
select SUM(a) from table1
Основное объяснение ведь и там и там просто суммируем, какая разница как именно это делается.
9. Любое обращение по индексу лучше чем без него.
9а. И связанное с этим Запрос работает медленно, надо добавить индекс.
В запросе Full Table Scan по 100 записям, из которых надо 95 и рядом Full Index Scan по миллиону записей из которых надо тоже 95. Все будут 'оптимизировать' Full Table Scan
10. Скорость соединения таблиц сильно зависит от типов и количества полей по которым мы их соединяем.
10а. Скорость напрямую зависит от количества таблиц участвующих в запросе.
11. В запросах вида
SELECT *
FROM table t
Where t.a = 123
AND t.b = 321
Всегда будут работать два отдельных индекса по полям а и b.