簡體   English   中英

如何提高SQL查詢性能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM