2016-08-19 131 views
-1

我有這個存儲過程,這表明了約70,000條記錄,但它需要相當長的時間來運行,即1分4秒如何提高存儲過程的速度?

如何提高它的性能?

SELECT 
    CASE WHEN c.CardID IS NULL THEN 0 ELSE c.CardID END AS CardID, 
    CASE WHEN c.Description IS NULL THEN '' ELSE c.Description END AS Description, 
    CASE WHEN c.Employee_ID IS NULL THEN 0 ELSE Employee_ID END AS Employee_ID, 
    CASE WHEN c.ExpiryDate IS NULL THEN '1900-01-01' ELSE DATEADD(HOUR,4,c.ExpiryDate) END AS ExpiryDate, 
    CASE WHEN c.IsActive IS NULL THEN '0' ELSE c.IsActive END AS IsActive, 
    CASE WHEN c.IssueDate IS NULL THEN '1900-01-01' ELSE DATEADD(HOUR,4,c.IssueDate) END AS 'IssueDate', 
    CASE WHEN c.PinCode IS NULL THEN 0 ELSE c.PinCode END AS PinCode, 
    e.EmployeeUniqueID, e.EmployeeName, 
    ER.EmployerName, 
    CASE WHEN c.IsActive = '1' THEN 'Activate' ELSE 'Deactivate' END AS Status 
FROM 
    Cards c 
RIGHT JOIN 
    RegisteredEmployees e ON c.Employee_ID = e.ID 
INNER JOIN 
    POSSystem.DBO.Employers ER ON E.Employer_ID = ER.ID 
+2

請閱讀如何提出一個很好的SQL問題:http://meta.stackoverflow.com/questions/271055/tips-for-asking-a-good-structured-query-language-sql-問題/ 271056 你也應該發佈解釋計劃 – vercelli

+0

使用相關的子查詢,而不是連接檢查這一個。 http://stackoverflow.com/questions/806015/sql-query-joins-multiple-tables-too-slow-8-tables – cnayak

+2

尋求peformance幫助的問題需要包含,表格模式,涉及的表的數量和當前的執行計劃 – TheGameiswar

回答

-3

您可以使用sqls的並行執行。

一樣,

SELECT /*+ Parallel(s,8) */ 
     Case When c.CardID IS NULL then 0 else c.CardID end CardID 
     ,Case When c.Description IS NULL then '' else c.Description end Description 
     ,CASE when c.Employee_ID IS NULL then 0 else Employee_ID end Employee_ID 
     ,CASE when c.ExpiryDate IS NULL then '1900-01-01' else DATEADD(HOUR,4,c.ExpiryDate) end as ExpiryDate 
     ,Case when c.IsActive IS NULL then '0' else c.IsActive end as IsActive 
     ,CASE when c.IssueDate IS NULL then '1900-01-01' else DATEADD(HOUR,4,c.IssueDate) end as 'IssueDate' 
     ,CASE When c.PinCode IS NULL then 0 else c.PinCode end as PinCode 
     ,e.EmployeeUniqueID 
     ,e.EmployeeName 
     ,ER.EmployerName 
     ,case when c.IsActive='1' then 'Activate' else 'Deactivate' end as Status 
    from Cards c 
    right join RegisteredEmployees e 
    on c.Employee_ID=e.ID 
    INNER JOIN POSSystem.DBO.Employers ER 
    ON E.Employer_ID=ER.ID 

參考:Click Here

希望這將有助於。

+1

該帖子被標記爲Sql-Server。這個暗示技術是針對Oracle DB的 – vercelli

0

最有可能在Cards.Employee_ID上沒有非唯一索引。
添加應該加快查詢。

使用左連接比右連接更普遍。
大部分CASE WHEN都可以被COALESCE替代。但這對速度應該沒有什麼不同。

SELECT 
COALESCE(c.CardID, 0) as CardID, 
COALESCE(c.Description, '') as Description, 
COALESCE(c.Employee_ID, 0) as Employee_ID, 
CASE when c.ExpiryDate IS NULL then '1900-01-01' else DATEADD(HOUR,4,c.ExpiryDate) end as ExpiryDate, 
COALESCE(c.IsActive, '0') as IsActive, 
CASE when c.IssueDate IS NULL then '1900-01-01' else DATEADD(HOUR,4,c.IssueDate) end as IssueDate, 
COALESCE(c.PinCode, 0) as PinCode, 
e.EmployeeUniqueID, 
e.EmployeeName, 
er.EmployerName, 
case when c.IsActive='1' then 'Activate' else 'Deactivate' end as Status 
FROM RegisteredEmployees e 
INNER JOIN POSSystem.DBO.Employers er ON (er.ID = e.Employer_ID) 
LEFT JOIN Cards c on (e.ID = c.Employee_ID); 

順便說一句,我很驚訝,有一個e.EmployeeUniqueID但加入是e.ID