1

編集:LINQで生成されたクエリのサブクエリの問題だと思います.すべてのレコードを取得します...しかし、どうすれば修正できるかわかりません

ビューで SELECT クエリを実行する単純な ASP.NET MVC 2 アプリケーションを作成しましたが、パフォーマンスが非常に低下し、キャッシュを無効にしながら jMeter (10 同時接続) で単純なベンチマークを実行している間 (すべてを実行したくない)カスタマイズ不可能/極端な OutputCache に依存する)

SQL Server が過負荷になり、大量の CPU (最大 100%) とすべての予約済みメモリ スペース (512MB) を消費していることがわかります。

問題を引き起こすアクションコードは次のとおりです(データベースに新しいデータを挿入する他のプログラムでデッドロックが発生するため、手動トランザクション):

public ActionResult Index(int page = 0)
{
    IronViperEntities db = new IronViperEntities();
    db.Connection.Open();
    DbTransaction transaction = db.Connection.BeginTransaction(IsolationLevel.ReadUncommitted);
    var messages = (from globalView in db.GlobalViews orderby globalView.MessagePostDate descending select globalView).Skip(page*perPage).Take(perPage);
    transaction.Commit();
    db.Connection.Close();
    ViewData["page"] = page;
    ViewData["messages"] = messages;
    return View();
}

データベースで実行されるクエリは次のとおりです。

SELECT TOP (100) 
[Extent1].[MessageId] AS [MessageId], 
[Extent1].[MessageUuid] AS [MessageUuid], 
[Extent1].[MessageData] AS [MessageData], 
[Extent1].[MessagePostDate] AS [MessagePostDate], 
[Extent1].[ChannelName] AS [ChannelName], 
[Extent1].[UserName] AS [UserName], 
[Extent1].[UserUuid] AS [UserUuid], 
[Extent1].[ChannelUuid] AS [ChannelUuid]
FROM ( SELECT [Extent1].[MessageId] AS [MessageId], [Extent1].[MessageUuid] AS [MessageUuid], [Extent1].[MessageData] AS [MessageData], [Extent1].[MessagePostDate] AS [MessagePostDate], [Extent1].[ChannelName] AS [ChannelName], [Extent1].[UserName] AS [UserName], [Extent1].[UserUuid] AS [UserUuid], [Extent1].[ChannelUuid] AS [ChannelUuid], row_number() OVER (ORDER BY [Extent1].[MessagePostDate] DESC) AS [row_number]
    FROM (SELECT 
      [GlobalView].[MessageId] AS [MessageId], 
      [GlobalView].[MessageUuid] AS [MessageUuid], 
      [GlobalView].[MessageData] AS [MessageData], 
      [GlobalView].[MessagePostDate] AS [MessagePostDate], 
      [GlobalView].[ChannelName] AS [ChannelName], 
      [GlobalView].[UserName] AS [UserName], 
      [GlobalView].[UserUuid] AS [UserUuid], 
      [GlobalView].[ChannelUuid] AS [ChannelUuid]
      FROM [dbo].[GlobalView] AS [GlobalView]) AS [Extent1]
)  AS [Extent1]
WHERE [Extent1].[row_number] > 0
ORDER BY [Extent1].[MessagePostDate] DESC

コードを表示:

SELECT     dbo.Messages.Id AS MessageId, dbo.Messages.Uuid AS MessageUuid, dbo.Messages.Data AS MessageData, dbo.Messages.PostDate AS MessagePostDate, 
                      dbo.Channels.Name AS ChannelName, dbo.Users.Name AS UserName, dbo.Users.Uuid AS UserUuid, dbo.Channels.Uuid AS ChannelUuid
FROM         dbo.Messages INNER JOIN
                      dbo.Users ON dbo.Messages.UserId = dbo.Users.Id INNER JOIN
                      dbo.Channels ON dbo.Messages.ChannelId = dbo.Channels.Id

サーバー ハードウェアに問題があるとは思いません。同等の Rails/Grails アプリケーションをパフォーマンスの問題なく実行できます。(デュアルコア、3Gb の RAM)

GlobalView の select count(*) は ~270.000 行を返し、インデックスは毎日再構築され、Explain はすべてのクラスター化インデックスを使用していることを示しています。

HTTP の平均応答時間は 8000 ミリ秒です。SQL Server Management Studio は、この SQL クエリの平均 CPU 時間を 866 ミリ秒、平均論理 IO を 7,592.03 と示しています。

〜180MBの場合のデータベースファイルサイズ

Windows Server 2008 R2 Enterprise Edition、IIS 7.5 を搭載した ASP.NET MVC 2、および Advanced Services を搭載した SQL Server 2008 R2 Express Edition を使用しています。これらは、このサーバーで実行されている唯一のものです。

私に何ができる ?

ありがとうございました

4

3 に答える 3

1

SQL Server Profiler からクエリを取得したと思います。結果を保存し、データベース エンジン チューニング アドバイザーに渡します。これは、追加のインデックスと統計を作成するのに役立つ場合があります。

于 2010-08-08T22:15:12.290 に答える
1

好奇心から:.ToList()行末に a を追加すると役に立ちませんvar messages = ...か?

于 2010-08-08T22:20:41.890 に答える