-2

Channel と ChannelData の 2 つのテーブルがあります。チャネル テーブルには 40 のレコードがあり、1 分ごとにチャネル テーブルの各チャネルの ChannelData テーブルにレコードが挿入されます。現在、ChannelData テーブルには 1,500 万を超えるレコードが含まれています。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,500 万のデータベースで 1 分もかかりませんでした。記録。SQL Server 2008 Express で 1 分もかからずに結果を取得できるように、このクエリを作成する他の方法はありますか。

4

1 に答える 1

0

他のサーバーには、おそらくさらに多くのインデックスが定義されています。インデックスはGenerate Scripts何らかの理由でデフォルトでは含まれていないため、それを確認することをお勧めします。

SQL Server プロファイラー ツールを使用します (これは Standard SKU インストーラーに含まれていますが、SQL Server Express に対して使用できます)。また、(Actual Execution PlanではなくEstimated Execution Plan) コマンドを見て、適切なインデックスで修正できる非効率性を明らかにするTable Scanor - を探します。Index Scan

ここを参照してくださいhttp://blog.sqlauthority.com/2007/03/30/sql-server-index-seek-vs-index-scan-table-scan/

于 2013-10-05T09:00:27.813 に答える