Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оптимизация запроса [D6, MySQL]


Страницы:   1 2 3

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 не работает. Но сейчас еще раз проверю


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо