选择花费太长时间.需要建议以获得更好的性能

Dan*_*Sh. 0 sql-server-2008

好的,我们走了.这是杂乱的SELECT交叉其他表,并命令得到一个所需的行.基本上我在里面做"数学" ORDER BY.

1个基表.

7 JOINS到当地的桌子.

WHERE有2个条款和NOT IN另一个表格.

你会在代码中看到ORDER BY它非常大/丑,它总结了5种不同的计算结果.我需要将order by这些结果用于那些计算以获得最差的行情况.

问题是,一旦我执行存储过程,它最多需要8秒才能运行.那是不可接受的.所以,我开始检查索引.

所以,我正在寻找关于如何使这个查询运行得更快的建议.我正在索引WHERE条款和字段LINEA,我应该索引别的吗?就像我穿过的行JOINs?或者我应该以不同的方式处理查询?

查询:

SET @LINEA = (
    SELECT TOP 1
        BOA.LIN
    FROM
        BAND_BA BOA
    LEFT JOIN
        TEL PAR
        ON REPLACE(BOA.Lin,'-','') = SUBSTRING(PAR.Te,2,10)
    LEFT JOIN
        TELP CLP
        ON REPLACE(BOA.Lin,'-','') = SUBSTRING(CLP.Numtel,2,10)
    LEFT JOIN
        CA C
        ON REPLACE(BOA.Lin,'-','') = C.An
    LEFT JOIN
        RE R
        ON REPLACE(BOA.Lin,'-','') = R.Lin
    LEFT JOIN
        PRODUCTOS2 P2
        ON BOA.PRODUCTO = P2.codigo
    LEFT JOIN
        EN 
        ON REPLACE(BOA.Lin,'-','') = EN.G
    LEFT JOIN
        TIP ID
        ON TIPID = ID.ID
    WHERE 
        BOA.EST = 'C' AND
        ID.SE =  'boA' AND 
        BOA.LIN NOT IN (
            SELECT 
                LIN 
            FROM 
                BAN

            )   
    ORDER BY (EN.VALUE + ANT.VALUE + REIT.VAL + C.VALUE + TEL.VALUE

        ) DESC,             
Run Code Online (Sandbox Code Playgroud)

JNK*_*JNK 7

我会坦率地说,这是一个非常可怕的SQL.如果没有看到所有的表结构,这里的建议将是不完整的.话虽这么说,请不要张贴所有的桌面结构,因为你已经非常接近"聘请顾问"的领域.

  1. 所有的REPLACE逻辑都应该被废除.如果需要JOIN在这些字段上,则将可比较的字段添加到表中,这样您就不需要操作数据.每个JOIN使用REPLACE或者SUBSTRING是表或索引扫描的单个- 那些是非SARGable和明确的反模式.

  2. ORDER BY可能是ORDER BY我见过的最复杂的.那里的一些主要问题:

    • 应该在外部查询中或作为变量消除和实现子查询
    • 应该消除字符串操作(参见上面的第1项)

整个查询基本上是代码味道.如果您需要编写这样的代码来满足业务需求,那么您要么在组织或数据中有一个非常不合适的设计或其他更大的问题.

  • +1 @JNK,我立刻问了同样的问题.那些'REPLACE`声明立刻脱颖而出! (2认同)