您将如何优化此SQL Server 2008 R2表

时间:2011-09-01 00:37:57

标签: sql-server performance optimization

我的浏览器游戏有一个私人消息系统。当我使用查询检查大部分CPU时间时,我看到该表是使用一个CPU的最多CPU。我不熟悉索引,查询时间优化。所以我想获得有关此表的优化提示。

好了,我现在要先向你展示桌面结构:

结构图片

enter image description here

好的,下面的查询会读取用户拥有多少条未读消息,并且此查询是使用一条消息的CPU最多,因为它在每次页面加载时读取:

SELECT COUNT([Id]) [Number] 
FROM [MyTable] 
WHERE [ReceiverUserId] = @1 
  AND [ReceiverReaded] = @2 
  AND [ReceiverDeleted] = @3

那么什么样的索引等可以提高我的表现?

5 个答案:

答案 0 :(得分:4)

为什么要在这些列上允许NULL - 无论是否读取。默认为0.然后对Read / Deleted / ReceivedUser进行索引(按此顺序,如果您需要大量的ALL READ访问权限,它们将被“分区”,或者,如果大多数读取仅适用于单个用户,则在ReceivedUser上放置一个索引)

您要做的是查看您的索引。在您的情况下,您可以在ReceiverUserId和INCLUDE列上放置一个索引ReceiverReaded和ReceiverDeleted,它将覆盖(对于该查询)。在执行计划中,您应该只看到索引查找,因为您只有一个用户。

您可以捕获工作负载,然后通过SQL Server中的索引调整向导运行它,它可能会提供很好的建议。当然,你需要解释它告诉你的内容。

答案 1 :(得分:3)

您总是希望索引所搜索的字段,因此您可以通过在[ReceiverUserId],[ReceiverReaded]和[ReceiverDeleted]上添加索引来提高查询性能。

当然,您索引的列越多,UPDATES和INSERTS的速度就越慢。

答案 2 :(得分:3)

db优化中一个相当简单的经验法则是索引在WHERE子句或JOIN中作为谓词的一部分出现的任何列。从您的示例中可以看出:

  • ReceiverUserId
  • ReceiverReaded
  • ReceiverDeleted

还有一些优化工具可用于“观察”您的数据库,并告诉您索引哪些列以获得最佳性能。

答案 3 :(得分:2)

  1. 索引搜索字段(根据@ PaulStock的回答)。
  2. 将tinyint字段更改为位字段(默认值= 0)
  3. 你的身体真的需要是nvarchar(4000)吗?那太棒了!考虑更短的消息(例如nvarchar(300)或更小 - 作为参考,Twitter只有140。)

答案 4 :(得分:2)

适用于您的应用程序的不同方法:当用户未明确请求任何内容时,请不要查询消息表,例如:当他不在你游戏的“消息”部分时。

尝试使用整数值列扩展您的用户表,指示有多少消息以及已经读取了多少消息。每次修改消息表时,还要修改用户表中的相应值。

这样,您无需在每次刷新时查看整个表格。但请注意,此方法的低迷是程序员的一些额外同步工作。如果你已经正确地封装了消息表的修改(添加消息,阅读消息,删除消息),这应该不是问题。