【问题标题】:What is the best solution to retrieve large recordsets - more than 3000 rows检索大型记录集的最佳解决方案是什么 - 超过 3000 行
【发布时间】:2011-03-20 11:44:24
【问题描述】:

我有一个包含 3000 行的 SQL Server 表。当我检索这些行时,使用 Select 语句需要一些时间。检索它们的最佳解决方案是什么?

【问题讨论】:

  • 你目前做得怎么样?也许一旦您注意到您的查询,人们可以帮助您优化它。需要更多详细信息才能有效地帮助您。
  • 这里的信息肯定不够。如果您以正确的方式请求它们,3000 条记录并不是一个大问题。请发布您的查询,如果可能,请发布您的架构。
  • 我已经在 Storeprocedure 中正常编写了 select 语句并调用了该 Storeprocedure 。我需要在 GridView 中作为分页
  • 您刚刚为您的问题提供了解决方案 kumar ;) 分页
  • 但检索这些记录需要时间

标签: sql sql-server sql-server-2005 sql-server-2008 pagination


【解决方案1】:

对于这个问题,必须在此处移植您的 SQL 查询,但假设选择语句很简单,我的答案将是

1) 首先选择所需的有限列数。不要使用Select *。如果所需输出中不需要所有列,请使用特定列

2) 如果你的 select 语句有一个过滤器,那么使用过滤器的顺序是它执行最少的操作并获得最佳结果(如果你发布 SQL 语句,那么我当然可以在这方面提供帮助)

3) 为特定字段创建索引,这也有助于提高查询性能

希望对你有帮助

【讨论】:

  • 即使他想要所有他不应该使用的字段 select *,因为数据库需要在另一个表中搜索哪些列是表的一部分。 (即使它被索引,它的性能也不如直接命名列)
  • @pastjean,根据微软的说法,这不是真的:social.msdn.microsoft.com/Forums/en-US/transactsql/thread/…
  • @tster ,据说很难,这是不好的做法,服务器要进行列解析,但对性能的影响不大:比如 10ms 查询中的 0.01ms
  • @pastjean,可能列元数据已经在内存中。即使你给列名,它仍然需要查找元数据,因为它必须知道数据将在元组中的哪个位置排列以及数据的类型。
【解决方案2】:

由于您不想一次显示所有 3000 条记录,因此请在 SQL 语句中使用分页。下面是在 SQL Server 中使用 AdventureWorks 数据库的示例。假设您的每个网页显示 25 条记录,则此语句将获取第 5 页所需的所有记录。 “QueryResults”是一个公用表表达式 (CTE),如果您有数百万条记录,我只获取主键以保持 CTE 较小。之后,我将 QueryResult (CTE) 加入主表 (Product) 并获取我需要的任何列。下面的@PageNumber 是当前页码。在 CTE 中执行“WHERE”和排序语句。

DECLARE @PageNumber int, @PageSize int;
SET @PageSize = 25;
SET @PageNumber = 5;

; WITH QueryResults AS
(
    SELECT TOP (@PageSize * @PageNumber) ROW_NUMBER() OVER (ORDER BY ProductID) AS ROW,
    P.ProductID
    FROM Production.Product P WITH (NOLOCK)
)
SELECT QR.ROW, QR.ProductID, P.Name
FROM QueryResults QR WITH (NOLOCK)
INNER JOIN Production.Product P WITH (NOLOCK) ON QR.ProductID = P.ProductID
WHERE ROW BETWEEN (((@PageNumber - 1) * @PageSize) + 1) AND (@PageSize * @PageNumber)
ORDER BY QR.ROW ASC

【讨论】:

    【解决方案3】:

    3000 条记录对于 SQL Server 2008 来说没什么大不了的,您只需要:-

    1. 避免在 select 语句中使用 *。
    2. 需要正确的索引,你可以尝试包含列
    3. 尝试在主列和外键列上使用索引

    您也可以尝试以不同的方式查询,因为相同的查询可以以不同的方式编写,并比较查询成本和设置时间统计信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2015-05-27
      相关资源
      最近更新 更多