try this index on your heap table......not quite sure why you are worried about data load speeds...seems you are already deleting data over three days old and adding new. Therefore I am going to assume you have a period at some time to perform this task. You could drop the index first and then recreate once loaded...that may help...but an index on your date may also assist the delete.
anyways...food for thought...here is some test data to paly with...its not a replica of your system ...but it does have 5M rows and some hotels/sites.
kind regards
USE [tempdb]
GO
DROP TABLE [dbo].[Hotel]
GO
DROP TABLE [dbo].[Site]
GO
DROP TABLE [dbo].[TransData]
GO
SELECT TOP 5000000 ---- NOTE 5 MILLION rows
TranID = IDENTITY(INT, 1, 1),
SiteID = 1 + CAST(Abs(Checksum(Newid()) % 10000) AS INT),
HotelID = 1 + CAST(Abs(Checksum(Newid()) % 1000 ) AS INT),
SalesAmount = CAST(Rand(Checksum(Newid())) * 99 + 1 AS DECIMAL(5, 2)),
TransDate = Dateadd(dd, Abs(Checksum(Newid()))%Datediff(dd, '2010', '2013'), '2010')
INTO TransData
FROM sys.all_columns ac1
CROSS JOIN sys.all_columns ac2
CROSS JOIN sys.all_columns ac3
SELECT TOP 500
SiteID = 1 + CAST(Abs(Checksum(Newid()) % 10000) AS INT)
INTO Site
FROM sys.all_columns ac1
CROSS JOIN sys.all_columns ac2
GO
SELECT TOP 50
HotelID = 1 + CAST(Abs(Checksum(Newid()) % 1000) AS INT)
INTO Hotel
FROM sys.all_columns ac1
CROSS JOIN sys.all_columns ac2
GO
set statistics time, IO on
declare @jobdate as datetime
set @jobdate = '2011-07-09'
SELECT Hotel.HotelID, Site.SiteID, TransData.TransDate
FROM TransData INNER JOIN
Site ON TransData.SiteID = Site.SiteID INNER JOIN
Hotel ON TransData.HotelID = Hotel.HotelID
WHERE (TransData.TransDate = @jobdate)
set statistics time, IO OFF
/*create index*/
CREATE NONCLUSTERED INDEX [NIX_transdata] ON [dbo].[TransData]
(
[TransDate] ASC,
[HotelID] ASC,
[SiteID] ASC
) ON [PRIMARY]
GO
set statistics time, IO on
declare @jobdate as datetime
set @jobdate = '2011-07-09'
SELECT Hotel.HotelID, Site.SiteID, TransData.TransDate
FROM TransData INNER JOIN
Site ON TransData.SiteID = Site.SiteID INNER JOIN
Hotel ON TransData.HotelID = Hotel.HotelID
WHERE (TransData.TransDate = @jobdate)
set statistics time, IO OFF
________________________________________________________________
you can lead a user to data....but you cannot make them think
and remember....every day is a school day