您好以下是我为SQL 2008编写的查询。插入500000条记录需要2个多小时。任何人都可以建议一种提高绩效的方法吗?
INSERT INTO tblUserFile
SELECT
CASE
WHEN UD.IdentityStatus = 'A' THEN 'ACTIVE'
WHEN UD.IdentityStatus in ('T','') THEN 'INACTIVE'
WHEN UD.IdentityStatus IS NULL THEN ''
END,
--'UD.IS' AS "Status",
ISNULL(UD.HltID,'') AS "USERID",
ISNULL(UD.HltID,'') AS "USERNAME",
ISNULL(UD.FirstName,'') AS "FIRSTNAME",
ISNULL(UD.LastName,'') AS "LASTNAME",
ISNULL(UD.MiddleInitials,'') AS "MI",
'' AS "GENDER",
ISNULL(UD.EmailAddress,'') AS "EMAIL",
CASE
WHEN SU.UserType = 'C' THEN ISNULL(MCU.Manager, '') ----look into this
WHEN SU.UserType = 'R' THEN 'From LMS SuperViser'
WHEN SU.UserType IS NULL OR SU.UserType = '' THEN ''
END,
'' AS HR,
'' AS "DEPARTMENT",
'' AS "JOBCODE",
'' AS "DIVISION",
ISNULL(UD.Office,'') AS "LOCATION",
'' AS "TIMEZONE",
'' AS "HIREDATE",
ISNULL(UD.Title,'') AS "TITLE",
ISNULL(UD.StreetAddress,'') AS "ADDR1",
'' AS "ADDR2",
ISNULL(UD.City,'') AS "CITY",
ISNULL(UD.State,'') AS "STATE",
ISNULL(UD.Zip,'') AS "ZIP",
ISNULL(UD.CountryCode,'') AS "COUNTRY",
'' AS "REVIEW_FREQ",
'' AS "LAST_REVIEW_DATE",
ISNULL(UD.EmployeeType,'') AS "Custom01",
'' AS "Custom02",
CASE
WHEN SU.UserType = 'C' THEN ''
WHEN SU.UserType = 'R' THEN ISNULL(FSBD.Name,'')
WHEN SU.UserType IS NULL OR SU.UserType = '' THEN ''
END,
'' AS "Custom04",
'' AS "Custom05",
'' AS "Custom06",
'' AS "Custom07",
'' AS "Custom08",
CASE
WHEN SU.UserType = 'C' THEN 'Corporate'
WHEN SU.UserType = 'R' THEN 'Hotel'
WHEN SU.UserType IS NULL OR SU.UserType = '' THEN ''
END,
ISNULL(UD.EmpId,'') AS "Custom11",
'' AS "Custom13",
'' AS "Custom14",
'' AS "Custom15",
'' AS "PositionCode",
ISNULL(SU.HomeFacility, '') AS "HomeFacility",
'NPS' AS PSFlag
FROM Search..UserData UD
LEFT JOIN Search..ManagerForCorpUsers MCU ------ look into this
ON MCU.EmpID = UD.EmpId
AND UD.EmpId != ''
AND UD.EmpId IS NOT NULL
LEFT JOIN Search..securityUsers SU ------ look into this
ON UD.UserId = SU.UserID
AND UD.UserId != ''
AND UD.UserId IS NOT NULL
LEFT JOIN EIS.dbo.NewQueryFilter NQ
ON SU.HomeFacility = NQ.FCNB
AND SU.HomeFacility != ''
AND SU.HomeFacility IS NOT NULL
LEFT JOIN Facility..fcSubBrandDesc FSBD
ON NQ.SubBrand = FSBD.SubBrand
AND NQ.SubBrand != ''
AND NQ.SubBrand IS NOT NULL
WHERE
ISNULL(UD.IdentityStatus,'') NOT IN ('D','U','L')
AND ISNULL(UD.EmployeeType,'') NOT IN ('O','V','')
AND ISNULL(UD.HltId,'') != ''
AND ISNULL(UD.EmpId,'') NOT IN (SELECT DISTINCT UserId FROM Search..CurrentUserFile)
答案 0 :(得分:2)
您是否尝试过避免DISTINCT
查询的内部查询?
Search..CurrentUserFile ??
的大小是多少尝试这样的事情 -
SELECT
....
FROM Search..UserData UD
... -- all your earlier joins as it is
LEFt JOIN Search..CurrentUserFile CU on (UD.EmpId=CU.UserId)
WHERE
... -- all your where clause
AND CU.UserId IS NULL;--only show results which are not in CurrentUserFile
答案 1 :(得分:1)
试试这个 -
SELECT ...
FROM (
SELECT *
FROM Search.dbo.UserData UD
WHERE ISNULL(UD.UserId, '') != ''
AND ISNULL(UD.IdentityStatus, '') NOT IN ('D','U','L')
AND ISNULL(UD.EmployeeType, '') NOT IN ('O','V','')
AND ISNULL(UD.HltId, '') != ''
AND ISNULL(UD.EmpId, '') NOT IN (
SELECT DISTINCT UserId
FROM Search.dbo.CurrentUserFile
)
) UD
LEFT JOIN Search.dbo.ManagerForCorpUsers MCU ON MCU.EmpID = UD.EmpId
LEFT JOIN Search.dbo.securityUsers SU ON UD.UserId = SU.UserID
LEFT JOIN EIS.dbo.NewQueryFilter NQ ON SU.HomeFacility = NQ.FCNB
AND ISNULL(SU.HomeFacility, '') != ''
LEFT JOIN Facility.dbo.fcSubBrandDesc FSBD ON NQ.SubBrand = FSBD.SubBrand
AND ISNULL(NQ.SubBrand, '') != ''
答案 2 :(得分:1)
如果您使用恢复模型作为事务,它将记录所有,“您可以使用BUlk记录恢复如果您有更多插入发生,并尝试最小化案例语句使用联接而不是LEft联接而不是条件