我有一个观点可以告诉我客户及sum
他们的付款及其工作,但需要8秒钟,当我从查询中删除计算的列部分时,它不会花费任何时间,我试图通过在表上创建非聚集索引来解决这个问题,但它也是8秒,因此我询问是否有任何方法可以改善性能,尽管我必须使用这种技术。
我的代码是
SELECT ID
,NAME
,Total = (
SELECT Sum(Value)
FROM TRANSACTION
WHERE Employee.ID = employee_ID
)
FROM Employee;
提前致谢
答案 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_Constraint
到Employee.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
根据需要调整连接类型。