我们有Server 2005。我们的主表是存档表,其中包含近2亿行。有2000个客户端连接服务,因此服务将信息写入存档。我们还有另一个服务,它将客户端的信息作为批处理从归档中获取,并为每一行计算另一些信息,然后将它们重新写入批处理。
在webhand上,我们一次有100到200个用户在线,大多数查询都依赖于归档表。我在归档文件上构建了所有可能的索引,我使用的是.NET Framework3.5。我正在用标准连接字符串连接数据库。
问题是,当用户请求一天长的报告时,它会在10-15秒内返回50行。长达一个月的报告花费更多的时间,如2-3分钟的5k-6k行。我不是DBA,但我们没有DBA,所以我应该解决这个问题。你能对我的问题提出建议吗?
谢谢。
发布于 2012-10-25 12:00:05
由于您没有提供任何详细的信息,我可以建议您观看以下视频布伦特奥扎尔(非常聪明的MVP)。
http://www.toadworld.com/platforms/sql-server/w/wiki/10063.find-missing-indexes.aspx http://www.toadworld.com/platforms/sql-server/w/wiki/10062.find-indexes-not-in-use.aspx
这些视频将为您提供索引工作原理的基本概念,并为您提供脚本,以便在数据库中运行,并检查缺少的索引和未使用的索引。
我希望这些链接能帮助你,就像他们为我做的那样。
发布于 2012-10-25 07:04:41
如果没有更多关于这种情况的信息,我敢提出罪魁祸首和解决办法。
据报道,我假设:
这似乎是快速变化的数据上查询冲突的一个小问题,在OLTP环境中非常常见。
一个简单而快速的解决方案:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED或
WITH(NOLOCK)语句的每个表之后追加SELECT,如:选择.从table1 t1 WITH(NOLOCK)内部加入table2 t2 WITH(NOLOCK) .这将解决查询的问题。
请寻找更多关于事务隔离级别的解释,因为每个级别都提供了一组要考虑的权衡。
此外,随着尘埃落定,仔细评估所有创建的索引,掉下那些不需要的索引。
正如marc_s所观察到的,太多的索引可能比没有索引更糟糕。
https://dba.stackexchange.com/questions/21946
复制相似问题