【问题标题】:SQL - Better two queries instead of one big oneSQL - 更好的两个查询而不是一个大查询
【发布时间】:2013-07-10 08:31:49
【问题描述】:

我正在开发一个 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 秒调用一次。这只是具有大量线程/数据库访问的更大程序的一小部分,所以我想要“最轻”的解决方案。谢谢。

【问题讨论】:

  • 尝试使用您的数据和用例自行测试...?
  • 取决于不规则更新的频率以及二进制数据的大小,但我会说除非它接近您检查的频率,否则最好使用 2 查询解决方案。
  • IMO,这将取决于二进制数据新条目的比例。但是为什么你不能总是响应时间戳,如果没有新内容,Data = NULL?

标签: c# sql sql-server database performance


【解决方案1】:

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

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

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

【讨论】:

  • @SamLeach:如果自 @last_timestamp 以来添加了多条记录,则 TOP 1/ORDER BY 组合确保只返回最后一条。
  • 我们不能假设顶部记录将是具有最新时间戳的记录吗?我想我们不应该假设。 ;)
  • @SamLeach:这就是 ORDER BY 的用途!它确保记录按时间戳递减的顺序排序。因此,顶部的将始终是具有最大(= 最近)时间戳的那个。
  • 我的论点是,根据时间戳的性质,它们已经在表中按时间顺序排列。
  • @SamLeach:据我所知,表的“自然”排序取决于表的聚集索引,在这种情况下可能ID ,但我们不确定。 ORDER BY 确保我们获得 TOP 1 返回“正确”记录所需的顺序。
【解决方案2】:

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

不过,我想说的是,您可能只需执行第一个查询即可。做有效的事。不要过早优化,如果单个查询太慢,请尝试您的第二种 two-query 方法。

【讨论】:

    【解决方案3】:

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

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

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

    1. Using Query Notifications 是 .NET 支持的 SQL Server 的内置功能。
    2. 使用隐含的方法来获取数据库表更新的通知,例如this article at SQL Authority blog 中描述的一个

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 2016-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多