目前我负责的网站用了两台服务器,一台程序,一台数据库其中数据库中有一张表,数据量目前是大于3000万,查询的索引什么的都设置的没错,但是每次在统计数据的时候还是容易卡住,对其他的表的访问造成了严重影响,请问有什么好的解决方法?

解决方案 »

  1.   

    如果只是查找某部分的数据,那的确很快,问题是都是Count(id)这样的查询
    一次有上百个这样的查询
      

  2.   

    从我个人的角度分析,更关注于当前表的JOIN操作,以及涉及I/O的其他表。但最终调查结果都会返回到该表以及查询相关表的索引是否合理且有效。至于LZ已经强调索引设置的没错,在这里提出有效的层级,而不仅仅是建了没有错。这时我是建议跟踪固定时间段的该表trace数据(这可以在Profiler的事件筛选器处理),更细化的分析问题产生的一系列action,当然可以用一些辅助的报表呈现问题,比如readtrace或sqlnexus等。
      

  3.   

    你只是count总记录吗,如果是这样可以通过查询sql server的系统表得出这个表的记录数。
    如果你还要分组的话,是没有办法提高效率的,可以利用复制功能,将这张表复制到另外一个数据库再统计。
      

  4.   

    如果是 SQL Server 2005 或以上版本,可以使用“快照读已提交”(提供语句级的读一致性)或“快照”(提供事务级的读一致性)事务隔离级别。这样,查询将不会请求共享锁,因此不会被其他修改操作阻塞,也不会阻塞其他修改操作。但是 tempdb 数据库会需要更多的存储空间(行版本)。快照读已提交,直接执行 ALTER DATABASE dbname SET READ_COMMITTED_SNAPSHOT ON 语句将正常的读已提交事务隔离级别转换为快照读已提交隔离级别。快照,执行 ALTER DATABASE dbname SET ALLOW_SNAPSHOT_ISOLATION ON 语句开启数据库选项,
    执行 SET TRANSACTION ISOLATION LEVEL SNAPSHOT 语句设置会话的事务隔离级别。
      

  5.   


    这个可以参考,设置这个级别后,读不会影响写。但对tempdb要求比较高。
    这是SQL Server学习ORACLE引进的一个特性。