【发布时间】:2015-02-02 10:13:51
【问题描述】:
我目前在我的网站上遇到性能问题。情况可以总结如下:
- 这是一个使用 SQL Server 2012 Express 的 .Net Mvc 网站。它托管在 Windows Server 2012 上。
- 核心系统每天大约有 1000 万次 UPDATE 查询(500 万在 2 个不同的表上),另外 1000 万次用于自定义统计目的(同样是 2*500 万)。
- INSERT 查询要少得多。
- MVC 网站没有性能问题,大部分请求由返回纯内容(不是 html)的 1 种方法处理。
由于统计信息不如核心系统重要,而且我看到 SQL Server 遇到了很多困难,我认为将这些统计信息表移到其他地方可能会更好。
主要问题是:在更新占主导地位的情况下,处理 Stats 的最佳方式是什么?这个想法也是只保留一台服务器。
我试图看看可以采取哪些措施来改善这种情况:
- 有一个单独的 SQL Server 数据库用于另一个硬盘上的统计信息?也许 SQL Server 可以更好地呼吸,但我不确定。
- 使用 NoSQL 数据库?我只是对 MongoDb 有一点经验(但不是针对数百万个请求),我很想尝试使用 RavenDB。
- 使用缓存系统? Redis 看起来很棒,但我不确定在 Windows 上运行它是否是个好主意。 AppFabric 是一个可行的选择吗?
对于当前情况的任何相关想法将不胜感激。
谢谢
以下是有关我拥有的统计表的更多信息:
TABLE [dbo].[UserStat](
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserId] [int] NOT NULL,
[Hits] [int] NOT NULL,
[Points] [decimal](38, 6) NOT NULL,
[Date] [datetime] NOT NULL,
[LastHit] [datetime] NOT NULL,
[Ip] [varchar](256) NULL,
)
我这样更新统计数据:
UPDATE [UserStat] SET Hits = Hits + 1, Points = Points + @Points, LastHit = @Last WHERE UserId = @Id AND [Ip] = @Ip AND [Date] = @Date
如果当前用户和日期的行不存在,我创建它:
INSERT INTO [UserStat] ([UserId],[Hits],[Points],[Date],[LastHit],[Ip]) VALUES (@UserId,@Hits,@Points,@Date,@LastHit,@Ip)
有两个索引:
- 1 表示主键
-
1 用于获取和汇总用户的统计信息
INDEX [Select_UpdateUserStatNavigation] ON [dbo].[UserStat]( [UserId] ASC,[Date] ASC) INCLUDE ([Id],[Hits],[Points], [LastHit],[Ip])
服务器是 VPS。日志和数据文件在同一个磁盘上。表中不涉及外键。
以下是我发现查询此表的所有 SELECT 查询:
SELECT Points, Hits, [Date] FROM [UserStat] WHERE UserId = @UId AND [Date] >= @date
SELECT Ip FROM [UserStat] WHERE UserId = @UId AND LastHit >= DATEADD(MINUTE,-15,getdate())
SELECT COUNT(Id) FROM [UserStat] WHERE [LastHit] >= DATEADD(MINUTE,-15,getdate())
但我并不真正担心 SELECT,更关心 UPDATE 的数量^^。
【问题讨论】:
-
是批量更新还是每行更新类型。如果INSERT查询较少,那么更新查询怎么来更多。相同的记录是否更新了多次。是否有任何并发问题。至少您需要企业版。表上有索引吗?
-
我们确实需要您的表的 DDL 来帮助解决这个问题。您还使用物理服务器还是虚拟服务器?您是否将日志和数据文件放在不同的磁盘上?您的表是否涉及任何外键关系?你有什么索引?
-
感谢您的cmets,我在原始问题下方添加了一些信息。关于将日志和数据文件放在不同的磁盘上,当我开始遇到性能问题时,我才发现该信息:/。如果我没记错的话,我需要停止数据库来移动日志文件。有需要我会看看的。
标签: sql-server caching windows-server-2012 nosql