C# SQL-最好是两个查询,而不是一个大查询

C# SQL-最好是两个查询,而不是一个大查询,c#,sql,sql-server,database,performance,C#,Sql,Sql Server,Database,Performance,我正在开发一个C#应用程序,它从MS SQL 2008或2008 R2数据库加载数据。该表如下所示: ID | binary_data | Timestamp 我只需要得到最后一个条目和二进制数据。此表中的条目是从另一个程序中添加的,因此我无法知道是否有新条目。 哪个版本更好(性能等),为什么 vs 二进制_数据字段大小约为30kB。函数“ProcessData”每分钟调用几次,但有时可以每1-2秒调用一次。这只是具有大量线程/数据库访问的大型程序的一小部分,因此我想使用“最轻”的解决方案。谢

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

ID | binary_data | Timestamp
我只需要得到最后一个条目和二进制数据。此表中的条目是从另一个程序中添加的,因此我无法知道是否有新条目。 哪个版本更好(性能等),为什么

vs


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

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


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

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


不过我想说,您可能可以只执行第一个查询。做有效的事。不要过早地进行优化,如果单个查询太慢,请尝试第二种两个查询方法。

我认为更好的方法是将逻辑保存在数据库中的StoredProcess,带有输出参数和所需数据以及返回值(如TRUE/FALSE)以表示存在新数据的东西

我认为更好的路径是将逻辑保存在数据库中的StoredProcess,具有输出参数和所需数据以及返回值(如TRUE/FALSE)以表示存在新数据的内容幸运的是,您可以同时具有以下两种功能:

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

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

幸运的是,您可以同时获得这两个记录:

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

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

从系统的总体工作负载来看,两步方法更有效:

  • 通知您需要查询新数据
  • 查询新数据
  • 有几种方法可以实现这种方法。这里有一双

  • 这是.NET中支持的SQL Server的内置功能
  • 使用获取数据库表更新信息的隐含方法,例如中所述的方法

  • 从系统的总体工作负载来看,两步方法更有效:

  • 通知您需要查询新数据
  • 查询新数据
  • 有几种方法可以实现这种方法。这里有一双

  • 这是.NET中支持的SQL Server的内置功能
  • 使用获取数据库表更新信息的隐含方法,例如中所述的方法

  • 试着用你的数据和用例自己测试一下…?这取决于不规则更新的频率和二进制数据的大小,但我想说,除非它接近你检查的频率,否则你最好使用2查询解决方案。依我看,这将取决于二进制数据新条目的比率。但是为什么你不能总是响应timestamp,Data=NULL,如果没有什么新的东西呢?试着用你的数据和用例自己测试一下…?这取决于不规则更新的频率和二进制数据的大小,但我想说,除非它接近你检查的频率,否则最好使用2查询解决方案。IMO,它将取决于二进制数据中新条目的比率。但是为什么你不能总是响应timestamp,如果没有新的内容,Data=NULL?@SamLeach:如果自
    @last\u timestamp
    以来添加了多条记录,那么按组合排序的前1/顺序将确保只返回最后一条记录。难道我们不能假设最上面的记录将是具有最新时间戳的记录吗?我想我们不应该假设@萨姆里奇:这就是《订购者》的目的!它确保按时间戳递减的顺序对记录进行排序。因此,最上面的一个总是时间戳最大的一个。我的论点是,根据时间戳的性质,它们在表中已经按时间顺序排列。@SamLeach:据我所知,表的“自然”顺序取决于表的聚集索引,在这种情况下可能是
    ID
    ,但我们不能确定。ORDER BY确保我们获得了TOP 1返回“正确”记录所需的顺序。@SamLeach:如果自
    @last\u timestamp
    以来添加了多条记录,则TOP 1/ORDER BY组合确保只返回最后一条记录。难道我们不能假设TOP记录将是具有最新时间戳的记录吗?我想我们不应该假设@萨姆里奇:这就是《订购者》的目的!它确保按时间戳递减的顺序对记录进行排序。因此,最上面的一个总是时间戳最大的一个。我的论点是,根据时间戳的性质,它们在表中已经按时间顺序排列。@SamLeach:据我所知,表的“自然”顺序取决于表的聚集索引,在这种情况下可能是
    ID
    ,但我们不能确定。ORDER BY确保我们获得TOP 1返回“正确”记录所需的订单。
    SELECT TOP 1 binary_data
      FROM myTable
     WHERE Timestamp > @last_timestamp
     ORDER BY Timestamp DESC