SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 16.11.2009 11:26:01

insy
Участник
Зарегистрирован: 16.11.2009
Сообщений: 11

Есть ли возможность оптимизации?

Код:

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)

Неактивен

 

#2 16.11.2009 13:36:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Есть ли возможность оптимизации?

Наверняка можно wink

Для начала нужно понять, что эта штука делает, и подумать, нужно ли правда
делать так. Потом нужно понять, действительно ли нужны левые объединения.
Скорее всего, тут не нужно ни одного левого, достаточно внутренних. Потом
нужно понять, нужно ли правда считать строки, когда limit нету smile

Ну и наверняка из первого пункта («понять») будет следовать, что всё это
объединять вообще не нужно и можно обойтись двумя-тремя короткими запросами.

Неактивен

 

#3 16.11.2009 14:13:50

insy
Участник
Зарегистрирован: 16.11.2009
Сообщений: 11

Re: Есть ли возможность оптимизации?

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 используются как подстановочные справочники.
Зарпос работает но работает очень медленно.

Неактивен

 

#4 16.11.2009 14:39:06

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Есть ли возможность оптимизации?

Даже если есть LIMIT, SQL_CALC_FOUND_ROWS автоматически считает все строки,
т.е. все таблицы просматриваются целиком. Если это одноразовый запрос, то, может,
плюнуть, и пусть себе выполняется несколько секунд. Если это должно выполняться
быстро, то нужно прочитать моё предыдущее сообщение целиком, а не только про
limit smile Ну и подумать про денормализацию. В таком виде запрос, конечно, быстро
не будет работать никогда.

Неактивен

 

#5 16.11.2009 14:42:59

insy
Участник
Зарегистрирован: 16.11.2009
Сообщений: 11

Re: Есть ли возможность оптимизации?

А что конкретно надо показать? просто я писал уже

А вообще есть поля с количествами, в которые подставляются суммы(которые считаются в запросах). MAUF и GDS используются как подстановочные справочники. написал:

Привести EXPLAIN запроса?

Отредактированно insy (16.11.2009 14:44:59)

Неактивен

 

#6 16.11.2009 14:55:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Есть ли возможность оптимизации?

Ну, Вы хотите, чтобы кто-то разобрался с Вашим запросом в 50+ строк и переписал
его во внятном виде. Я предлагаю Вам это сделать самостоятельно smile

К такому запросу нужно еще час времени потратить, чтобы разобраться в структуре
данных, порыться, и потом сказать, что такой запрос никуда не годится, и нужна
денормализация, которую делать так-то и так-то. Я могу сразу сказать первую часть.
Как денормализировать — не знаю, и сходу никто не скажет, конечно же. Простые
советы, как сделать это хотя бы чуть-чуть лучше, я написал выше.

Неактивен

 

#7 16.11.2009 14:56:47

insy
Участник
Зарегистрирован: 16.11.2009
Сообщений: 11

Re: Есть ли возможность оптимизации?

Ясно, спасибо!

Неактивен

 

#8 07.12.2009 04:15:29

kiligin
Завсегдатай
Зарегистрирован: 28.11.2009
Сообщений: 48

Re: Есть ли возможность оптимизации?

ты почитай это как молитву на ночь, мож поможет))
а если честно, то }{#

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson