This is kind of a long story. Since this involves questions on SQL Server 2000 and SS2005, I wasn't sure if this was the right forum. I have an update that runs as part of our data warehouse load each Tuesday morning. When it runs on our production server (SQL Server 2000 SP3 Std, Win Server 2003, 4, 2.7gHz processors, 4M memory, PAE) , the update takes about 9 hrs. 40 min. It starts running at 2 a.m., so it has the server to itself. We borrowed some space on another, underutilized server (SQL Server 2005 RTM Std, 4, 3.6 gHz processors, 4MB memory) and it runs in about THREE MINUTES. I did not expect such a difference. Here is some DDL: UPDATE BAR SET ENCOUNTER = CASE WHEN Orig_Inv_From_Split IS NULL AND A.TOT_CHG > 0 THEN 1 WHEN Orig_Inv_From_Split IS NOT NULL AND A.TOT_CHG > 0 THEN .5 WHEN Orig_Inv_From_Split IS NULL AND A.TOT_CHG < 0 THEN -1 WHEN Orig_Inv_From_Split IS NOT NULL AND A.TOT_CHG < 0 THEN -.5 WHEN Orig_Inv_From_Split IS NULL AND A.TOT_CHG = 0 THEN SIGN(UNITS) WHEN Orig_Inv_From_Split IS NOT NULL AND A.TOT_CHG = 0 THEN SIGN(UNITS) * .5 END FROM BAR INNER JOIN TRANSAC_INV_COUNTER A ON A.INV_NUM = BAR.INV_NUM AND A.COUNTER = BAR.COUNTER WHERE BAR.Bar_Provider_Key <> 840 CREATE TABLE dbo.BAR( GROUP_ZZ_Key int NOT NULL, PATIENT_Key numeric(12, 0) NOT NULL, INVOICE_Key numeric(12, 0) NOT NULL, TRANSACTION_Key numeric(18, 0) NULL, ADM_DT datetime NULL, BAR_Billing_area_Key int NULL, BAR_Specialty_Key int NULL, BAR_Diagnosis_Code_1_Key int NULL, BAR_Diagnosis_Code_3_Key int NULL, BAR_Diagnosis_Code_2_Key int NULL, BAR_Current_FSC_Key int NULL, INV_CRE_DT datetime NULL, INV_CRE_PD int NULL, INV_NUM int NULL, BATCH_NUM int NULL, SEC_USER_NAME varchar(50) NULL, SEC_USER_DEPT varchar(50) NULL, Orig_Inv_From_Split int NULL, BAR_Location_Key int NULL, BAR_Provider_Key int NULL, BAR_Secondary_Provider_Key int NULL, BAR_Medical_Group_Key int NULL, BAR_Place_of_Service_Key int NULL, BAR_Program_Key int NULL, Visit_Number int NULL, BAR_Original_FSC_Key int NULL, BAR_HMO_Profile_Key int NULL, PAY_AMT money NULL, BAR_PAYMENT_CODE_Key int NULL, PAY_CODE_NUM int NULL, MOD varchar(20) NULL, POST_DT datetime NULL, POST_PD int NULL, BAR_Procedure_Code_Key int NULL, BAR_VENDOR_Key int NULL, SER_DT datetime NULL, UNITS numeric(10, 3) NULL, CHARGE_AMOUNT money NULL, ADJ_AMT money NULL, CREDIT_AMT money NULL, DEBIT_AMT money NULL, MEMBER_NUM varchar(20) NULL, BAR_PCP_Key int NULL, BAR_PLAN_Key varchar(10) NULL, BAR_EMPLOYER_Key int NULL, CIN numeric(12, 0) NULL, MC_FFS char(3) NULL, MAX_SER_DT datetime NULL, MIN_SER_DT datetime NULL, Work_RVU money NULL, Total_RVU money NULL, SMG_ANC money NULL, SWMG_ANC money NULL, MGMA_WRVU money NULL, MGMA_TRVU money NULL, MGMA_WTYPE varchar(25) NULL, MGMA_TTYPE varchar(25) NULL, PRYR_WRVU money NULL, PRYR_TRVU money NULL, PRYR_WTYPE varchar(25) NULL, PRYR_TTYPE varchar(25) NULL, COUNTER int IDENTITY(1,1) NOT NULL, ENCOUNTER numeric(12, 9) NULL, MEMBER_FSC_KEY int NULL, DX_NUM varchar(30) NULL, ADJ_FSC_KEY int NULL, CORR_INV_NUM int NULL, MCA_APPROVED_AMT money NULL, LINE_PAY_AMT money NULL, ENCOUNTER_TEST numeric(12, 9) NULL, ANC_TYPE varchar(4) NULL, INJ_CREDIT money NULL, CONTRACTUAL_ADJUSTMENT float NULL, BAD_DEBT_ADJUST float NULL, MC_ALLOWABLE float NULL, REPORTING_CATEGORY varchar(30) NULL, NEW_PATIENTS int NULL, BAR_Referring_Physician_Key int NULL, BAR_Hospital_Key int NULL, SNSMG_ANC money NULL ) ON PRIMARY GO CREATE TABLE dbo.TRANSAC_INV_COUNTER( INV_NUM int NULL, COUNTER int NULL, TOT_CHG money NULL ) ON PRIMARY CREATE CLUSTERED INDEX Ind_Key ON dbo.TRANSAC_INV_COUNTER ( INV_NUM ASC, COUNTER ASC )WITH (PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY] The table BAR has over 17 million rows, table transac_inv_counter has 3.6 million rows. There is a clustered index on both tables. Lots of FK constraints between BAR and other tables that I did not port over to the borrowed server for this test. No triggers on BAR. I ran profiler on the borrowed server, but since it's just the one update statement it really just told me "you are here. I can't run profiler on the production server until mid-month because of processing loads. The execution plan does not look unusual. So what accounts for this difference? Some theories: 1. Yes, SQL Server 2005 is that much faster than SQL Server 2000. 2. A 3.6gHz, 4 way server is that much faster than a 2.7 gHz, 4-way server. 3. Our production server has not had disks defragged in about two years. D drive with .mdf is 410GB, E drive with logs is 135GB, and F with tempdb is 558GB. But we have no idea how long a defrag will take, and I hesitate to tell our user community that it could run overnight or it could take three days. 4. There is something wrong with our production server. We are departmental developers and the server lives in a data center at the mother ship. If it burst into flames, the server monkeys would likely notice it, but they can't run any diagnostics other than "the power light is green". I like theory 1, since in the next few months we are due to get a new server and will go to SS2005. We know we need to defrag the production server, but is there a good way to determine how long that will take? So what am I missing? Any ideas? Thanks.