2012-09-20 1 views
0

두 개의 테이블 item 및 items_sellers가 있으며 각 항목은 둘 이상의 판매자에서 사용할 수 있습니다.메모리 부족 및 Mysql 쿼리의 시간 초과 Join 및 Union All 문이 있음

여기서 ItemId, sellerId의 매핑을 다른 방법으로 얻습니다. 이제 모든 항목에 대한 세부 정보가 필요합니다. 적어도 5000 개의 key (sellerId) 값 (itemId) 쌍을 얻습니다.이 두 테이블에서 세부 정보를 가져와야하는이 맵을 사용합니다. 4000 UNION ALL 문하지만 5000 메모리 예외 밖으로 즉, 예외를/쿼리 시간을 오류를 제공 -

SELECT 
    table1.column1, 
    table1.column2, 
    table1.column3, 
    table2.column1, 
    table2.column2 
FROM 
    item as table1 
     INNER JOIN ( 
      select 
       key1 as ITEMID, 
       value1 as SELLERID 
      UNION ALL 
      select 
       key2, 
       value2 
      UNION ALL 
      select 
       key3 , 
       value3 
      UNION ALL 
      select 
       key4 , 
       value4 
      UNION ALL 
      // ....5000 key value 
      pairs 
      ) as KEY_VALUE 
      ON table1.item_id = KEY_VALUE.ITEMID 
     INNER JOIN 
      item_sellers as table2 
      ON table1.item_id = table2.item_id 
      AND table2.seller_id = KEY_VALUE.SELLERID 
WHERE table1.active = 1 

이 쿼리가 3000에 완벽하게 확실히 실행 :

내가 쿼리 아래 사용 여기에 결과를 얻으려면 키값 쌍, 즉 5000+ UNION ALL 문.

이 쿼리에 문제가 있습니까? 그렇다면 약간의 빛을 비추어주십시오.

이 쿼리를 최적화하는 방법이 있습니까?

추 신 :이 쿼리에 5000 개의 키 값 쌍을 모두 넣으면 쿼리 문자는 209950 자가됩니까? 검색어에 글자 수 제한이 있습니까?

+0

이 쿼리의 목적은 무엇입니까? 그것은 매우 나쁘고 재 작성되어야하지만 처음부터 무엇을해야하는지 모른다. – S3Mi

+0

상품 및 판매자 정보가 필요합니다. 상품 ID 및 판매자 ID와 그 매핑, 즉 키 값 쌍지도의 묶음이 전부입니다. 쿼리를 다시 작성하는 방법을 제안 해 주시겠습니까? – Ranjith

답변

0

하위 쿼리에 from 절이 누락되었습니다.

select 
    key1 as ITEMID, 
    value1 as SELLERID 
UNION ALL 
select 
    key2, 
    value2 
UNION ALL 
// and so on... 

어떻게 작동합니까? 데이터베이스가 (놀랍게도) 과거를 지나가고 데이터 세트에서 단순히 데카르트를 수행하는 것처럼 보입니다. 이로 인해 메모리가 대처할 수없는 상황에 이르게합니다.

select 
    key1 as ITEMID, 
    value1 as SELLERID 
from 
    yourTableName 
UNION ALL 
select 
    key2, 
    value2 
from 
    yourTableName 
Union all // etc etc 

, 왜 당신이 필요로하는 행을 얻을 수있는 곳에 절을 포함하는 하위 쿼리에 가입하지 않는 것이 말해 두 겠는데 - 또는 그들 사이에 조회 테이블을 사용

당신이 시도해야합니까?

+0

답장을 보내 주셔서 감사합니다. 그러나 key1, value1 및 key2, value2를 다른 테이블에서 가져 오지 않았습니다.이 쿼리를 실행하기 전에 다른 비즈니스 로직에서 가져옵니다. 따라서 매핑을 맵에 포함하게 될 것입니다. union을 제외한 union의 모든 쿼리. – Ranjith

+0

@ Ranjith 내가 당신의 전략에 부합한다고 생각하는 답변을 게시했지만 귀하가 참조하는 비즈니스 로직이 일부 데이터베이스에서 데이터를 가져온 것으로 생각됩니다. 그렇다면 왜 비즈니스 로직을 SQL로 전송하지 않는가? –

0

임시 테이블을 만들어서 삽입하십시오.

create temporary table mytable (itemid integer, sellerid integer); 
insert into mytable (itemid, sellerid) values 
(1,2),(2,10) 
; 
SELECT 
    table1.column1, 
    table1.column2, 
    table1.column3, 
    table2.column1, 
    table2.column2 
FROM 
    item as table1 
     INNER JOIN mytable as KEY_VALUE 
      ON table1.item_id = KEY_VALUE.ITEMID 
     INNER JOIN 
      item_sellers as table2 
      ON table1.item_id = table2.item_id 
      AND table2.seller_id = KEY_VALUE.SELLERID 
WHERE table1.active = 1 
; 
drop table mytable; 

SQL 문자열 길이는 훨씬 더 작습니다. 끝내 버려.