Текущий архив: 2006.12.24;
Скачать: CL | DM;
Вниз
оптимизировать запрос Найти похожие ветки
← →
ddddd © (2006-12-01 16:04) [0]Здраствуйте. Помогите оптимизировать запрос. У меня он выполняется за минуту, а если делать FeatchAll, тогда надо ждать минут 5.
select m.id, m.fio from mainkop m join diagnos dia on m.id=dia.id where (m.id is not null ) and (dia.mkb is not null and (m.dateout is null or (m.dateout is not null and m.dateout between "01.01.06 " and "30.11.06 ") and dia.data>=m.dataopen and idd in (select max(d.idd) from diagnos d group by id))
Уверен, что это не такой сложный запрос, чтобы его так долго ждать.
← →
Сергей М. © (2006-12-01 16:08) [1]О какой оптимизации может идти речь, если инф-ции о структуре БД в вопросе кот наплакал ?)
← →
Desdechado © (2006-12-01 17:38) [2]
(m.id is not null ) and (dia.mkb is not null and (m.dateout is null or (m.dateout is not null
такого вида условия не используют индексовm.dateout is not null and m.dateout between "01.01.06 " and "30.11.06 "
одно из условий лишнееidd in (select max(d.idd) from diagnos d group by id))
СУБД не указана. Для IB это, например, вызывает выполнение поздапроса для каждой отобранной строки основного запроса.
← →
ddddd © (2006-12-02 11:03) [3]
> Сергей М. © (01.12.06 16:08) [1]
Структура.
Таблица Mainkop
ID integer
FIO Varchar 250 ...
DataOpen Date
DateOut Date
Первичный ключ по полю ID
Таблица Diagnos
IDD Integer
ID Integer
data date
MKB varchar 100...
Первичный ключ по полю IDD
Внешний ключ - поле ID на поле ID первой таблицы
> idd in (select max(d.idd) from diagnos d group by id))
> СУБД не указана. Для IB это, например, вызывает выполнение
> поздапроса для каждой отобранной строки основного запроса.
>
СУБД - FB 1.5
В принципе я и предполагал, что основной тормоз в данном подзапросе, как то можно этого подзапроса избежать.
Поясню.
Главная таблица MainKop. Таблица diagnos связана с ней по внешнему ключу, т.е. для каждой записи в первой таблице соответствует несколько записей второй таблицы. Вот из этих записей нужно вытащить последнюю.
← →
Loginov Dmitry © (2006-12-02 12:16) [4]> and idd in (select max(d.idd) from diagnos d group by id)
> )
Не знаю, прокатит в FB али нет, но попробуй запрос
select max(d.idd) from diagnos d group by id
сохранить в текстовом файле, например temp_diagnoz.sql
и положить этот файл в один каталог с базой данных
← →
Loginov Dmitry © (2006-12-02 12:17) [5]Далее в основном запросе делай:
select m.id, m.fio from .... "temp_diagnoz.sql" diag_tab
.......
and idd in diag_tab.1
Но врядли это в FB сработает. Это работает в BDE для табличек Парадокса.
Еще можно предварительно до выполнения запроса создать временно табличку в самой базе данных.
← →
DrPass © (2006-12-02 12:42) [6]
> В принципе я и предполагал, что основной тормоз в данном
> подзапросе, как то можно этого подзапроса избежать.
Правильно думаешь. FB очень не любит подзапросов. Сделай хранимую процедуру, где сохраняй результат подзапроса во временную таблицу и цепляй ее через join
← →
Desdechado © (2006-12-02 21:58) [7]Если бы ты в подзапрос хотя бы where вставил вместо group, все было бы быстрее
← →
jack128 © (2006-12-02 23:19) [8]для начала ты реальный запрос написал бы. А то в этом кол-во открывающихся скобок не соответствует закрывающимся..
Loginov Dmitry © (02.12.06 12:17) [5]
Это ты типа пытаешся угадать правельный ответ??
← →
jack128 © (2006-12-02 23:27) [9]ddddd © (01.12.06 16:04)
and idd in (select max
алиас проставь для поля.
ddddd © (01.12.06 16:04)
(m.id is not null )
если id - PK, то нафиг это?
← →
Loginov Dmitry © (2006-12-03 08:30) [10]> Это ты типа пытаешся угадать правельный ответ??
Точно!!
← →
Sergey13 © (2006-12-04 08:30) [11]> idd in (select max(d.idd) from diagnos d group by id)
idd = (select max(d.idd) from diagnos d group by id)
Max всегда вернет 1 значение.
← →
Anatoly Podgoretsky © (2006-12-04 08:50) [12]Если ИД честный, то это вернет ВСЕ записи.
Страницы: 1 вся ветка
Текущий архив: 2006.12.24;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.033 c