【问题标题】:Alternative for Cross Join with a Table having Single Row (Multiple Columns)使用具有单行(多列)的表的交叉连接的替代方法
【发布时间】:2018-07-11 18:58:37
【问题描述】:

我有一个配置表 - tblConfig 如下所示

-------------------------------------------
| SiteCode  |  CompanyCode | CompanyGroup |
-------------------------------------------
| AISH78    |  SPWI85      |SFTIT         |
-------------------------------------------

还有一个超过 10K 行的表 tblData。

我想编写一个查询来返回 tblData 表行以及 tblConfig 表的列。

例如:

---------------------------------------------------------------------------
| SiteCode  |  CompanyCode | CompanyGroup | tblDataCol1 | tblDataCol2|.....etc
---------------------------------------------------------------------------
| AISH78    |  SPWI85      |SFTIT         |    1        |  XY       | ....etc
----------------------------------------------------------------------------
| AISH78    |  SPWI85      |SFTIT         |    2        |  MN       | ....etc
----------------------------------------------------------------------------
| AISH78    |  SPWI85      |SFTIT         |    3        |  PQ       | ....etc
----------------------------------------------------------------------------
...
...
...
..etc

我知道我可以写一个交叉连接查询

 Select * from tblConfig
 Cross Join tblData

但上面的查询会影响性能,因为 tblData 有超过 10K 行。 (在这个 cross Join 之后我几乎没有其他查询)。

对于上述情况,交叉连接有什么替代方法吗? 请帮忙。

【问题讨论】:

  • 你的两张表之间真的没有任何共同的列吗?
  • 创建一个存储过程,返回前n条记录,根据输入参数返回不同的结果?
  • tblConfig 有多大?
  • 如果tblConfig 真的只有一行(并且永远只有一行),那么Cross Join 不会出现性能问题。真正的问题是什么?当您不交叉加入此表时,您是否看到更好的性能?
  • @Squirrel - tblConfig 只有 1 行 3-4 列

标签: sql-server sql-server-2014 cross-join


【解决方案1】:

嗯...您不需要使用交叉连接。您也可以使用常规的内部联接。但是,可能优化器毕竟将其更改为交叉连接 - 如果性能符合您的要求,您将不得不尝试:

DECLARE @t1 TABLE(
  SiteCode NVARCHAR(10),
  CompanyCode NVARCHAR(10),
  CompanyGroup NVARCHAR(10)
)

INSERT INTO @t1 VALUES ('AISH78','SPWI85', 'SFTIT')


DECLARE @t2 TABLE(
  c1 NVARCHAR(10),
  c2 NVARCHAR(10),
  c3 NVARCHAR(10)
)

INSERT INTO @t2 VALUES ('AAA','BBB', 'CCC'), ('DDD','EEE', 'FFF'), ('GGG','HHH', 'III')

SELECT t1.*, t2.*
  FROM @t2 t2
  JOIN @t1 t1 ON t1.SiteCode = t1.SiteCode

【讨论】:

  • 我的查询持续时间略有减少约 30-40 毫秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2021-08-01
  • 2019-08-06
  • 2023-01-24
  • 1970-01-01
  • 2019-01-04
相关资源
最近更新 更多