如何优化笛卡尔积

时间:2012-02-25 12:35:45

标签: sql sql-server optimization cartesian-product

我需要做一个表的笛卡尔积,但没有相同的行。现在我有:

select * 
From T_Car C1
Join T_Car C2 On C1.CarID <> C2.CarID

但是对于有1300行的T_Car表,它需要将近2分钟。 我尝试使用OPTION(HASH JOIN)和OPTION(MERGE JOIN)但最终出现错误:

由于此查询中定义的提示,查询处理器无法生成查询计划。重新提交查询而不指定任何提示,也不使用SET FORCEPLAN。

是否有可能优化此查询?

3 个答案:

答案 0 :(得分:1)

您能详细说明原因吗? 您提到的查询并不常见(根据我的经验),并且会产生昂贵的查询计划。如果我们能够更好地理解查询的上下文,我们可能会采用一种不同的方法来提高性能,可能会查询执行几个步骤来检索相关数据的存储过程,但是每个方法都会以有效的方式执行。阶段。

一个很好的例子(使用你的场景)将创建一个过程,将相关的ID隔离到临时表,然后加入它(使用'='而不是'&lt;&gt;')来获得结果

答案 1 :(得分:0)

如果您不想加入每一行,可以使用INNER JOIN或LEFT JOIN。 Inner JOIN仅返回匹配的行,Left Join返回左表的空行。右连接也返回右表的空行。

答案 2 :(得分:0)

生产整个笛卡尔产品需要多长时间,其中包含1,690,000行?

如果这是一段合理的时间,那么请考虑使用MINUS运算符来消除主键匹配的行。像。的东西。

select *  From T_Car C1, T_Car C2 
MINUS
select *  From T_Car C1 Join T_Car C2 On C1.CarID = C2.CarID 

整个笛卡尔积可能需要很长时间才能生产出来。为什么你还需要这样的结果?也许有更好的方法来建模您的数据。