Задавайте вопросы, мы ответим
Вы не зашли.
SELECT SQL_CALC_FOUND_ROWS U.pk_id AS user, GDS.ft_ogrn AS ogrn, GDS.fc_short_lpu_name AS short_lpu_name, MAUF.fn_internal_subordinating_code AS lpu_code_inside_region, DC.fc_name AS dept_name, POST_CODE.fc_post AS post_medic_name, POST_CODE.fc_code AS post_medic_code, POST_SECTION_COUNTER.oms_summ AS omsx, POST_DEP_COUNTER.oms_summ as oms, POST_DEP_COUNTER.state_norm AS state_norm, TAKE_POST_DEP_COUNTER.oms_summ AS oms_summ, TAKE_POST_DEP_COUNTER.oms_summ AS specilists_cnt, POST_SECTION_COUNTER.state_norm AS rate_by_state_norm, TAKE_POST_COUNTER.oms_summ AS omsxi, TAKE_POST_COUNTER.specilists_cnt AS count_pers, TFOMS.fc_code AS tfoms_code, SKFOMS_NAMES.fc_filial_name AS filial_name, SKFOMS_CODES.fc_territory_okato_code AS filial_id FROM tusers U LEFT JOIN tmain_and_under_foundings MAUF ON MAUF.fk_user = U.pk_id LEFT JOIN tgeneral_description_section GDS ON GDS.fk_user = U.pk_id LEFT JOIN tprofile_department_section PDS ON PDS.fk_mauf = MAUF.pk_id LEFT JOIN tdic_department_codes DC ON PDS.fk_department = DC.pk_id LEFT JOIN tpost_section PS ON PS.fk_code_department = PDS.pk_id LEFT JOIN tdic_code_post POST_CODE ON PS.fk_code_medic_post = POST_CODE.pk_id LEFT JOIN ttake_post_section_tbl1 TPS1 ON TPS1.fk_department_code = PDS.pk_id AND TPS1.fk_mauf = PS.fk_mauf AND TPS1.`fk_code_medic_post` = PS.`fk_code_medic_post` LEFT JOIN ttake_post_section_tbl2 TPS2 ON TPS2.fk_tabel_number = TPS1.pk_id LEFT JOIN tconnective_lpu_users TFOMS ON TFOMS.fk_user = U.pk_id LEFT JOIN tdic_filial_skfoms_codes SKFOMS_CODES ON GDS.fk_zone_code = SKFOMS_CODES.pk_id LEFT JOIN tdic_filial_skfoms SKFOMS_NAMES ON SKFOMS_CODES.fk_dic_filial_skfoms = SKFOMS_NAMES.pk_id LEFT JOIN ( SELECT SUM(__PS.fn_oms) AS oms_summ, SUM(__PS.fn_rate_by_state_norm) AS state_norm, __PS.`pk_id` as id FROM tusers U LEFT JOIN tmain_and_under_foundings MAUF ON MAUF.fk_user = U.pk_id LEFT JOIN tgeneral_description_section GDS ON GDS.fk_user = U.pk_id LEFT JOIN tpost_section __PS ON __PS.fk_mauf = MAUF.pk_id LEFT JOIN tdic_code_post POST_CODE ON __PS.fk_code_medic_post = POST_CODE.pk_id GROUP BY __PS.fk_user, __PS.fk_mauf, __PS.fk_code_department, __PS.`fk_code_medic_post` )POST_DEP_COUNTER ON PS.pk_id = POST_DEP_COUNTER.id LEFT JOIN ( SELECT U.pk_id, _TPS1.fk_code_medic_post, _TPS2.pk_id as id, SUM(_TPS2.fn_oms) AS oms_summ, COUNT(_TPS2.pk_id) AS specilists_cnt FROM tusers U LEFT JOIN tmain_and_under_foundings MAUF ON MAUF.fk_user = U.pk_id LEFT JOIN tprofile_department_section PDS ON PDS.fk_mauf = MAUF.pk_id LEFT JOIN tpost_section __PS ON __PS.`fk_code_department` = PDS.`pk_id` LEFT JOIN ttake_post_section_tbl1 _TPS1 ON _TPS1.`fk_department_code` = PDS.pk_id AND _TPS1.fk_mauf = __PS.fk_mauf AND _TPS1.`fk_code_medic_post` = __PS.`fk_code_medic_post` LEFT JOIN ttake_post_section_tbl2 _TPS2 ON _TPS2.fk_tabel_number = _TPS1.pk_id LEFT JOIN tdic_code_post POST_CODE ON _TPS1.fk_code_medic_post = POST_CODE.pk_id GROUP BY U.pk_id ,MAUF.pk_id ,_TPS1.`fk_code_medic_post` ) TAKE_POST_DEP_COUNTER ON TPS2.pk_id = TAKE_POST_DEP_COUNTER.id LEFT JOIN ( SELECT SUM(__PS.fn_oms) AS oms_summ, SUM(__PS.fn_rate_by_state_norm) AS state_norm, __PS.fk_code_department FROM tusers U LEFT JOIN tmain_and_under_foundings MAUF ON MAUF.fk_user = U.pk_id LEFT JOIN tgeneral_description_section GDS ON GDS.fk_user = U.pk_id LEFT JOIN tpost_section __PS ON __PS.fk_mauf = MAUF.pk_id GROUP BY __PS.fk_code_department, __PS.fk_mauf ) POST_SECTION_COUNTER ON PS.fk_code_department = POST_SECTION_COUNTER.fk_code_department LEFT JOIN ( SELECT SUM(_TPS2.fn_oms) AS oms_summ, COUNT(_TPS2.pk_id) AS specilists_cnt, _TPS1.fk_department_code, U.pk_id FROM tusers U LEFT JOIN tmain_and_under_foundings MAUF ON MAUF.fk_user = U.pk_id LEFT JOIN tgeneral_description_section GDS ON GDS.fk_user = U.pk_id LEFT JOIN ttake_post_section_tbl1 _TPS1 ON _TPS1.fk_mauf = MAUF.pk_id LEFT JOIN ttake_post_section_tbl2 _TPS2 ON _TPS2.fk_tabel_number = _TPS1.pk_id WHERE not isnull(_TPS2.pk_id ) AND U.pk_id IN (198,204) GROUP BY U.pk_id, _TPS1.`fk_department_code` ) TAKE_POST_COUNTER ON PS.fk_code_department = TAKE_POST_COUNTER.fk_department_code WHERE U.pk_id IN ($lpus)
Можно ли его оптимизировать? Сейчас выполняется в 1:45с
Прошу прощения за объемность...
Отредактированно insy (16.11.2009 11:31:51)
Неактивен
Наверняка можно
Для начала нужно понять, что эта штука делает, и подумать, нужно ли правда
делать так. Потом нужно понять, действительно ли нужны левые объединения.
Скорее всего, тут не нужно ни одного левого, достаточно внутренних. Потом
нужно понять, нужно ли правда считать строки, когда limit нету
Ну и наверняка из первого пункта («понять») будет следовать, что всё это
объединять вообще не нужно и можно обойтись двумя-тремя короткими запросами.
Неактивен
LIMIT есть, он конкатинируется позже
$sql .= " GROUP BY U.pk_id, DC.pk_id, POST_CODE.pk_id ,PDS.`pk_id` ,MAUF.pk_id ORDER BY U.pk_id, MAUF.fn_internal_subordinating_code "; $sql .= "$limit";
if ((isset($_POST['is_limit'])) && (!$_POST['is_limit'])) {$limit = "";} else {$limit = "LIMIT ".(($pCnt-1)*$per_page).",$per_page";}
вот как-то так...
А вообще есть поля с количествами, в которые подставляются суммы(которые считаются в запросах).
MAUF и GDS используются как подстановочные справочники.
Зарпос работает но работает очень медленно.
Неактивен
Даже если есть LIMIT, SQL_CALC_FOUND_ROWS автоматически считает все строки,
т.е. все таблицы просматриваются целиком. Если это одноразовый запрос, то, может,
плюнуть, и пусть себе выполняется несколько секунд. Если это должно выполняться
быстро, то нужно прочитать моё предыдущее сообщение целиком, а не только про
limit Ну и подумать про денормализацию. В таком виде запрос, конечно, быстро
не будет работать никогда.
Неактивен
А что конкретно надо показать? просто я писал уже
А вообще есть поля с количествами, в которые подставляются суммы(которые считаются в запросах). MAUF и GDS используются как подстановочные справочники. написал:
Привести EXPLAIN запроса?
Отредактированно insy (16.11.2009 14:44:59)
Неактивен
Ну, Вы хотите, чтобы кто-то разобрался с Вашим запросом в 50+ строк и переписал
его во внятном виде. Я предлагаю Вам это сделать самостоятельно
К такому запросу нужно еще час времени потратить, чтобы разобраться в структуре
данных, порыться, и потом сказать, что такой запрос никуда не годится, и нужна
денормализация, которую делать так-то и так-то. Я могу сразу сказать первую часть.
Как денормализировать — не знаю, и сходу никто не скажет, конечно же. Простые
советы, как сделать это хотя бы чуть-чуть лучше, я написал выше.
Неактивен
Ясно, спасибо!
Неактивен
ты почитай это как молитву на ночь, мож поможет))
а если честно, то }{#
Неактивен