我有两个表Channel和ChannelData。频道表有40条记录,每分钟一条记录将被插入到频道表中每个频道的ChannelData表中。现在ChannelData表中有超过1500万条记录。我写了一个查询如下,以获取ChannelData表中40个通道的最新记录值。
select
max(chnldata.Id) as ChannelDataId,
chnl.id as ChannelId,
chnl.ChannelName as ChannelName,
chnldata.ChannelValue as channelValue,
chnl.ChannelMonitoringUnits as ChannelUnits,
chnldata.ChannelDataLogTime as channelDataLogTime,
chnl.StationId,
chnldata.Active
from
ChannelData as chnldata
inner join Channel as chnl on chnl.Id = chnldata.ChannelId
where
chnl.Active = 1
and
chnldata.ChannelDataLogTime in
(SELECT
MAX(chnldata1.ChannelDataLogTime)
FROM
ChannelData as chnldata1
where
chnldata1.ChannelId = chnl.Id)
group by
chnldata.Id,
chnl.id,
ChannelName,
ChannelValue,
chnl.ChannelMonitoringUnits,
ChannelDataLogTime,
chnl.StationId,
chnldata.Active
当我在SQLServer 2008 Express Edition上执行此查询时,需要29分钟才能获得结果,但是当我尝试在SQLServer 2008 Standard Edition上运行相同的查询时,使用ChannelData表在数据库上花费的时间不到1分钟1500万条记录。有没有其他方法来编写此查询,以便我可以在不到一分钟的时间内在SQL Server 2008 Express中获得结果。
答案 0 :(得分:0)
您的其他服务器可能定义了更多索引。出于某种原因,默认情况下,索引不包含在Generate Scripts
中,因此您可能需要查看该索引。
使用SQL Server Profiler工具(您将在标准SKU安装程序中使用此工具,但您可以将其用于SQL Server Express)。另请查看Actual Execution Plan
(不 Estimated Execution Plan
)命令,查找Table Scan
或Index Scan
- 这将显示可以解决的效率低下问题适当的指数。
请参阅此处http://blog.sqlauthority.com/2007/03/30/sql-server-index-seek-vs-index-scan-table-scan/