SQL中是否有Cross Join的替代方法

时间:2013-06-11 21:57:18

标签: sql-server sql-server-2008 tsql join cross-join

我有两个表Table1Table2,我需要找到满足Table1.LastNameTable2.LastName之间条件 Fuzzy_Qgram (近似匹配优化)的所有行Select * from Table1 Cross Join Table2 Where Fuzzy_Qgram(Table1.LastName,Table2.LastName)> =1.5

以下是我的查询:

Table1

在此查询中,Table2中的每一行都与Fuzzy_Qgram(Table1.LastName,Table2.LastName)> =1.5中的每一行相乘,并且将返回满足Table1的行。

执行查询的速度非常慢,因为我Table2中的 300,000行 <{1}} 3000行

对于此类查询是否有Cross Join的替代方法可以更好,更快地进行优化?

2 个答案:

答案 0 :(得分:0)

函数的参数顺序是否有所不同?我的意思是,当你运行以下查询时,你能保证得到相同的结果吗?

Select Fuzzy_Qgram('Washington','Obama')
Select Fuzzy_Qgram('Obama','Washington')

如果是这样,那么应该没有任何理由以两种方式进行测试,因此您可以将查询更改为:

Select * 
from   Table1 
       Inner join Table2
         On Table.LastName <= Table2.LastName
Where Fuzzy_Qgram(Table1.LastName,Table2.LastName)> =1.5

当然,我不知道Fuzzy_Qgram是做什么的,所以你需要彻底测试一下。如果这是正确的,它可能会将执行时间减少大约1/2。

答案 1 :(得分:0)

长话短说。

SELECT * 
FROM 
 Table1 t1
 JOIN Table2 t2
  ON 1=1
 CROSS APPLY (
  SELECT 
    fuzzy_qgram = t1.someColumnOf_t1 + t2.someColumnOf_t2
 ) ext 
WHERE ext.fuzzy_qgram >= 1.5

当然,您必须使用fuzzy_qgram逻辑替换t1.someColumnOf_t1 + t2.someColumnOf_t2。 使用它,你有可能看到显着的加速。