2013-06-12 3 views
0

쿼리를 최적화하고 있습니다. 두 노조는 모두 분리 실행을 실행했지만 내부 조인을 포함하는 즉시 최대 57 초가 걸린다. 어떻게 해결할 수 있습니까? 내 쿼리는 유니온 왼쪽 조인과 내부 조인을 사용하여 쿼리를 최적화합니다.

SELECT 
    p.PROJID, 
    p.StartDate, 
    o.ORDERNO, 
    p.PROJCODE, 
    p.PROJECT, 
    cat.type AS CATEGORY, 
    p.AREA, 
    p.STATE, 
    p.COUNTRY, 
    p.VALUE, 
    p.PROCESSOR, 
    p.PROJINFO, 
    p.NES, 
    p.SPECSALE, 
    p.OFFICE, 
    p.DEPTCODE, 
    p.INTERNLCHG, 
    p.INTERCOCHG, 
    p.LORM, 
    p.PERCENT, 
    d.COMPANY, 
    CONCAT(
     d.LASTNAME, 
     ", ", 
     d.FIRSTNAME 
    ) AS Contact 
FROM 
    (
     (
      SELECT 
       * 
      FROM 
       (
        SELECT 
         `clients`.`CLIENTID` AS `CLIENTIDA`, 
         `clients`.`COMPANY` AS `COMPANY` 
        FROM 
         `hdb`.`clients` 
        UNION 
         SELECT 
          `accounts`.`id` AS `CLIENTIDA`, 
          `accounts`.`name` AS `COMPANY` 
         FROM 
          `sugarcrm`.`accounts` 
       ) AS a 
      INNER JOIN (
       SELECT 
        `hdb`.`contacts`.`CONTACTID` AS `CONTACTID`, 
        `hdb`.`contacts`.`CLIENTID` AS `CLIENTIDC`, 
        `hdb`.`contacts`.`FIRSTNAME` AS `FIRSTNAME`, 
        `hdb`.`contacts`.`LASTNAME` AS `LASTNAME` 
       FROM 
        `hdb`.`contacts` 
       UNION 
        SELECT 
         `sugarcrm`.`contacts`.`id` AS `CONTACTID`, 
         `sugarcrm`.`accounts_contacts`.`account_id` AS `CLIENTIDC`, 
         `sugarcrm`.`contacts`.`first_name` AS `FIRSTNAME`, 
         `sugarcrm`.`contacts`.`last_name` AS `LASTNAME` 
        FROM 
         `sugarcrm`.`contacts` 
        LEFT JOIN `sugarcrm`.`accounts_contacts` ON `sugarcrm`.`contacts`.`id` = `sugarcrm`.`accounts_contacts`.`contact_id` 
      ) AS c ON a.CLIENTIDA = c.CLIENTIDC 
     ) AS d 
    ) 
INNER JOIN (
    (
     projects AS p 
     INNER JOIN orders AS o ON p.ORDERNO = o.ORDERNO 
    ) 
    INNER JOIN category AS cat ON p.category_id = cat.category_id 
) ON d.CONTACTID = o.CONTACTID 

이에 설명

다음 제공하는 다음과 같습니다

1, PRIMARY, cat, ALL, PRIMARY, , , , 10, 
1, PRIMARY, p, ref, FK_orders_projects,FK_category_projects_idx, FK_category_projects_idx, 5, hdb.cat.category_id, 400, Using where 
1, PRIMARY, o, eq_ref, PRIMARY, PRIMARY, 4, hdb.p.ORDERNO, 1, 
1, PRIMARY, <derived2>, ALL, , , , , 18878, Using where 
2, DERIVED, <derived3>, ALL, , , , , 7087, 
2, DERIVED, <derived5>, ALL, , , , , 18879, Using where 
5, DERIVED, contacts, ALL, , , , , 8261, 
6, UNION, contacts, ALL, , , , , 10251, 
6, UNION, accounts_contacts, ref, idx_contid_del_accid, idx_contid_del_accid, 111, sugarcrm.contacts.id, 1, Using index 
, UNION RESULT, <union5,6>, ALL, , , , , , 
3, DERIVED, clients, ALL, , , , , 2296, 
4, UNION, accounts, ALL, , , , , 4548, 
, UNION RESULT, <union3,4>, ALL, , , , , , 

결합하지 않고 원래의 쿼리는 0.125 초

SELECT p.PROJID, p.StartDate, o.ORDERNO, p.PROJCODE, p.PROJECT, cat.type AS CATEGORY, p.AREA, p.STATE, p.COUNTRY, 
p.VALUE, p.PROCESSOR, p.PROJINFO, p.NES, p.SPECSALE, p.OFFICE, p.DEPTCODE, p.INTERNLCHG, p.INTERCOCHG, p.LORM, 
p.PERCENT, a.COMPANY, CONCAT(c.LASTNAME, ", ", c.FIRSTNAME) AS Contact 
FROM (clients AS a 
INNER JOIN contacts AS c ON a.CLIENTID =c.CLIENTID) 
INNER JOIN ((projects AS p INNER JOIN orders AS o ON p.ORDERNO = o.ORDERNO) 
INNER JOIN category AS cat ON p.category_id = cat.category_id) ON c.CONTACTID = o.CONTACTID 
ORDER BY p.PROJID, a.COMPANY; 

이에 설명

소요 다음 제공 :

1, SIMPLE, cat, ALL, PRIMARY, , , , 10, Using temporary; Using filesort 
1, SIMPLE, p, ref, FK_orders_projects,FK_category_projects_idx, FK_category_projects_idx, 5, hdb.cat.category_id, 400, Using where 
1, SIMPLE, o, eq_ref, PRIMARY,FK_contacts_orders, PRIMARY, 4, hdb.p.ORDERNO, 1, 
1, SIMPLE, c, eq_ref, PRIMARY,FK_clients_contacts, PRIMARY, 52, hdb.o.CONTACTID, 1, 
1, SIMPLE, a, eq_ref, PRIMARY, PRIMARY, 52, hdb.c.CLIENTID, 1, 

조회시 조회 :

SELECT 
    p.PROJID, 
    p.StartDate, 
    o.ORDERNO, 
    p.PROJCODE, 
    p.PROJECT, 
    cat.type AS CATEGORY, 
    p.AREA, 
    p.STATE, 
    p.COUNTRY, 
    p.VALUE, 
    p.PROCESSOR, 
    p.PROJINFO, 
    p.NES, 
    p.SPECSALE, 
    p.OFFICE, 
    p.DEPTCODE, 
    p.INTERNLCHG, 
    p.INTERCOCHG, 
    p.LORM, 
    p.PERCENT, 
    a.COMPANY, 
    CONCAT(
     c.LASTNAME, 
     ", ", 
     c.FIRSTNAME 
    ) AS Contact 
FROM 
    (
     view_accounts_sugar_hdb AS a 
     INNER JOIN view_contacts_sugar_hdb AS c ON a.CLIENTID = c.CLIENTID 
    ) 
INNER JOIN (
    (
     projects AS p 
     INNER JOIN orders AS o ON p.ORDERNO = o.ORDERNO 
    ) 
    INNER JOIN category AS cat ON p.category_id = cat.category_id 
) ON c.CONTACTID = o.CONTACTID 
ORDER BY 
    p.PROJID, 
    a.COMPANY; 

이것은 340 초가 걸립니다.

답변

1

이 사람은 내가 당신을 도왔던 마지막 사람보다 분명히 못 생겼습니다.) ... 어쨌든, 같은 원칙이 적용됩니다. 앞으로 내가하고있는 일을 이해하려고 노력하십시오. JOIN 관계를 먼저 작성하여 데이터의 출처를 확인하십시오. 또한, 내 들여 쓰기를 살펴 보겠습니다. 각 수준에서 가독성을 보여주고 있습니다. 다음

Orders -> Projects -> Categories... 

,

슈가 CRM 연락처에 마지막으로
Orders -> Contacts -> Clients 

을 통해 일반 고객 테이블에있는 사람들을 위해 경로 ... 그래서

Orders -> Accounts_Contacts -> Accounts 

, 지금은 관계가 설정했는지 (그리고 앨리어스), 이것은 LEFT-JOIN을 일반 연락처/클라이언트 대 CRM 연락처/계정에 구현 한 마지막 응답과 유사합니다.

필드 목록은 Order, Products 및 Category 테이블에서 상당히 단순하므로 필드 목록이 간단합니다. 즉, LEFT-가입이 들어오는 단지 "/ 클라이언트"정보를 남긴다. 보통 클라이언트가 null의 경우, 그렇지 않으면 정상적인 클라이언트 필드를 사용하여 CRM 버전 필드를 사용 ...

SELECT 
     P.PROJID, 
     P.StartDate, 
     O.ORDERNO, 
     P.PROJCODE, 
     P.PROJECT, 
     cat.`type` AS CATEGORY, 
     P.AREA, 
     P.STATE, 
     P.COUNTRY, 
     P.VALUE, 
     P.PROCESSOR, 
     P.PROJINFO, 
     P.NES, 
     P.SPECSALE, 
     P.OFFICE, 
     P.DEPTCODE, 
     P.INTERNLCHG, 
     P.INTERCOCHG, 
     P.LORM, 
     P.PERCENT, 
     CASE when HCLIENT.ClientID IS NULL 
      then SCLIENT.`name` 
      ELSE HCLIENT.Company end as Company, 
     CASE when HCLIENT.ClientID IS NULL 
      then CONCAT(SCT.LAST_NAME, ", ", SCT.FIRST_NAME) 
      ELSE CONCAT(HCT.LASTNAME, ", ", HCT.FIRSTNAME) end as Contact 
    FROM 
     orders O 
     JOIN projects P 
      ON O.OrderNo = P.OrderNo 
      JOIN category AS cat 
       ON p.category_id = cat.category_id 

     LEFT JOIN hdb.contacts HCT 
      ON O.ContactID = HCT.ContactID 
      LEFT JOIN hdb.clients HCLIENT 
       ON HCT.ClientID = HCLIENT.ClientID 

     LEFT JOIN sugarcrm.contacts SCT 
      ON O.ContactID = SCT.ID 
      LEFT JOIN sugarcrm.accounts_contacts SAC 
       ON SCT.ID = SAC.contact_id 
       LEFT JOIN sugarcrm.accounts SCLIENT 
        ON SCT.account_id = SCLIENT.ID 

내가 좋겠 성능 향상에도 관심이 있어야합니다.

+0

'오류 코드 : 1054.'on clause '에'p.category_id '알 수 없음 열이 있습니다. – shorif2000

+0

성능은 0.686 초입니다. 내 원래 쿼리에서 – shorif2000

+0

내가 가지고있는 노동 조합, 나는 그들 중보기를 만들었습니다 가능한 이러한 쿼리에서보기를 사용합니까?. 내 질문에 포함시킬 것입니다 – shorif2000

관련 문제