【问题标题】:Will "left join table on ident_key = null" help query speed?“ident_key = null 上的左连接表”会帮助查询速度吗?
【发布时间】:2023-03-10 03:50:01
【问题描述】:

一共有三张表,两张上游table A and B,一张下游table Ctable A and B 中的记录被处理并合并到table C

Table A ( id_a identity not null, prop, val )
Table B ( id_b identity not null, prop, val )
Table C ( id_c, 
    original_id [id_a or id_c],
    prop, processed_val, 
    source_table [ 'A' or 'B' ] )
NOTE: id_a and id_b has different format they never collide.

我需要在不访问应用代码的情况下更正一些应用行为。所以我试图在table C 上附加一个触发器并根据原始数据操纵process_val

我可以的

UPDATE C 
SET processed_value = NEW_FUNCTION( coalesce(A.val,B.val) )
FROM inserted
LEFT JOIN A ON ( C.orginal_id = A.id )
LEFT JOIN B ON ( C.orginal_id = B.id )

但我认为这必须通过两个表索引才能返回结果。我不想使用动态查询,我想让它像一个 sql 过程一样简单。

我想知道像下面这样的东西是否有助于防止冗余查找,因为这些键不应该是NULLNULL 值会停止查找吗?

UPDATE C 
SET processed_value = NEW_FUNCTION( coalesce(A.val,B.val) )
FROM inserted
LEFT JOIN A ON ( A.id = case when source_table='A' then C.orginal_id else NULL end )
LEFT JOIN B ON ( B.id = case when source_table='B' then C.orginal_id else NULL end )

或者MSSQL中有没有其他方法可以动态切换源表(不使用动态查询)?

【问题讨论】:

  • 您应该始终检查实际的执行计划和统计数据以比较相对性能。我敢打赌CASE 的版本可能会更慢。
  • 是的,我不应该更改密钥,已更正。现在怎么样?
  • mssql 对设置要求很高,我没有额外的查询计划查看工具……我也没有 sql management studio……所以我想我最好问问跨度>

标签: sql sql-server sql-server-2012 query-optimization


【解决方案1】:

我想你想要一个介于 Cinserted 之间的 JOIN。我希望逻辑看起来更像这样:

UPDATE C 
    SET processed_value = NEW_FUNCTION(coalesce(A.val, B.val))
    FROM inserted i JOIN
         C
         ON i.id_c = C.id_C LEFT JOIN
         A
         ON A.id = i.original_id AND i.source_table = 'A' LEFT JOIN
         B
         ON B.id = C.orginal_id AND i.source_table = 'B';

【讨论】:

  • 我猜,我很困惑。 a,b,c 的东西只是为了简化问题,确实做得不好。现在我觉得很奇怪,我为什么要取消条件。我一定是脑死了。谢谢。但是对于这个特定的问题,我仍然很好奇,是否会像正常值一样在not null 列中查找空值?还是直接返回不匹配?
  • @Ben。 . .我不知道。如果它仍然被查找,我不会感到惊讶,因为在索引中查找值非常快。 NULL 检查会有所改进,但会略有改进。
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多