-2

我有两个表 Channel 和 ChannelData。Channel Table 有 40 条记录,每分钟都会为 Channel Table 中的每个 Channel 插入一条记录到 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 上运行相同的查询时,在具有 1500 万个 ChannelData 表的数据库上花费了不到 1 分钟记录。有没有其他方法可以编写这个查询,这样我就可以在 SQL Server 2008 Express 中在一分钟内得到结果。

4

1 回答 1

0

您的其他服务器可能定义了更多索引。由于某种原因,默认情况下不包含索引Generate Scripts,因此您可能需要查看它。

使用 SQL Server Profiler 工具(您将在标准 SKU 安装程序中使用它,但您可以将它用于 SQL Server Express)。还要查看Actual Execution Plan(而不是Estimated Execution Plan) 命令,查找Table ScanIndex Scan- 这将揭示可以使用适当索引修复的低效率。

见这里http://blog.sqlauthority.com/2007/03/30/sql-server-index-seek-vs-index-scan-table-scan/

于 2013-10-05T09:00:27.813 回答