## MySQL 서버 5.5, 데이터베이스 엔진 MYISAM, 테이블 fact_transaction가 date_key, time_key, unit_cost_price, time_key을 제외 fact_stockout_sales에 대한 unit_retail_price (조합 키)와 같은에 색인이 생성됩니다. ##선택 쿼리 최적화 거대한 데이터
쿼리
SELECT
t.Level, t.Name, t.KeyValue,
ROUND((SUM(t.Gross)/SUM(t.Revenue))*100, 2) AS Value,
ROUND((SUM(t.adjustedGross)/SUM(t.adjustedRevenue))*100, 2) AS adjustedValue,
t.dataType AS dataType
FROM
(SELECT "item" AS Level, ds.product_name AS Name, ds.product_id AS KeyValue,
SUM(ft.gross_profit) AS Gross,
SUM(ft.selling_amount) AS Revenue,
SUM(ft.adjusted_gross_profit) AS adjustedGross,
SUM(ft.adjusted_selling_amount) AS adjustedRevenue,
"%" AS dataType
FROM fact_transaction AS ft
JOIN dim_sku AS ds ON ft.sku_key = ds.sku_key
WHERE ft.date_key BETWEEN 20080215 AND 20130107
AND ft.time_key BETWEEN 100 AND 235900
AND ft.unit_cost_price BETWEEN 0 AND 1333
AND ft.unit_retail_price BETWEEN 0 AND 16500
AND ft.store_key IN ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16")
AND ds.product_id IN (1312009,1312007,... Huge List say 30000)
AND ds.category IN ("Male","Female","Unisex")
AND ft.day_of_week IN ("1","2","3","4","5","6","7")
AND ds.collection_name IN ("Base","SS12","AW12")
GROUP BY ds.product_id
UNION
SELECT "item" AS Level, ds.product_name AS Name, ds.product_id AS KeyValue,
SUM(ft.gross_profit) AS Gross,
SUM(ft.selling_amount) AS Revenue,
SUM(ft.adjusted_gross_profit) AS adjustedGross,
SUM(ft.adjusted_selling_amount) AS adjustedRevenue,
"%" AS dataType
FROM fact_stockout_sales AS ft
JOIN dim_sku AS ds ON ft.sku_key = ds.sku_key
WHERE ft.date_key BETWEEN 20080215 AND 20130107
AND ft.unit_cost_price BETWEEN 0 AND 1333
AND ft.unit_retail_price BETWEEN 0 AND 16500
AND ft.store_key IN ("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16")
AND ds.product_id IN (1312009,1312007,.. Huge List say 30000)
AND ds.category IN ("Male","Female","Unisex")
AND ft.day_of_week IN ("1","2","3","4","5","6","7")
AND ds.collection_name IN ("Base","SS12","AW12")
GROUP BY ds.product_id) AS t
GROUP BY t.KeyValue
왜 UNION을 사용하여 두 개의 ** 동일 ** 쿼리를 결합합니까? 이것은 느려야합니다. 동일한 질의가 두 번 실행되면 UNION은 두 개의 동일한 결과 집합을 결합하여 중복을 제거합니다. – krokodilko
@kordirko : 그들은 동일하지 않습니다. 그들은 두 개의 다른 테이블에서 선택하고, 두 번째는 WHERE 절에서 ft.time_key를 생략합니다. –
Righ, 그들은 동일하지 않습니다. 하지만 두 하위 쿼리 모두 동일한 테이블'dim_sku'에 대한 조인을 포함하므로'dim_sk' 스캔을 피하기 위해 "join factorization"을 사용하여이 쿼리를 변환하려고 시도 할 수 있습니다.이 링크는이 변환이 어떻게 작동하는지 설명합니다. http://docs.oracle. com/cd/E16655_01/server.121/e15858/tgsql_transform.htm # BABHGGEG – krokodilko