【问题标题】:Is there any alternative to Cross Join in TSQLSQL中的交叉连接有什么替代方法吗
【发布时间】:2013-06-07 22:03:58
【问题描述】:

我有两个表Table1 和Table2,我需要在其中找到满足Table1.LastName 和Table2.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 中有超过300,000 行,在Table2 中有3000 行

对于此类查询,是否有任何替代 Cross Join 的替代方法以实现更好、更快的优化?

【问题讨论】:

  • 您的 fn 是标量,我预计会有问题。您能否将“模糊”逻辑移至例如交叉申请?
  • 不,Table2 是 视图 而不是表格。抱歉,打错字了。
  • @Ozren Tkalčec Krznarić:是的,它返回一个标量值,我在该值上应用条件
  • @Raphaël Althaus : 没有任何改进,执行需要同样的时间甚至更长的时间
  • 简单地说,如果你的模糊函数不是太复杂,就有机会将该逻辑提取到查询中并加快它的速度。说,'select * from t1 cross join t2 cross apply (selectfuzzy_qgram = ... Logic ...) ext where ext.fuzzy_qgram >= 1.5'

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


【解决方案1】:

长话短说。

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

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

【讨论】:

    【解决方案2】:

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

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 2019-01-04
      • 2021-08-20
      • 2017-03-02
      • 1970-01-01
      • 2021-01-06
      • 2021-12-31
      相关资源
      最近更新 更多