• 小毛病,大问题


    今天用户抱怨,为什么数据库中条目的计数越来越大,而且清空数据库后重新计数,还是变大?

    其实这是我在设计的时候懒惰造成的,产品使用的是SQLServer数据库,数据库的字段ID是标识列,是自增的,当时没有考虑ID变大的情况,所以就任由着字段编号无限的变大,也没有注意,当用户抱怨的时候,也没太当回事,因为程序没有什么错误呀.

    其实这是一个不好的用户体验,而我们完全可以解决,其实在删除数据或全部删除数据的时候,增加一个校验,如果数据库中记录数目为0,那么就重新设置标识列的计数,也就很简单了,其实我们真的不应该忽视任何细节,就是一个简单的删除记录/清空表,其实都大有学问的.

    在SQLServer中的解决方法如下:

    DBCC CHECKIDENT
    检查指定表的当前标识值,如有必要,还对标识值进行更正。

    举例:
    DBCC CHECKIDENT (TableName,  RESEED, 1)

    强制表中的当前标识值为 1。

    另外一条需要注意的语句是

    TRUNCATE TABLE
    删除表中的所有行,而不记录单个行删除操作。

    DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

    TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。

    若要删除表中的所有行,则 TRUNCATE TABLE 语句是一种快速、无日志记录的方法。该语句总是比不带条件的 DELETE 语句要快,因为 DELETE 语句要记录对每行的删除操作,而 TRUNCATE TABLE 语句只记录整个数据页的释放。TRUNCATE TABLE 语句立即释放由该表的数据和索引占用的所有空间。所有索引的分发页也将释放。

    与 DELETE 语句相同,使用 TRUNCATE TABLE 清空的表的定义,同其索引和其它相关的对象一起仍保留在数据库中。必须使用 DROP TABLE 语句才能除去表的定义。

    呵呵,有些时候看帮助就是不认真,往往几句话,能够对程序性能和效果有很大的改变.
  • 相关阅读:
    Unity在协程内部停止协程自身后代码执行问题
    unity如何停止不用字符串方式开启协程的方法
    解决导入protobuf源代码Unity报错的问题
    FastCGI模式编译安装LAMP+Xcache
    Apache配置防盗链
    Apache配置日志切割
    Apache配置参数的优化
    Apache三种工作模式详解
    隐藏Nginx、Apache、PHP的版本号
    配置Apache控制浏览器端的缓存的有效期
  • 原文地址:https://www.cnblogs.com/Duiker/p/283417.html
Copyright © 2020-2023  润新知