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

时间:2012-09-19 16:58:35

标签: sql-server-2008

好的,我们走了。有这个凌乱的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}}

2 个答案:

答案 0 :(得分:7)

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

  1. 所有REPLACE逻辑都应该废弃。如果您需要JOIN这些字段,请在表格中添加可比较的字段,这样您就不会不需要操纵数据。使用JOINREPLACE的每个SUBSTRING都是表格或索引扫描 - 这些是非SARGable和明确的反模式。

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

    • 子查询应该在外部查询中删除并实现,或者作为变量
    • 应消除字符串操作(参见上面的第1项)
  3. 整个查询基本上都是代码味道。如果您需要编写这样的代码来满足业务需求,那么您要么在组织或数据中有一个非常不合适的设计或其他更大的问题。

答案 1 :(得分:2)

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