代码之家  ›  专栏  ›  技术社区  ›  Ryan Gadsdon

SQL服务器查询联接优化

  •  3
  • Ryan Gadsdon  · 技术社区  · 6 年前

    我在网上寻找答案,但找不到确切的答案。例如,您有两个联接子句:

    1。

    JOIN T2 ON T1.[ID] = T2.[ID]
    

    2。

    JOIN T2 ON T1.[ID] = REPLACE(T2.[ID],'A', '')
    

    由于join子句上的函数,第二个执行得更差。具体原因是什么?

    例如,如果这个代码在存储过程中,那么优化它的最佳方法是什么?要删除replace函数并将其添加到表级别,以便在任何联接之前完成所有这些操作吗?

    任何关于进一步信息的建议或链接都是很好的。谢谢

    3 回复  |  直到 6 年前
        1
  •  3
  •   Andrew    6 年前

    REPLACE(T2.[ID],'A', '')

    REPLACE('A123','A', '') = 123

    S ARG ABLE

    WHERE ID * 2 = @paramValue

    WHERE ID = @paramValue / 2.0

        2
  •  3
  •   Gordon Linoff    6 年前

    1. for

    alter table t2 add id_no_a as (replace(id, 'A', '')) persisted;
    
    create index idx_t2_id_no_a on t2(id_no_a);
    

    on T1.[ID] = t2.id_no_a
    
        3
  •  -2
  •   Stefanos Zilellis    6 年前

    DECLARE @T1 TABLE (ID VARCHAR(16), CODE INT)
    DECLARE @T2 TABLE (ID VARCHAR(16), CODE INT)
    
    INSERT INTO @T1 VALUES ('ASD',1)
    INSERT INTO @T1 VALUES ('DFG',2)
    INSERT INTO @T1 VALUES ('RTY',3)
    INSERT INTO @T1 VALUES ('AZX',4)
    INSERT INTO @T1 VALUES ('GTY',5)
    INSERT INTO @T1 VALUES ('KKO',6)
    
    INSERT INTO @T2 VALUES ('ASD',1)
    INSERT INTO @T2 VALUES ('SD',2)
    INSERT INTO @T2 VALUES ('DFG',3)
    INSERT INTO @T2 VALUES ('RTY',4)
    INSERT INTO @T2 VALUES ('AZX',5)
    INSERT INTO @T2 VALUES ('ZX',6)
    INSERT INTO @T2 VALUES ('GTY',7)
    INSERT INTO @T2 VALUES ('GTYA',8)
    INSERT INTO @T2 VALUES ('KKO',9)
    INSERT INTO @T2 VALUES ('KKOA',10)
    INSERT INTO @T2 VALUES ('AKKOA',11)
    
    
    
    SELECT * FROM @T1 T1 INNER JOIN (SELECT ID FROM @T2 WHERE ID NOT LIKE '%A%')T2 ON T2.ID = T1.ID
    UNION ALL 
    SELECT * FROM @T1 T1 INNER JOIN (SELECT REPLACE(ID,'A','')ID FROM @T2 WHERE ID LIKE '%A%')T2 ON T2.ID = T1.ID