-1

一部の SQL クエリの最適化についてサポートが必要です。私はSQLのパフォーマンスが苦手です。SQL Server 2008 RS Express を使用していますが、DTA を使用できません。

次の 2 つのクエリのインデックスを最適化し、手動で作成するのに役立つ場合があります。

SELECT tblBlogs.RecordID, tblBlogs.RecordText, tblBlogs.CDate, tblBlogs.UserID, tblBlogs.Comments, tblUsers.Username, tblUserpics.UserpicName 
FROM  ( 
      SELECT tblBlogs_2.RecordID, tblBlogs_2.RecordText, tblBlogs_2.CDate, tblBlogs_2.UserID, COUNT(dbo.tblBlogComments.CommentID) AS Comments 
      FROM ( 
      SELECT TOP (150) RecordID, RecordText, CDate, UserID 
           FROM dbo.tblBlogs AS tblBlogs_1 
           ORDER BY RecordID DESC 
           ) AS tblBlogs_2 
      LEFT OUTER JOIN dbo.tblBlogComments ON tblBlogs_2.RecordID = tblBlogComments.RecordID
      GROUP BY tblBlogs_2.RecordID, tblBlogs_2.RecordText, tblBlogs_2.CDate, tblBlogs_2.UserID 
     ) AS tblBlogs  
INNER JOIN dbo.tblUsers ON tblBlogs.UserID = tblUsers.UserID  
LEFT OUTER JOIN dbo.tblUserpics ON tblBlogs.UserID = tblUserpics.UserID
ORDER BY tblBlogs.CDate DESC

これにより、すべてのブログ エントリのユーザーの詳細とコメントを含むブログ テーブルから上位 150 の ros を選択する必要があります。

SELECT f.ForumID, f.ForumName, t.ThreadName, m.MsgID, m.MsgName, m.MsgBody, m.UserID,   m.CDate, m.IP, u.Username, tblCities.CityName, 
t.IsClosed, ISNULL(u.Msgs, 0) AS Posts, ISNULL(tblUserpics.UserpicName, '') AS UserpicName, t.IsPoll,  
t.IsPollMultiple, ISNULL(u.Crashes, 0) AS Crashes, 0 AS LastMsgID, m.IsFlood, ISNULL(u.RepaGood, 0) AS RepaGood, ISNULL(u.RepaBad, 0)  
AS RepaBad, ISNULL(dbo.vMsgsRepaGood.RepaGood, 0) AS MsgRepaGood, ISNULL(dbo.vMsgsRepaBad.RepaBad, 0) AS MsgRepaBad, t.ThreadID, 
tblUserPrivateStatuses.StatusName AS PrivateStatus 
FROM tblMsgs AS m  
INNER JOIN tblThreads AS t ON m.ThreadID = t.ThreadID 
INNER JOIN tblForums AS f ON t.ForumID = f.ForumID  
INNER JOIN tblUsers AS u ON m.UserID = u.UserID  
LEFT OUTER JOIN tblUserPrivateStatuses ON u.UserID = dbo.tblUserPrivateStatuses.UserID  
LEFT OUTER JOIN tblCities ON u.CityID = dbo.tblCities.CityID  
LEFT OUTER JOIN tblUserpics ON u.UserID = dbo.tblUserpics.UserID  
LEFT OUTER JOIN vMsgsRepaGood ON m.MsgID = vMsgsRepaGood.MsgID  
LEFT OUTER JOIN vMsgsRepaBad ON m.MsgID = vMsgsRepaBad.MsgID  
WHERE m.ThreadID = "& ThreadID & " AND IsFlood = 0 
GROUP BY f.ForumID, f.ForumName, t.ThreadName, m.MsgID, m.MsgName, m.MsgBody, m.UserID, m.CDate, m.IP, u.Username, tblCities.CityName, t.IsClosed, u.Msgs, dbo.tblUserpics.UserpicName, t.IsPoll, t.IsPollMultiple, u.Crashes, m.IsFlood, u.RepaGood, u.RepaBad, vMsgsRepaGood.RepaGood, vMsgsRepaBad.RepaBad, t.ThreadID, tblUserPrivateStatuses.StatusName 
ORDER BY m.CDate</pre>

このクエリは、ユーザーの詳細 (登録日、良い/悪い評判の数、クラッシュの数、このフォーラム全体での投稿の数、都市、userpic) を含む、特定のフォーラムの特定のスレッドからのメッセージをフラッディングしないすべてを選択します。

または、誰かがクエリを最適化し、インデックスを作成するための無料ツールについて教えてくれませんか?

4

1 に答える 1

1

ここで話し合うべきことはたくさんありますが、さらに多くの情報がなければ、誰もあなたの質問を完全に支援することはできません.

予防措置: システムの DBA がいる場合は、特に稼働中のシステムでは、インデックスを作成する前に DBA に確認してください。あなたが彼らに親切であれば、彼らは助けることさえできます。システムが他の多くの人によって使用されている場合は、インデックスなどを変更する前に注意してください。

問題を深く掘り下げたくない場合のインデックス作成の基本的なヒントは、次の順序でインデックスを作成することです。

  1. 結合述部
  2. フィルター
  3. 並べ替え / グループ化 / など

また:

  • 可能なすべての列がnullでないことを確認してください。
  • 意味のあるデータ型を使用してください。整数または日付の場合は、varchar として何も格納しないでください。(列幅は重要です。可能であれば、できるだけ小さいデータ型を使用してください。)
  • 結合が同じデータ型 (int から int、varchar から varchar など) であることを確認してください。
  • 可能であれば、各テーブルの各結合述語で一意の非 null インデックスを使用します。

これらすべてを実行すると、順調に進むことができます。しかし、このようなことが定期的に必要な場合は、それを学んでください! 世の中にはたくさんあり、それは深いトピックですが、自分が何をしているのかを知っていれば、クエリをより良くすることができます。

編集: インデックスを作成するための構文は次のとおりです: How do I index a database column . How/Why is here:データベースのインデックス作成はどのように機能しますか?

于 2012-06-15T17:21:13.250 に答える