fncDeptInfo 함수가 있습니다. 현재 1 초 이내에 약 1000 개의 레코드를 반환합니다.
ALTER FUNCTION [dbo].[fncDeptInfo]()
RETURNS TABLE
AS
RETURN
(
SELECT
tblContacts.Contact,
CASE tblContacts.Parent1
WHEN 1900 THEN 0
WHEN 1901 THEN 1
WHEN 1902 THEN 2
WHEN 1903 THEN 3
WHEN 1904 THEN 4
WHEN 1905 THEN 5
WHEN 1906 THEN 6
ELSE NULL
END AS PRArea,
DISTRICT.Contact AS DistrictID
FROM
tblContacts
LEFT OUTER JOIN
tblContacts AS DISTRICT ON tblContacts.Parent2 = DISTRICT.Contact
WHERE
(tblContacts.ContactType = 'Fire') AND
(tblContacts.SubType = 'Dept')
)
아래에이 함수를 호출하는 절차가 있습니다.
SELECT
fncDeptInfo.Contact, DEPTPAID.CurPaid,
fncDeptInfo.PRArea, fncDeptInfo.DistrictID
FROM
fncDeptInfo() AS fncDeptInfo
INNER JOIN
(SELECT
v_Item.BillToContact AS Contact,
SUM(CASE WHEN Expiration = @Date1 AND tblProgramCodes.FormatCode = 'Membership' THEN 1 ELSE 0 END) AS CurPaid
FROM
v_Item
INNER JOIN
tblProgramCodes ON v_Item.ProgramCodeID = tblProgramCodes.ProgramCode
GROUP BY
v_Item.BillToContact) DEPTPAID ON fncDeptInfo.Contact = DEPTPAID.Contact
WHERE
(fncDeptInfo.PRArea > 0) AND (fncDeptInfo.DistrictID > 0)
ORDER BY
fncDeptInfo.Contact
v_Item
여러 테이블에 걸쳐 재무 기록을 롤업하는 매우 복잡한보기입니다. 300,000 개 이상의 행을 반환합니다. 설계된 절차는 5 초 내에 반환됩니다.
fncDeptInfo에 Chief 정보를 얻기 위해이 부분을 추가하면 절차는 1 분 30 초가 걸립니다. 그러나 fncDeptInfo 자체는 여전히 약 1 초 안에 반환됩니다.
LEFT OUTER JOIN fncEmployee(GETDATE(), 'Chief') AS CHIEF
ON tblContacts.Contact = CHIEF.Contact2
이 기준을 절차에 추가하면 이제 1 분 30 초가 걸립니다. 그러나 프로 시저에서 fncDeptInfo를 제거하면 약 5 초 후에 다시 반환됩니다.
WHERE CurPaid > 0
내 생각 엔 뷰가 두 경우 모두 관련되어 있고 반복적으로 호출되고 있다는 것입니다. 누군가 성능이 저하되지 않도록 이것을 설계하는 더 나은 방법을 제안 할 수 있습니까?
간단한 옵션은 뷰를 반복적으로 호출하지 못하도록 임시 테이블로 뷰를 선택하는 것입니다. 같은 것
IF Object_ID ('tempdb..vitem_tmp') is not null DROP TABLE #vitem_tmp
SELECT *
INTO #vitem_tmp
FROM v_Item
[Your query, referencing #vitem_tmp instead of v_Item]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다