如何提高SQL查询性能

时间:2017-11-12 15:25:22

标签: sql sql-server

我有一个观点可以告诉我客户及sum他们的付款及其工作,但需要8秒钟,当我从查询中删除计算的列部分时,它不会花费任何时间,我试图通过在表上创建非聚集索引来解决这个问题,但它也是8秒,因此我询问是否有任何方法可以改善性能,尽管我必须使用这种技术。

我的代码是

SELECT ID
    ,NAME
    ,Total = (
        SELECT Sum(Value)
        FROM TRANSACTION
        WHERE Employee.ID = employee_ID
        )
FROM Employee;

提前致谢

4 个答案:

答案 0 :(得分:0)

您可以尝试使用与群组的联接,看看是否更快:

 select employee.id, employee.name, sum(value)
 from employee 
 join transaction where transaction.employee_ID = employee.id
 group by employee.id, employee.name

另外 - 尽量避免提供与保留字相对应的名称 - 例如TRANSACTION - 请参阅https://dev.mysql.com/doc/refman/5.5/en/keywords.html

要加速,您可能需要考虑Emlpoyee(id,name)上的组合索引和Transaction.Employee_ID上的索引 - 两者都需要快速进行此查询的连接和分组。检查transaction.employee_ID是否有FK_ConstraintEmployee.ID - 这可能也有帮助。

答案 1 :(得分:0)

您可以在子选择中使用和

的连接
select e.id, e.name, t.total 
from employee  e
join (
  select employee_ID, sum(value) as total
  from TRANSACTION
  group by employee_ID
) t on t.employee_ID = e.id 

答案 2 :(得分:0)

对于此查询:

TRANSACTION(employee_ID, Value)

您需要join上的索引。这应该会给你最佳的表现。

您可以将其写为left join - 但SELECT e.ID, e.NAME, SUM(t.Value) as Total FROM Employee e JOIN TRANSACTION t ON e.Employee.ID = t.employee_ID GROUP BY e.ID, e.NAME;

GROUP BY

然而,整体Swift Language Version的效率通常低于"子组"在MySQL中(通常也在其他数据库中)。

答案 3 :(得分:0)

尝试使用总计

的索引视图
CREATE VIEW totalView
WITH SCHEMABINDING
AS
    select employee_ID, sum(value) as total
      from TRANSACTION
      group by employee_ID

CREATE UNIQUE CLUSTERED INDEX PK_totalView ON totalView
(
    employee_id,total
);

然后加入

select employee.id, employee.name, coalesce(t.total,0)
 from employee 
 left outer join totalView t where t.employee_ID = employee.id

根据需要调整连接类型。