![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация запроса [D6, MySQL]
Andrey © (2004-05-31 10:13:00)Проблема в следующем: при попытке выполнить запрос к таблице, состоящей из 6,000,000 записей, комп выполняет его где-то секунд 30. Открытие той же таблицы через TTable (с установленным индексом) происходит почти сразу (через пару секунд). Отсюда и вопрос, что делать? (без запроса не обойтись)
Vlad (2004-05-31 11:28:00) [21]
> Andrey (31.05.04 11:26) [37]
Ты попробуй сначала, просто ради эксперимента. Может не в этом дело, тогда дальше думать будем. Нужно же локализовать проблему
Andrey (2004-05-31 11:26:00) [22]Ну а как без OR обойтись?
Надо ограничивать по всем трем значениям!
Vlad (2004-05-31 11:20:00) [23]
> sniknik © (31.05.04 11:13) [34]
а я разве с этим спорю, это делает оптимизатор практически во всех СУБД.
Речь о том, что если в ограничивающее условие впихнуть OR то будут заметные тормоза.
sniknik (2004-05-31 11:16:00) [24]полу = полю
;)
впрочем к какому нибудь неиндексированному(и противоположному) полу я бы тоже присоеденился... ;о))
sniknik (2004-05-31 11:13:00) [25]Vlad © (31.05.04 11:01) [28]
вот!
> и ограничиваем выборку по нек-му критерию (индексированному полю).
это на твой взгляд делается после, на самом деле движок обычно сначала ограничивает, а обьеденение уже по 100записям к примеру (что в выборку вошло) делает, это большого времени не составляет,
убери условие ограничения (чтобы получить полное декартово произведение таблиц) и посмотри сколько времени займет.
> Нет индексов по contract.fundid и contract.clt_auto. Может, из-за этого он вешается?
одна из причин. для присоеденения по неиндексированному полу обычно строится временный индекс.
Vlad (2004-05-31 11:12:00) [26]
> Andrey (31.05.04 11:07) [32]
> Я сейчас убрал условие по ctp_auto
Да не надо совсем его убирать. Естественно будет тормозить, ты же выбираешь теперь произведение всех записей !
Говорю, сделай индекс по этому полю, и ограничивай без всяких OR или IN то есть просто ctp_auto = XXX
Andrey (2004-05-31 11:07:00) [27]
> Есть основная таблица (6 млн записей) и есть 2 справочника,
> получаем декартово произведение трех таблиц, затем естественно
> связываем таблицы по ключевым полям и ограничиваем выборку
> по нек-му критерию (индексированному полю). Так вот - на
> глаз никакой разницы нет, что мы выбираем из одной, что
> из трех таблиц. Результат не заставляет ждать и секунды
> (Так на IB во всяком случае)
Хе. Не совсем. Я сейчас убрал условие по ctp_auto и он один хрен тормозит.
Nikolay M. (2004-05-31 11:06:00) [28]
> Есть основная таблица (6 млн записей) и есть 2 справочника,
> получаем декартово произведение трех таблиц, затем естественно
> связываем таблицы по ключевым полям и ограничиваем выборку
> по нек-му критерию (индексированному полю). Так вот - на
> глаз никакой разницы нет, что мы выбираем из одной, что
> из трех таблиц. Результат не заставляет ждать и секунды
> (Так на IB во всяком случае)
А что, в IB нет оптимизатора запросов, который сам оптимальным образом расставляет порядок условий в WHERE? Даже в мускуле оптимизатор есть.
DenK_vrtz (2004-05-31 11:06:00) [29]Andrey (31.05.04 11:04) [29]
в ромашку играем? Пробуй!
Andrey (2004-05-31 11:04:00) [30]
> Индексы по fund.fundid и client.clt_auto есть?
Нет индексов по contract.fundid и contract.clt_auto. Может, из-за этого он вешается?
Vlad (2004-05-31 11:01:00) [31]
> sniknik © (31.05.04 10:50) [24]
> т.е. хочеш сказать что декартово обьеденение трех таблиц
> по 6млн. записей такойже по скорости как открытие одной
> без обьеденений (как делает табле)?
Есть основная таблица (6 млн записей) и есть 2 справочника, получаем декартово произведение трех таблиц, затем естественно связываем таблицы по ключевым полям и ограничиваем выборку по нек-му критерию (индексированному полю). Так вот - на глаз никакой разницы нет, что мы выбираем из одной, что из трех таблиц. Результат не заставляет ждать и секунды (Так на IB во всяком случае)
DenK_vrtz (2004-05-31 10:57:00) [32]Если не работает select из select'a, то SELECT * FROM contract WHERE ctp_auto IN (6478102,684954,409368) можно загнать во view
:) "но это уже совсем другая история"
Andrey (2004-05-31 10:54:00) [33]
> Индексы по fund.fundid и client.clt_auto есть?
По ним есть - это первичные ключи
Andrey (2004-05-31 10:51:00) [34]
> Так тебя ж сразу спросили про индексы!!!
Ну, не заметил. Зато поговорили.
Кстати, селект из селекта все-таки не работает. Можно продолжить тему об этом.
sniknik (2004-05-31 10:50:00) [35]Vlad © (31.05.04 10:41) [18]
т.е. хочеш сказать что декартово обьеденение трех таблиц по 6млн. записей такойже по скорости как открытие одной без обьеденений (как делает табле)?
позволь не поверить
а вот если есть ограничивающеее условие в силу которого вибирается малая часть то тут будет зависеть от того что было вначале обьеденение всего или выборка и последующее обьеденение малой части.
как сработает конкретный движок, вопрос, если есть анализатор запроса пофигу что где ставить. но на всякий случай... и вообще начал бы с тестов и доков что и как в конкретном движке работает (имхо).
Sandman25+1 (2004-05-31 10:49:00) [36]Индексы по fund.fundid и client.clt_auto есть?
DenK_vrtz (2004-05-31 10:48:00) [37]Andrey (31.05.04 10:46) [20]
Так тебя ж сразу спросили про индексы!!!
Vlad (2004-05-31 10:47:00) [38]
> Andrey (31.05.04 10:46) [20]
> Ага. По ctp_auto нету индекса, видимо в этом проблема?
Естественно, индексы д.б. по всем полям, по к-рым происходит отбор.
Andrey (2004-05-31 10:46:00) [39]Ага. По ctp_auto нету индекса, видимо в этом проблема?
Andrey (2004-05-31 10:42:00) [40]
> если нигде не наврал, то так :)
>
> SELECT * FROM
> (SELECT * FROM contract WHERE ctp_auto IN (6478102,684954,409368))
> contract, client, fund
> WHERE contract.fundid=fund.fundid
> AND contract.clt_auto=client.clt_auto
Блин. По-моему, select из select-a не работает. Но сейчас еще раз проверю