Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
JimL
SQL Slinging Yak Ranger
1537 Posts |
Posted - 2006-05-24 : 10:13:43
|
I though that the nested performance hit was not that big of a deal untill I made this conversion.I started out with a nested SP that compared one week of an employeee schedule table to a time clock punch table and looked for absences then mached up to an excused table. It had about 1000 comparisons to do and output.SELECT TimeClockPlus.dbo.EmployeeSchedules.RecordId, TimeClockPlus.dbo.EmployeeList.LastName + ' ' + TimeClockPlus.dbo.EmployeeList.FirstName As ename,TimeClockPlus.dbo.EmployeeSchedules.EmployeeId, TimeClockPlus.dbo.EmployeeSchedules.TimeIn, TimeClockPlus.dbo.EmployeeSchedules.TimeOut,dbo.Absence_excused.Calledoff,dbo.Absence_excused.excuse,Points = case when dbo.Absence_excused.excuse is null and (dbo.Absence_excused.Calledoff is null or dbo.Absence_excused.Calledoff = 0) Then '3' when dbo.Absence_excused.excuse is null and dbo.Absence_excused.Calledoff = 1 Then '2' when dbo.Absence_excused.excuse is not null and (dbo.Absence_excused.Calledoff = 0 Or dbo.Absence_excused.Calledoff is null) Then '1/2' when dbo.Absence_excused.excuse is not null and dbo.Absence_excused.Calledoff = 1 Then '0' endFROM TimeClockPlus.dbo.EmployeeSchedules INNER JOIN TimeClockPlus.dbo.EmployeeList ON TimeClockPlus.dbo.EmployeeSchedules.EmployeeId = TimeClockPlus.dbo.EmployeeList.EmployeeId LEFT OUTER JOIN dbo.Absence_excused ON TimeClockPlus.dbo.EmployeeSchedules.RecordId = dbo.Absence_excused.RecordIdWHERE (TimeClockPlus.dbo.EmployeeSchedules.RecordId NOT IN (SELECT TimeClockPlus.dbo.EmployeeSchedules.RecordId FROM TimeClockPlus.dbo.EmployeeSchedules INNER JOIN TimeClockPlus.dbo.EmployeeHours ON TimeClockPlus.dbo.EmployeeSchedules.EmployeeId = TimeClockPlus.dbo.EmployeeHours.EmployeeId AND TimeClockPlus.dbo.EmployeeSchedules.TimeIn BETWEEN DATEADD(hour, - 3, TimeClockPlus.dbo.EmployeeHours.TimeIn) AND DATEADD(hour, 4, TimeClockPlus.dbo.EmployeeHours.TimeIn))) AND (TimeClockPlus.dbo.EmployeeSchedules.TimeIn < GETDATE()) AND (TimeClockPlus.dbo.EmployeeList.Department IN (SELECT Department FROM user_ccc WHERE ccuserid = suser_sname(suser_sid()))) AND (TimeClockPlus.dbo.EmployeeList.Suspend = 0) and Timeclockplus.dbo.EmployeeSchedules.TimeIn Between Cast(@weekstart as datetime) and @Weekend And Timeclockplus.dbo.EmployeeSchedules.TimeIn < Dateadd(hour,-1,Getdate())AND (DATEPART(year, TimeClockPlus.dbo.EmployeeSchedules.TimeIn) > 2004) ORDER BY TimeClockPlus.dbo.EmployeeList.Department, TimeClockPlus.dbo.EmployeeList.LastName This took 27 seconds though the front end. I rebuilt it useing temp tables.SELECT DepartmentInto #department FROM user_ccc WHERE ccuserid = suser_sname(suser_sid())SELECT TimeClockPlus.dbo.EmployeeSchedules.EmployeeId, TimeClockPlus.dbo.EmployeeSchedules.RecordId, TimeClockPlus.dbo.EmployeeSchedules.TimeIn, TimeClockPlus.dbo.EmployeeSchedules.TimeOutInto #scheduleFROM TimeClockPlus.dbo.EmployeeSchedules INNER JOIN TimeClockPlus.dbo.EmployeeList ON TimeClockPlus.dbo.EmployeeSchedules.EmployeeId = TimeClockPlus.dbo.EmployeeList.EmployeeId INNER JOIN dbo.#department ON TimeClockPlus.dbo.EmployeeList.Department = dbo.#department.Department AND TimeClockPlus.dbo.EmployeeList.Suspend = 0 AND TimeClockPlus.dbo.EmployeeSchedules.TimeIn BETWEEN CAST(@weekstart AS datetime) AND @Weekend AND TimeClockPlus.dbo.EmployeeSchedules.TimeIn < DATEADD(hour, - 1, GETDATE()) AND DATEPART(year, TimeClockPlus.dbo.EmployeeSchedules.TimeIn) > 2004SELECT dbo.#schedule.RecordIdInto #schedule2 FROM dbo.#schedule INNER JOIN TimeClockPlus.dbo.EmployeeHours ON dbo.#schedule.EmployeeId = TimeClockPlus.dbo.EmployeeHours.EmployeeId AND dbo.#schedule.TimeIn BETWEEN DATEADD(hour, - 3, TimeClockPlus.dbo.EmployeeHours.TimeIn) AND DATEADD(hour, 4, TimeClockPlus.dbo.EmployeeHours.TimeIn)SELECT dbo.#schedule.EmployeeId, dbo.#schedule.RecordId, dbo.#schedule.TimeIn, dbo.#schedule.TimeOutInto #schedule3FROM dbo.#schedule LEFT OUTER JOIN dbo.#schedule2 ON dbo.#schedule.RecordId = dbo.#schedule2.RecordIdWHERE dbo.#schedule2.RecordId IS NULLSELECT dbo.#schedule3.RecordId, TimeClockPlus.dbo.EmployeeList.LastName + ' ' + TimeClockPlus.dbo.EmployeeList.FirstName As ename, dbo.#schedule3.EmployeeId,dbo.#schedule3.TimeIn,dbo.#schedule3.TimeOut,dbo.Absence_excused.Calledoff,dbo.Absence_excused.excuse,Points = case when dbo.Absence_excused.excuse is null and (dbo.Absence_excused.Calledoff is null or dbo.Absence_excused.Calledoff = 0) Then '3' when dbo.Absence_excused.excuse is null and dbo.Absence_excused.Calledoff = 1 Then '2' when dbo.Absence_excused.excuse is not null and (dbo.Absence_excused.Calledoff = 0 Or dbo.Absence_excused.Calledoff is null) Then '1/2' when dbo.Absence_excused.excuse is not null and dbo.Absence_excused.Calledoff = 1 Then '0' endFROM dbo.#schedule3 INNER JOIN TimeClockPlus.dbo.EmployeeList ON dbo.#schedule3.EmployeeId = TimeClockPlus.dbo.EmployeeList.EmployeeId LEFT OUTER JOIN dbo.Absence_excused ON dbo.#schedule3.RecordId = dbo.Absence_excused.RecordIdThis runs in about 1/2 a second.JimUsers <> Logic |
|
X002548
Not Just a Number
15586 Posts |
Posted - 2006-05-24 : 22:35:52
|
OK, first well, duh, second why isn't this a view, third, I've had a few cockails, fourth, I've had a few cockails, actually 4th, this is not a yk corralll issue, nless, i't the fotht issuesBrett8-)Hint: Want your questions answered fast? Follow the direction in this linkhttp://weblogs.sqlteam.com/brettk/archive/2005/05/25/5276.aspxAdd yourself!http://www.frappr.com/sqlteam |
|
|
X002548
Not Just a Number
15586 Posts |
|
JimL
SQL Slinging Yak Ranger
1537 Posts |
Posted - 2006-05-25 : 08:24:52
|
Drinking at work again Brett? LOLI just could not belive the effect I thought you guys/gals were talking about say 10% performance lag. Of course I rarely use nests anyway but wow!JimUsers <> Logic |
|
|
TG
Master Smack Fu Yak Hacker
6065 Posts |
Posted - 2006-05-25 : 09:42:46
|
I haven't had any cocktails (yet) but Bretts still probably better after a few than I am sober...but anyway:Seems a real comparison would be if you change your NOT IN (select stmnt) to a Left OUTER JOIN (derived table). That way the logic in your "nested" query would be closer to the logic in the final, 1/2 second statment. May still not make a difference but I'd find it intersting.Definately not yak forum stuff though :) except the drinking part...Be One with the OptimizerTG |
|
|
JimL
SQL Slinging Yak Ranger
1537 Posts |
Posted - 2006-05-25 : 11:11:32
|
Actually I don't know why I put this in here.Maybee I am the one who has been Drinking. Hey Damian please move this so Brett stops picking on me.And he is on my side of the seat he's over the line!!!!TG that's 8 seconds better but not good enough.JimUsers <> Logic |
|
|
|
|
|
|
|