2

我试图在具有数百万条记录的表中选择 SQL Server 中超过 80,000 条记录。问题是我有正确的索引,但返回记录集需要超过 15 分钟。

我使用的是 MS SQL Server 2000,我发现了一种使用存储过程的分页方法,但它使用了一个临时表,我必须插入整个结果集,然后选择每页要显示的记录数量。这种方法耗时太长。

对我可以实施的更快方法有什么帮助吗?

4

4 回答 4

5

您必须对其进行编辑以实现用户过滤和排序选项的输入参数,但一般原则将适用。我在 2000/2001 时间范围内将这种技术与 SQL 2000 一起使用,并使用 90M 记录表来提供 150- 的快速分页200k 行结果集。由于只有key在temp表中,是一个很窄很小的temp表;e,而且性能很快,(这一步只需要读取主表索引,而不是表本身)然后,当实际(较小)返回结果集(仅@PageSize行)从主表生成数据时,查询只需要读取很少的记录......

Create Procedure GetPagedData
@Page Integer = 1,
@PageSize Integer = 100,
@UsersFilteringCOnditions,
@UsersSortOptions
As
Set NoCount On

Declare @Start Integer,
Declare @End Integer
Declare @NumRecs Integer

   -- Declare a temp table variable to hold all the pk values...
   Declare @Keys Table (rowNum integer Identity Primary Key NotNull,
                        keyVal Integer Not Null)

   -- Insert all the Primary Keys into the temp table variable...
   Insert @keys(keyVal)
   Select PrimaryKey From MyMillionRowTable
   Where UsersFilterConditionsAreTrue
   Order By UsersSortOptions

  -- Then, select from your big table only the data 
  -- from the rows for the page the user wants

   Select @NumRecs = Count(*) From Keys 
   Set @End = @Page * @PageSize
   Set @Start = @End + 1 - @PageSize

   Select {Insert ColumnListHere}
   From MyMillionRowTable T
       Join @Keys K On K.KeyVal = T.PrimaryKey 
   Where K.rowNum Between @Start And @End
于 2008-12-19T15:40:28.770 回答
0

有几个选项。通常的数据库调优技巧(我不是专家)。是否可以在后台将您关心的子集数据提取到较小的表中?

于 2008-12-19T14:52:02.253 回答
0

它肯定使用索引吗?是聚集索引吗?检查执行计划。您可能还想重建索引。

如果做不到这一点,请发布查询以及表定义和索引。

它也可能是您的 SQL 配置(正在使用的 RAM 量等)或您的硬件的限制。它是单个磁盘还是 RAID?如果 RAID 有一个驱动器发生故障导致后台重建?

于 2008-12-19T14:56:34.880 回答
0

@jmpena:抱歉,执行计划需要 2% 的书签读取和 98% 的索引扫描

我想你在这里回答了你自己的问题。“98% 扫描索引”。扫描索引仅意味着 SQL 找到了一个索引,该索引可能有助于根据统计信息选择性能。根据索引,操作可能与表扫描本身一样糟糕。

如果正确调整索引/查询,您应该看到的是索引搜索。

你能分享一下桌子上有什么索引吗?(sp_help {tablename})

于 2008-12-19T16:30:00.433 回答