SQL Server 维护建议?
Posted
技术标签:
【中文标题】SQL Server 维护建议?【英文标题】:SQL Server Maintenance Suggestions? 【发布时间】:2009-03-02 16:42:02 【问题描述】:我经营着一个在线摄影社区,似乎该网站在数据库访问方面陷入了爬行,有时会超时。
我认为自己在编写 SQL 查询和设计表方面相当胜任,但我绝不是 DBA……因此问题就来了。
一些背景:
我的站点和 SQL 服务器正在远程主机上运行。我通过 SQL Server Mgmt 从 Visual Studio 和 SQL 更新 ASP.NET 代码。工作室快车。我没有对服务器的物理访问权限。
我所有存储的过程(我想我都得到了)都包装在事务中。
此时主表只有9400条记录。我每晚向该表添加 12 条新记录。
此主表上有一个视图,可将其他几个表中的数据汇集到一个视图中。
辅助表是较小的记录,但更多。一个是 70,000,另一个是 115,000。这些是 #3 中项目的 cmets 和评级记录。
索引位于最需要的字段上。我将它们设置为自动重新计算大表上的统计信息。
当站点停止运行时,如果我运行代码来清除事务日志、更新统计信息、重建主视图以及重建存储过程以获取 cmets,速度就会恢复。但是,我必须手动执行此操作。
遗憾的是,我的用户对这些问题感到沮丧,他们的参与度也在减少。
所以我的问题是......在远程环境中,设置和安排维护计划以保持我的 SQL 数据库在其峰值运行的最佳方式是什么???
非常感谢! KLK
【问题讨论】:
【参考方案1】:我的直觉说你做错了什么。这听起来有点像你听到的那些故事,除非你每晚重新启动服务器,否则某些系统无法保持正常运行:-)
您的查询有问题,您拥有的行数几乎总是与性能无关,而且您的数据库无论如何都非常小。我对 SQL Server 不太熟悉,但我想它有一些非常棒的查询分析工具。我还想象它有一种记录慢速查询的方法。
听起来您确实缺少索引。当然,您可能认为您已经添加了正确的索引,但在您确认正在使用之前,这并不重要。也许您认为您的选择是正确的,但您的查询却表明并非如此。
首先,弄清楚如何记录您的查询。很有可能你有一个杀手在里面做一些索引可以修复的顺序扫描。
其次,您可能有一堆小查询正在杀死它。例如,您可能有一些“用户”对象,每次您从 user_id 查找用户名时都会访问数据库。寻找你查询数据库一百次的地方并用缓存替换它——即使那个“缓存”只不过是一个在请求结束时被擦除的私有变量。
底线是,我真的怀疑它是在 SQL Server 中配置错误的东西。我的意思是,如果你因为系统停顿而不得不每晚重新启动服务器,你会责怪系统还是你的代码?同样的交易...学习 SQL Server 提供的工具,我敢打赌它们非常漂亮:-)
话虽如此,一旦您承认自己做错了事,请享受这个过程。对我来说,没有什么比优化慢速数据库查询更有趣了。令人惊奇的是,您可以使用 10 秒的运行时间将其转换为具有 50 毫秒运行时间的查询,并使用一个放置良好的索引。
【讨论】:
不幸的是,我认为情况并非如此。代码运行得非常好,然后随着时间的推移,完全相同的代码运行缓慢。在我重建索引等之前它不会得到修复。然后它再次以闪电般的速度运行,有一段时间...... 随着时间的推移获得资格,我们谈论的是几周吗?每天重新索引特定表索引的情况并不少见。您的应用程序生成的活动类型将决定您的索引碎片的速度。 很奇怪。什么样的活动需要重建索引?我似乎从未遇到过这种问题,但我听说过。对表格进行了大量更新? 在我确定在事务中包装更新、插入和删除之前,不到一天时间一切都变慢了。它到达了我每天晚上手动运行修复步骤“以防万一”的地方——然后在用户投诉之间间隔了几天。 Cory -- 不知道是什么活动造成的。【参考方案2】:您无需将维护任务设置为维护计划。
只需创建一个存储过程来执行您希望执行的维护任务、索引重建、统计信息更新等。
然后创建一个调用您的存储过程的作业。可以将作业配置为按您想要的时间表运行。
要创建作业,请使用过程 sp_add_job。
要创建计划,请使用过程 sp_add_schedule。
我希望我所详述的内容清晰易懂,但如果您需要进一步的帮助,请随时给我留言。
干杯,约翰
【讨论】:
为什么要在存储过程中而不是在维护的地方呢? 我假设原始发布者使用的是 SQL Server Express,因为他们使用的是 SQL Server Mgmt Studio Express。 SQL Server Express 不支持维护计划,因为您还需要安装集成服务。 其实数据库是SQL Server 2005。Mgmt Studio Express只是我用来连接远程数据库的工具。 确保您为数据库启用了自动更新统计信息,这可能是缓慢缓慢的原因。 如何为整个数据库设置它?我以一次性的方式在索引上完成了它。以上是关于SQL Server 维护建议?的主要内容,如果未能解决你的问题,请参考以下文章