![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация запроса [D6, MySQL]
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]база какая?