Улучшить запрос, удалив субвыборы? - PullRequest
0 голосов
/ 08 ноября 2011

Мы используем таблицу журналов для экстраполяции довольно большого количества информации в нашем приложении.Я устал от того, сколько времени ORM потребовалось для выполнения запросов и количества запросов, которые потребовалось ORM для выполнения своей задачи.Однако, потратив некоторое время, пытаясь написать TSQL самостоятельно, я действительно не улучшил его настолько, чтобы захотеть поменять его?Могу ли я получить несколько предложений о том, как улучшить этот запрос.Спасибо.

Использование MSSQL 2005.

Запрос:

select
    [Priority] = 
    case 
        when t0.jm_priority = 0 then 'Normal'
        when t0.jm_priority = 1 then 'High'
        when t0.jm_priority = 2 then 'Urgent'
    end,

    t0.JM_Label as [Job Name],
    t1.jt_name as [Job Type],

    (select top(1) x0.JL_Created from pub_joblog as x0
        where x0.js_jobstatusid = 1 and x0.jm_jobmasterid = t0.jm_jobmasterid
        order by jl_created asc) as [Received Date],

    t0.jm_duedate as [Job Due Date],
    t0.jm_cabduedate as [Job CRB Due Date],
    t3.displayname as [Job Host Site],

    (select top(1) x1.username from pub_joblog as x0
        inner join netinfo_users as x1 on x1.userid = x0.netinfo_userid
        where x0.js_jobstatusid = 1 and x0.jm_jobmasterid = t0.jm_jobmasterid
        order by jl_created asc) as [Author],

    t4.username as [Tech Writer],

    (select top(1) x1.JS_Description from pub_joblog as x0
        inner join pub_jobstatus as x1 on x1.js_jobstatusid = x0.js_jobstatusid
        where x0.jm_jobmasterid = t0.jm_jobmasterid
        order by jl_created desc) as [Job Status],

    (select top(1) x0.JL_Created from pub_joblog as x0
        where x0.js_jobstatusid = 9 and x0.jm_jobmasterid = t0.jm_jobmasterid
        order by jl_created desc) as [Completed Date],

    (select top(1) x0.JL_Created from pub_joblog as x0
        where x0.jm_jobmasterid = t0.jm_jobmasterid
        order by jl_created desc) as [Last Modified],

    (select top(1) x0.jl_notes from pub_joblog as x0
        where x0.jm_jobmasterid = t0.jm_jobmasterid
        order by jl_created desc) as [Last Job Comment] 

from  pub_jobmaster as t0
    inner join pub_jobtype as t1 on t1.jt_jobtypeid = t0.jt_jobtypeid
    left outer join pub_jobsitemap as t2 on t2.jm_jobmasterid = t0.jm_jobmasterid
    left outer join net_ou as t3 on t3.net_ouid = t2.net_ouid
    left outer join netinfo_users as t4 on t4.userid = t0.nu_techwriterid
where  (select top(1) z0.js_jobstatusid
            from pub_joblog as z0 
            where z0.jm_jobmasterid = t0.jm_jobmasterid
            order by z0.jl_created desc) <> 9 AND (select top(1) z0.js_jobstatusid
            from pub_joblog as z0 
            where z0.jm_jobmasterid = t0.jm_jobmasterid
            order by z0.jl_created desc) <> 16 
order by t0.jm_duedate

Не совсем точно, как / где опубликовать план выполнения, поэтому я просто загрузил его на jsfiddle.net: http://jsfiddle.net/my52z/

Возможно, не по назначению, но это работает.

1 Ответ

0 голосов
/ 08 ноября 2011

Я предлагаю вам также опубликовать свою таблицу и структуру индекса. Просто от просмотра кода на структуру может повлиять больше производительность, чем интенсивное использование объединений. Вот несколько рекомендаций:

  1. Поместите индекс в столбцы, используемые в предложениях WHERE, которые не являются ключами (PRIMARY / FOREIGN). Те, кто включен в ON, должны быть ИНОСТРАННЫМИ КЛЮЧАМИ!
  2. Преобразуйте запрос в VIEW или хранимую процедуру: он получит выгоду от сохраненного плана запроса.
  3. Если вы читаете чаще, чем записываете в таблицу, денормализация структуры повысит производительность. То есть вместо того, чтобы хранить вещи в разных таблицах и связывать их посредством соединений через внешние ключи во время запроса, вы бы предпочли иметь одну широкую таблицу со всеми столбцами в ней. Вы используете справочные таблицы, чтобы просто обеспечить целостность при вставке. В конце концов, записи «журнала» не должны обновляться после записи.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...