使用左外连接和联合优化 SQL 查询
Optimalize SQL query with left outer join and union
我的查询速度很慢,我想加快速度 - 可能吗?
SELECT
k.Date,
Levels,
Used_id,
Z_id,
D_id,
k.Client_id,
f.Product_id
FROM
(SELECT Date, Levels, Used_id, Z_id, D_id, Client_id
FROM Client_Data
GROUP BY Date, Levels, Used_id, Z_id, D_id, Client_id) k
LEFT OUTER JOIN
(SELECT Date, Client, Product
FROM Client_and_Product_Data
GROUP BY Date, Client_id, Product) f on f.Date = k.Date and f.Client = k.Client_id
union
SELECT
p.Date,
Levels,
Used_id,
Z_id,
D_id,
f.Client_id,
p.Product_id
FROM
(SELECT Date, Levels, Used_id, Z_id, D_id, Product_id
FROM Product_Data
GROUP BY Date, Levels, Used_id, Z_id, D_id, Product_id) p
LEFT outer join
(SELECT Date, Client, Product
FROM Client_and_Product_Data
GROUP BY Date, Client, Product) f on f.Date = p.Date and f.Product = p.Product_id;
Client_data
table有900万条记录,Product_data
table有30万条记录,tableClient_and_Product_Data
有25万条记录。
整个查询需要 3-4 分钟。
我在此查询中所做的事情:在 Client_and_Product_Data
table 中,我在 Client
和 Product
之间建立了联系。我想要 Client
和 Product
记录的笛卡尔积之类的东西,但我还必须有 Client
和 Product
table.[=33 的列=]
列类型:
-Date
- smalldatetime
,
-Levels
- varchar
,
-Used_id
- int
,
-Z_id
, D_id
, Client_id
, Product_id
- uniqueidentifier
.
您的查询或许可以利用索引。我会推荐:
Client_Data(Date, Levels, Used_id, Z_id, D_id, Client_id)
Client_and_Product_Data(Date, Client, Product)
Product_Data(Date, Levels, Used_id, Z_id, D_id, Product_id)
如果不需要去重,那么去掉子查询中的GROUP BY
。如果两个查询之间没有重复项,则将 UNION
更改为 UNION ALL
.
我的查询速度很慢,我想加快速度 - 可能吗?
SELECT
k.Date,
Levels,
Used_id,
Z_id,
D_id,
k.Client_id,
f.Product_id
FROM
(SELECT Date, Levels, Used_id, Z_id, D_id, Client_id
FROM Client_Data
GROUP BY Date, Levels, Used_id, Z_id, D_id, Client_id) k
LEFT OUTER JOIN
(SELECT Date, Client, Product
FROM Client_and_Product_Data
GROUP BY Date, Client_id, Product) f on f.Date = k.Date and f.Client = k.Client_id
union
SELECT
p.Date,
Levels,
Used_id,
Z_id,
D_id,
f.Client_id,
p.Product_id
FROM
(SELECT Date, Levels, Used_id, Z_id, D_id, Product_id
FROM Product_Data
GROUP BY Date, Levels, Used_id, Z_id, D_id, Product_id) p
LEFT outer join
(SELECT Date, Client, Product
FROM Client_and_Product_Data
GROUP BY Date, Client, Product) f on f.Date = p.Date and f.Product = p.Product_id;
Client_data
table有900万条记录,Product_data
table有30万条记录,tableClient_and_Product_Data
有25万条记录。
整个查询需要 3-4 分钟。
我在此查询中所做的事情:在 Client_and_Product_Data
table 中,我在 Client
和 Product
之间建立了联系。我想要 Client
和 Product
记录的笛卡尔积之类的东西,但我还必须有 Client
和 Product
table.[=33 的列=]
列类型:
-Date
- smalldatetime
,
-Levels
- varchar
,
-Used_id
- int
,
-Z_id
, D_id
, Client_id
, Product_id
- uniqueidentifier
.
您的查询或许可以利用索引。我会推荐:
Client_Data(Date, Levels, Used_id, Z_id, D_id, Client_id)
Client_and_Product_Data(Date, Client, Product)
Product_Data(Date, Levels, Used_id, Z_id, D_id, Product_id)
如果不需要去重,那么去掉子查询中的GROUP BY
。如果两个查询之间没有重复项,则将 UNION
更改为 UNION ALL
.