好的,我们走了.这是杂乱的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)
我会坦率地说,这是一个非常可怕的SQL.如果没有看到所有的表结构,这里的建议将是不完整的.话虽这么说,请不要张贴所有的桌面结构,因为你已经非常接近"聘请顾问"的领域.
所有的REPLACE逻辑都应该被废除.如果需要JOIN在这些字段上,则将可比较的字段添加到表中,这样您就不需要操作数据.每个JOIN使用REPLACE或者SUBSTRING是表或索引扫描的单个- 那些是非SARGable和明确的反模式.
这ORDER BY可能是ORDER BY我见过的最复杂的.那里的一些主要问题:
整个查询基本上是代码味道.如果您需要编写这样的代码来满足业务需求,那么您要么在组织或数据中有一个非常不合适的设计或其他更大的问题.
| 归档时间: |
|
| 查看次数: |
757 次 |
| 最近记录: |