![]() |
|
Задавайте вопросы, мы ответим
Вы не зашли.
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+ строк и переписал
его во внятном виде. Я предлагаю Вам это сделать самостоятельно ![]()
К такому запросу нужно еще час времени потратить, чтобы разобраться в структуре
данных, порыться, и потом сказать, что такой запрос никуда не годится, и нужна
денормализация, которую делать так-то и так-то. Я могу сразу сказать первую часть.
Как денормализировать — не знаю, и сходу никто не скажет, конечно же. Простые
советы, как сделать это хотя бы чуть-чуть лучше, я написал выше.
Неактивен
Ясно, спасибо!
Неактивен
ты почитай это как молитву на ночь, мож поможет))
а если честно, то }{#
Неактивен