使用左外部联接和并集优化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分钟内得到所有需要的行,所以它真的更快,谢谢!