【问题标题】:Return partial results from SQL从 SQL 返回部分结果
【发布时间】:2013-12-15 02:52:33
【问题描述】:

设置:

  • asp.net MVC3
  • C#
  • SQL Server 2008 R2
  • jQgrid

我有一个从大型数据库中提取的存储过程。根据用户选择的参数值,这可能会很快返回结果,也可能需要几分钟。

如果条件合适,我经常会超时等待SQL,或者在渲染结果时得到MAXJSONLENGTH错误。

我希望SQL 以 500 条记录的批次返回结果,C# 序列化并传递批次,jQgrid 在结果可用时加载结果。这会让它感觉更灵敏,并避免超时和最大长度错误。

在找不到更多结果之前进行 ajax 调用以获取更多结果很简单,但我必须确保在后续请求中不会得到任何先前提供的结果。

在另一个方面,我将记录 ID 返回到存储过程以排除结果。在这种情况下,结果中的记录不会太多,但搜索通常会花费很长时间。在处理这么多记录时,我认为这种方法不是一个好主意,但我不确定如何实现这一点。

结果没有排序,因此不能保证再次运行该过程在开始时获得相同的 500 条记录。

你会推荐什么?或者,我是不是想多了? (我不是要求你编写代码——尽管如果你有一个例子也不会抱怨。我只是需要关于如何解决这个问题的新想法)。

【问题讨论】:

    标签: sql-server asp.net-mvc-3 jqgrid-asp.net


    【解决方案1】:

    根据您的问题,我推断有一些请求会返回大量行,从而导致最大长度 json 错误或超时错误。

    我建议您使用分页并让您的查询只返回一组有限的行。您可以通过在 SQL Server 中使用 ROW_NUMBER() 函数来实现这一点,然后在 WHERE 子句中添加过滤条件:

    WHERE RowNum BETWEEN @PageNumber * @PageSize AND (@PageNumber + 1) * @PageSize
    

    对于排序,您可以添加一个 ORDER BY 子句,并且您可以考虑添加一个聚集索引,以防您希望在该表上的几乎所有查询中都使用此顺序。

    【讨论】:

    • 所以,我必须添加 order by 并使用 @@ROW_Number?这会减慢响应速度(订购成本很高)并希望避免这种情况,但我想它会提高用户的明显响应能力。
    • @davids:在定义聚集索引的列上应用顺序。您将失去一些订购时间,但通过返回显着较低的数据量,您将获得更多收益。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2023-02-06
    • 1970-01-01
    相关资源
    最近更新 更多