好的,我们走了。有这个凌乱的SELECT
穿过其他表并命令获得所需的行。基本上我在ORDER BY
内做“数学”。
1个基本表。
7 JOINS
选择当地的桌子。
WHERE
有2个子句,NOT IN
跨越另一个表。
你会在代码中看到ORDER BY
非常大/丑,它总结了5种不同的计算结果。为了获得最差的行情况,我需要将结果order by
计算到WHERE
。
问题是,一旦我执行存储过程,它最多需要8秒才能运行。那是不可接受的。所以,我开始检查索引。
所以,我正在寻找有关如何让这个查询运行得更快的建议。
我正在为LINEA
子句和字段JOINs
建立索引,我应该将其他内容编入索引吗?就像Im 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,
的行一样?或者我应该以不同的方式处理查询?
查询:
{{1}}
答案 0 :(得分:7)
我会坦率地说,这是一个非常可怕的SQL。如果没有看到所有的表结构,这里的建议将是不完整的。话虽如此,请不要张贴所有的桌面结构,因为你已经非常接近“聘请顾问”的领域。
所有REPLACE
逻辑都应该废弃。如果您需要JOIN
这些字段,请在表格中添加可比较的字段,这样您就不会不需要操纵数据。使用JOIN
或REPLACE
的每个SUBSTRING
都是表格或索引扫描 - 这些是非SARGable和明确的反模式。
ORDER BY
可能是我见过的最令人费解的ORDER BY
。那里有一些主要问题:
整个查询基本上都是代码味道。如果您需要编写这样的代码来满足业务需求,那么您要么在组织或数据中有一个非常不合适的设计或其他更大的问题。
答案 1 :(得分:2)
可以扼杀性能的一件事是使用了很多LEFT JOIN。要提高LEFT JOIN的性能,您可能希望确保您加入的列具有索引 - 这可能会对性能产生巨大影响。