1

我正在开发一个 C# 应用程序,它从 MS SQL 2008 或 2008 R2 数据库加载数据。该表如下所示:

ID | binary_data | Timestamp

我只需要获取最后一个条目并且只需要二进制数据。此表的条目是从另一个程序不规则添加的,因此我无法知道是否有新条目。哪个版本更好(性能等),为什么?

//Always a query, which might not be needed
public void ProcessData()
{
    byte[] data = "query code get latest binary data from db"
}

对比

//Always a smaller check-query, and sometimes two queries
public void ProcessData()
{
    DateTime timestapm = "query code get latest timestamp from db"
    if(timestamp > old_timestamp)
      data = "query code get latest binary data from db"
}

binary_data 字段大小约为 30kB。函数“ProcessData”将每分钟调用几次,但有时可以每 1-2 秒调用一次。这只是具有大量线程/数据库访问的更大程序的一小部分,所以我想要“最轻”的解决方案。谢谢。

4

4 回答 4

2

幸运的是,你可以同时拥有:

SELECT TOP 1 binary_data
  FROM myTable
 WHERE Timestamp > @last_timestamp
 ORDER BY Timestamp DESC

如果没有比 更新的@last_timestamp记录,则不会返回任何记录,因此不会发生数据传输(= 快速)。如果有新记录,则立即返回最新的二进制数据(= 无需第二次查询)。

于 2013-07-10T08:41:35.197 回答
1

我建议您使用这两种方法进行测试,因为答案取决于您的用法。模拟一些预期的行为。

不过我会说,你可能只做第一个查询就可以了。做有效的事。不要过早优化,如果单个查询太慢,请尝试第二种双查询方法。

于 2013-07-10T08:37:59.047 回答
1

从系统的整体工作量的角度来看,两步法更有效:

  1. 获悉您需要查询新数据
  2. 查询新数据

有几种方法可以实现这种方法。这是一对。

  1. 使用.NET 支持的 SQL Server 的内置功能查询通知。
  2. 使用获取数据库表更新通知的隐含方法,例如SQL 权威博客的这篇文章中描述的方法
于 2013-07-10T09:08:19.600 回答
0

我认为更好的路径是将逻辑保存在数据库中的存储过程,带有所需数据的输出参数和像 TRUE/FALSE 这样的返回值来表示新数据的存在

于 2013-07-10T08:38:07.357 回答