[英]How To improve a sql query performance
我有一種觀點,可以向我返回客戶及其支付的款項及其工作的sum
,但是這需要8秒鍾,當我從查詢中刪除計算列部分時,它並沒有花費任何時間,因此我嘗試通過創建來解決此問題表上的非聚集索引,但它也是8秒,所以我在問是否有任何方法可以提高性能,盡管我必須使用此技術。
我的代碼是
SELECT ID
,NAME
,Total = (
SELECT Sum(Value)
FROM TRANSACTION
WHERE Employee.ID = employee_ID
)
FROM Employee;
提前致謝
您可以嘗試對組使用聯接,看看是否更快:
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/zh-CN/keywords.html
為了加快處理速度,您可能需要考慮Emlpoyee(id,name)
上的組合索引和Transaction.Employee_ID
上的索引-兩者都需要快速建立此查詢的聯接和分組。 檢查transaction.employee_ID
是否對Employee.ID
具有FK_Constraint
這可能也有幫助。
您可以在子選擇中使用與總和的聯接
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
對於此查詢:
SELECT ID, NAME,
(SELECT Sum(t.Value)
FROM TRANSACTION t
WHERE e.Employee.ID = t.employee_ID
) as Total
FROM Employee e;
您需要索引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
在MySQL中(通常在其他數據庫中)通常不如“ sub group by”有效。
嘗試對總索引視圖
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
根據需要調整連接類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.