使用左外连接和联合优化 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_datatable有900万条记录,Product_datatable有30万条记录,tableClient_and_Product_Data有25万条记录。

整个查询需要 3-4 分钟。

我在此查询中所做的事情:在 Client_and_Product_Data table 中,我在 ClientProduct 之间建立了联系。我想要 ClientProduct 记录的笛卡尔积之类的东西,但我还必须有 ClientProduct 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.