SQL - 更好的两个查询而不是一个大查询

时间:2013-07-10 08:31:50

标签: c# sql sql-server database performance

我正在开发一个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"
}

VS

//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 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

我会说,你可能只是做第一个查询。做有用的。不要过早地优化,如果单个查询太慢,请尝试第二个双查询方法。

答案 2 :(得分:1)

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

  1. 获知您需要查询新数据
  2. 查询新数据
  3. 有几种方法可以实现这种方法。这是一对。

    1. Using Query Notifications,它是.NET支持的SQL Server的内置功能。<​​/ li>
    2. 使用隐含的方法获取数据库表更新的信息,例如this article at SQL Authority blog
    3. 中描述的一个

答案 3 :(得分:0)

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