每次从数据库中检索数据库时更新数据库记录 - 这是一个好习惯吗?

时间:2011-08-19 13:07:28

标签: c# sql database

我正在使用一个sql server,我有一个特定的表,最多可以包含~1百万~~ 1000万个recrdords。

在我检索的每个记录中,我做了一些检查(我运行了一些简单的代码行),然后我想标记在DateTime.Now中检查了记录; 所以我做的是检索记录,检查一些东西,运行'更新'查询将'last_checked_time'字段设置为DateTime.Now,然后移动到下一条记录。 然后我可以获取他们的'last_checked_time'字段(升序)排序的所有记录,然后我可以按照他们的检查时间对它们进行迭代。

这是一个好习惯吗?只要我在那张桌子上的记录不超过1000万,它还能保持快速吗?

我在某处读过,每个'更新'查询实际上都是删除和创建新记录。

我还想提一下,我的ASP.net网站会频繁检索这些记录。

我正在考虑在本地txt文件/二进制文件上写下'last_checked_time',但我猜这将意味着实现数据库已经可以为你做的事情。

5 个答案:

答案 0 :(得分:2)

如果您需要“最后检查时间”值,那么保留它的最佳,最有效的位置是在表格的行上。表格中有多少行并不重要,每次更新都会影响您更新的行。

如何实现更新取决于DBMS,但通常不会通过删除和重新插入行来完成。

答案 1 :(得分:1)

就个人而言,我认为没有任何问题。将最后检查的时间存储在数据库中似乎是完全合理的,特别是因为它可能在查询中使用(例如,查找一周内未检入的记录)。

答案 2 :(得分:1)

也许(只是可能)你可以创建一个包含两行的新表:第一个表中行的id和检查日期。

这样你就不会改变原始表,但是根据数据的使用情况和检查日期,你将被迫进行连接查询,这可能是你也不想做的事情。

答案 3 :(得分:1)

我建议检索您的数据或部分数据,对所有数据进行检查并在事务中发回更新以使数据库更有效地运行。这将减少往返次数。

至于这是一个好习惯,我会说是的,特别是因为你在查询中使用。当然,不要将最后一次检查的时间存储在文件中,并在加载数据库数据后尝试匹配。数据库RDBMS旨在为您有效地处理此问题。不要使用立方体重新发明轮子。

答案 4 :(得分:1)

将“已检查时间”存储为您要更新的行的一部分是有意义的,而不是存储在单独的文件中,甚至存储在数据库中的单独表中。这种方法应该提供最佳性能并有助于保持一致性。涉及多个表或外部数据存储的解决方案可能会引入涉及重大锁定的分布式或多表事务更新的要求,这会对性能产生负面影响并使保证一致性变得更加困难。

一般而言,最小化交易范围的解决方案,以及通过扩展锁定,都值得努力。此外,简单本身也是一个有用的目标。