Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];

Вниз

оптимизировать запрос   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.111 c
2-1164978288
ddddd
2006-12-01 16:04
2006.12.24
оптимизировать запрос


2-1165154716
FIL-23
2006-12-03 17:05
2006.12.24
как отследить изменения в dbedit


15-1165259045
Dree
2006-12-04 22:04
2006.12.24
Создать программу, на которой можно было бы заработать деньги!


15-1165097429
vasIzmax
2006-12-03 01:10
2006.12.24
Стопор!


15-1164984386
grisme
2006-12-01 17:46
2006.12.24
UTF-8





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский