0

好的,我们开始吧。SELECT穿过其他表并订购以获得所需的行,这很混乱。基本上我在ORDER BY.

1个基表。

7JOINS点到本地表。

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,             
4

2 回答 2

7

坦率地说,这是一些非常糟糕的 SQL。如果没有看到所有的表结构,这里的建议将是不完整的。话虽如此,请不要发布所有表格结构,因为您已经非常接近“聘请顾问”领域了。

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

  2. 这可能是我见过ORDER BY的最令人费解的。ORDER BY那里的一些主要问题:

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

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

于 2012-09-19T17:25:41.777 回答
2

可能会影响性能的一件事是使用大量的 LEFT JOIN。为了提高 LEFT JOIN 的性能,您可能希望确保您加入的列具有索引 - 这会对性能产生巨大影响。

于 2012-09-19T17:18:53.390 回答