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 10:41:00) [41]

sniknik ©   (31.05.04 10:34) [14]


> запрос с обьеденением трех таблиц всегда медленнее чем выборка
> из одной (случай с TTable), поборотся за скорость конечно
> можно но это другая песня.

Как показали тесты на IB, при ~6 млн записях практически не заметно, три таблицы там объединяются или одна. Если есть необходимые индексы, то запрос срабатывает пулей.
Но как только в запрос добавляешь OR или IN, это серьезно сказывается на быстродействии.


DenK_vrtz   (2004-05-31 10:39:00) [42]

если нигде не наврал, то так :)

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


Andrey   (2004-05-31 10:38:00) [43]


> не надо вводить в заблуждение (это мягко говоря)
> вот это
> select * from contract,client,fund
> ....
> TTable не откроет ни через пару секунд ни вообще, запрос
> с обьеденением трех таблиц всегда медленнее чем выборка
> из одной (случай с TTable), поборотся за скорость конечно
> можно но это другая песня.

Ну это понятно. Без запроса не обойтись. В TTable я делал lookup-поля, но все равно потом нужен будет другой запрос (во время выполнения исходный запрос изменяется)


Andrey   (2004-05-31 10:34:00) [44]

"СТОП.
Так результирующий курсор будет иметь ограничения по 3-м условиям?
исходя из - (contract.ctp_auto=6478102 or contract.ctp_auto=684954 or contract.ctp_auto=409368)

Если так, то сначала ограничь набор contract, а потом сделай объединение с client,fund."

А ты примерчик не мог бы привести?


sniknik   (2004-05-31 10:34:00) [45]

не надо вводить в заблуждение (это мягко говоря)
вот это
select * from contract,client,fund
....
TTable не откроет ни через пару секунд ни вообще, запрос с обьеденением трех таблиц всегда медленнее чем выборка из одной (случай с TTable), поборотся за скорость конечно можно но это другая песня.
к примеру я бы (хотя я не работаю с MySQL) поставил бы условия с явным сравнением на первое место, на случай если MySQL выполняет условия поочередно, а обьеденение потом.


Andrey   (2004-05-31 10:32:00) [46]

Еще особенность: в таблице contract примерно 15 полей, в таблице client около 30. Нужны в запросе почти все


DenK_vrtz   (2004-05-31 10:32:00) [47]

СТОП.
Так результирующий курсор будет иметь ограничения по 3-м условиям?
исходя из - (contract.ctp_auto=6478102 or contract.ctp_auto=684954 or contract.ctp_auto=409368)

Если так, то сначала ограничь набор contract, а потом сделай объединение с client,fund.


Vlad   (2004-05-31 10:32:00) [48]


> Andrey   (31.05.04 10:29) [10]

Я же сказал, попробуй оставить только одно значение contract.ctp_auto = 6478102 без всяких OR или IN (что одно и тоже)


Andrey   (2004-05-31 10:29:00) [49]

Индексы есть по всем полям.

Запрос модифицировал:

select * from contract,client,fund
where contract.fundid=fund.fundid and contract.clt_auto=client.clt_auto
and (contract.ctp_auto IN (6478102,684954,409368));

Тормозит все равно.

А когда в Table ставлю Filter=ctp_auto=6478102 or и т.д. , нормально работает!


DenK_vrtz   (2004-05-31 10:27:00) [50]

при выборе поля всех трех таблиц нужны (SELECT * ...)?


Sergey13   (2004-05-31 10:25:00) [51]

2Andrey   (31.05.04 10:17) [4]
Индексы есть?


Vlad   (2004-05-31 10:23:00) [52]


> Andrey   (31.05.04 10:17) [4]

Индексы по всем полям cвязки есть ?
и еще, возможно or тормозит запрос, попробуй оставить только contract.ctp_auto=6478102, остальное убрать (ради эксперимента)


Andrey   (2004-05-31 10:21:00) [53]

Ну так что, есть какие-то варианты?


Полный дурак   (2004-05-31 10:17:00) [54]


> Написано же в заголовке: D6, MySQL. Версию MySQL не знаю,
> но одна из последних


Это что, - запрос что-ли?


Andrey   (2004-05-31 10:17:00) [55]

select * from contract,client,fund
where contract.fundid=fund.fundid and contract.clt_auto=client.clt_auto
and (contract.ctp_auto=6478102 or contract.ctp_auto=684954 or contract.ctp_auto=409368)


Andrey   (2004-05-31 10:17:00) [56]

Написано же в заголовке: D6, MySQL. Версию MySQL не знаю, но одна из последних


Vlad   (2004-05-31 10:16:00) [57]


> Andrey   (31.05.04 10:13)  

Приведи запрос


mutabor   (2004-05-31 10:15:00) [58]

база какая?


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

Наверх

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