0

我们有这样的查询:

select X.id_x, A.id_a, B.id_b
from X
left join A on 'A|' + A.id_a = X.id_aOrB
left join B on 'B|' + B.id_b = X.id_aOrB

X 链接到 A 或 B 并且 id 在 join 语句中计算。

  • X:8 000 行
  • 答:36 000 行
  • B:3 000 行

这个查询很慢,像 10 秒。上没有索引X.id_aOrb

然后使用 2 个由触发器更新的“连接”表,我们不需要连接'A|' + id'B|'+id. 不到 1 秒即可获取结果。好的。

我的问题:为什么这个 concat 这么慢?当数据太多时,SQL Server 在“+”中效率不高吗?

4

3 回答 3

1
FROM X
LEFT JOIN A on 'A|' + A.id_a = X.id_aOrB

不可搜索(SQL Server 不能使用索引)。

如果它使用嵌套循环连接,那么它必须A扫描X. 无法执行索引查找A来评估'A|' + A.id_a = X.id_aOrB谓词。

如果它使用合并连接,它必须先获取数据的副本并对其进行排序,而不是能够使用索引中的顺序。

当然,这同样适用于加入B

于 2013-01-31T16:10:35.320 回答
0

查看执行计划,看看它在哪里花费的时间最多。SQL 是否在进行表扫描?他们很慢。如果您在 X.id_aOrB 上没有索引,那么这将是一个很好的优化。这里有一些关于如何解释执行计划的文章

如果您要经常运行此查询,您可以从中创建一个视图并对其进行索引,以便实现它(虽然维护成本...)

于 2013-01-31T15:51:03.963 回答
0

以下查询更快吗?

With t as
(
  select id_x,SUBSTRING(X.id_aOrB,3,1000) as id_a,null as id_b
  from x
  where X.id_aOrB like 'A|%'
  union all
  select id_x,NULL as id_a,SUBSTRING(X.id_aOrB,3,1000) as id_b
  from x
  where X.id_aOrB like 'B|%'
)
select t.id_x, A.id_a, B.id_b
from t
left join A on A.id_a = t.id_a
left join B on B.id_b = t.id_b
于 2013-01-31T15:53:26.583 回答