0

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

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 的情况下重新提交查询。

有没有可能优化这个查询?

4

3 回答 3

1

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

一个很好的例子(使用您的场景)是创建一个将相关 ID 隔离到临时表的过程,然后将其连接(使用“=”而不是“<>”)以获得结果。

于 2012-02-25T12:54:10.297 回答
0

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

于 2012-02-25T12:51:09.897 回答
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 

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

于 2012-02-25T13:03:33.780 回答