Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用左外部联接和并集优化SQL查询_Sql_Sql Server_Tsql_Left Join_Union - Fatal编程技术网

使用左外部联接和并集优化SQL查询

使用左外部联接和并集优化SQL查询,sql,sql-server,tsql,left-join,union,Sql,Sql Server,Tsql,Left Join,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

我有相当慢的查询,我想让它更快-有可能吗

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\u data
表中有900万条记录,
Product\u data
表中有300k条记录,
Client\u和\u Product\u data
表中有250k条记录

整个查询需要3-4分钟

我在这个查询中所做的:在
Client\u和
表中,我在
Client
Product
之间有连接。我希望有类似于
Client
product
记录的笛卡尔积,但我还必须有
Client
product
表中的列

列的类型:
-
Date
-
smalldatetime

-
Levels
-
varchar

-
Used\u id
-
int


-
Z_id
D_id
Client_id
Product_id
-
uniqueidentifier
,您查询时可能会利用索引。我建议:

  • 客户数据(日期、级别、使用的id、Z id、D id、客户id)
  • 客户和产品数据(日期、客户、产品)
  • 产品数据(日期、级别、已用id、Z id、D id、产品id)

如果不需要消除重复项,则删除子查询中的
groupby
s。如果两个查询之间没有重复项,则将
UNION
更改为
UNION ALL

您没有在
select
子句中使用任何
aggregate
函数。那么,
分组的目的是什么?你有什么作为索引?@bisounours\u tronconneuse-我不明白你的问题(可能是因为我没有使用任何索引)@vkp-我认为,当我减少子查询中可能的重复项(它们可能是重复项)时,我将有更少的行要做
左外连接
@Monic那么您的表有索引和主键(某些collumn被索引,并且关于这些列的检索会更快),无论您是否意识到这一点。要知道如何进行快速查询,您需要知道哪些列被索引。谢谢您的回答,我会尝试的。但我还有另外一个问题:如果我想让字符串由7个选定的列(如上面所示)和连接的列组成,那么这有没有更快的方法呢?@Monic。我不知道你所说的“连接列”是什么意思。
where
on
子句中的字符串串联往往会阻止某些优化,因此更有可能减慢查询速度。也许你应该问另一个问题。对不起,我的英语不好。也许我不够清楚。我使用这个查询来获取所有7列,然后像这样执行字符串(或varchar):col1+'|'+col2+'|'。。。。所以我想知道,当我使用这种连接时,它是否也会很快(当然,在int或uniqueidentifier的情况下,我必须执行
convert
函数)。但是,是的,也许你是对的,我应该问另一个问题,因为这是另一个问题。你的线索(我只使用索引)让我在1,5分钟内得到所有需要的行,所以它真的更快,谢谢!