2013-10-05 126 views
-2

我有兩個表Channel和ChannelData。頻道表有40條記錄,每分鐘一條記錄將被插入頻道表的每個頻道的ChannelData表中。現在ChannelData表格中有超過1500萬條記錄。我按照以下方式編寫了一個查詢,以獲取ChannelData表中40個通道的最新記錄值。SQL Server Express上的查詢執行時間太長

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版本正在採取29分鐘得到的結果,但是當我試圖運行SQLServer的2008標準版相同的查詢用了不到1分鐘上具有1500萬條記錄的ChannelData表的數據庫。是否有任何其他方式來編寫此查詢,以便在SQL Server 2008 Express中不到一分鐘就可以得到結果。

回答

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/