检测我的数据库中的表是否已更改以满足优化需求

时间:2013-03-04 19:19:42

标签: c# asp.net-mvc database optimization

我正在使用Sql Server Compact并正在构建一个MVC应用程序。

获取数据时,许多表都会链接到很多表,由于每次数据加载时都会获取数据并建立链接,这些表最终会演变成复杂的循环和很长的加载时间。

所以我认为优化是一个好主意,其中一种方法是在加载任何数据之前检查数据是否已更改。如果是,则执行总加载,否则请参考实际存在的数据结构。

有没有办法检查数据库表中的数据是否已更改?也许是一种方法?

谢谢!

2 个答案:

答案 0 :(得分:2)

正如Spyro在their answer here中所述:

  

简单的方法是添加一个类型为TIMESTAMP的可为空的列   触发器:

     
    

ON UPDATE CURRENT_TIMESTAMP。

  
     

因此,由于列接受,插入不会更改   nulls,您可以通过以下方式选择新列和更改的列:

SELECT * FROM `table` WHERE `mdate` > '2011-12-21 12:31:22'
     

每次更新行时,此列都会自动更改。

     

以下是一些更多信息:   http://dev.mysql.com/doc/refman/5.0/en/timestamp.html

     

要查看已删除的行,只需创建一个要记录的触发器   每次删除到另一个表:

DELIMITER $$
CREATE TRIGGER MyTable_Trigger
AFTER DELETE ON MyTable
FOR EACH ROW
BEGIN
  INSERT INTO MyTable_Deleted VALUES(OLD.id, NOW());
END$$

或者您可以对所有表格结果执行哈希函数(MD5,SHA1)并保存它像MD5(table); 如果MD5(table);的值发生了变化,表格会发生变化!

// Serialize the table
DataContractSerializer serializer = new DataContractSerializer(typeof(DataTable));
MemoryStream memoryStream = new MemoryStream();
XmlWriter writer = XmlDictionaryWriter.CreateBinaryWriter(memoryStream);
serializer.WriteObject(memoryStream, table);
byte[] serializedData = memoryStream.ToArray();

// Calculte the serialized data's hash value
SHA1CryptoServiceProvider SHA = new SHA1CryptoServiceProvider();
byte[] hash = SHA.ComputeHash(serializedData);

// Convert the hash to a base 64 string
string hashAsText = Convert.ToBase64String(hash);

答案 1 :(得分:0)

你知道,当我构建离线解决方案时,人们可以离线更改数据然后在晚上同步备份,我找到了确定配置数据的最佳方法(很像是什么你要处理的是在每一行都持有timestamp。这种方法运行得很好的原因是因为我可以构建一个表,根据对每个表的简单MAX查询来索引那些timestamp值。所以该表可能如下所示:

CREATE TABLE TimestampIndex (
    TableName SYSNAME PRIMARY KEY,
    LastChange TIMESTAMP
)

然后我可以运行基本查询并在离线时填充该表:

IF EXISTS (SELECT TableName FROM TimestampIndex WHERE TableName = 'Table1')
    UPDATE TimestampIndex SET LastChange = (SELECT MAX(ts) FROM Table1)
ELSE
    INSERT INTO TimestampIndex (TableName, LastChange) SELECT 'Table1', MAX(ts) FROM Table1

然后当他们重新上线时,我可以简单地执行以下操作:

IF NOT EXISTS (SELECT TableName FROM TimestampIndex WHERE TableName = 'Table1' AND LastChange = (SELECT MAX(ts) FROM RemoteDb.dbo.Table1))
BEGIN
    -- there must be changes to make then
END