如何在SQL SERVER中选择大量记录

时间:2008-12-19 14:48:25

标签: sql-server records

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

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

我能以更快的方式实施任何帮助吗?

4 个答案:

答案 0 :(得分:3)

你必须编辑它来实现用户的过滤和排序选项的输入参数,但是一般原则将适用..我在2000/2001时间帧中使用这种技术与SQL 2000一起使用90M记录表来提供快速分页对于150-200k行结果集。由于只有密钥在临时表中,它是一个非常狭窄,非常小的临时表; 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

答案 1 :(得分:0)

有一些选择。通常的数据库调优技巧(我不是专家)。是否有可能将您关注的子集数据提取到幕后的小表中?

答案 2 :(得分:0)

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

如果失败,请发布查询以及表定义和索引。

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

答案 3 :(得分:0)

@jmpena:对不起,执行计划从书签中读取2%,并且98%扫描索引

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

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

你能分享桌面上的索引吗? (sp_help {tablename})