2016-08-19 7 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

Вопросы, требующие помощи по формированию, должны включать в себя схему таблицы, количество задействованных таблиц и текущий план выполнения – 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

Скорее всего, нет уникального индекса на Card.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); 

Btw, я удивлен, что есть e.EmployeeUniqueID но присоединиться на e.ID

Смежные вопросы