我试图在具有数百万条记录的表中选择 SQL Server 中超过 80,000 条记录。问题是我有正确的索引,但返回记录集需要超过 15 分钟。
我使用的是 MS SQL Server 2000,我发现了一种使用存储过程的分页方法,但它使用了一个临时表,我必须插入整个结果集,然后选择每页要显示的记录数量。这种方法耗时太长。
对我可以实施的更快方法有什么帮助吗?
我试图在具有数百万条记录的表中选择 SQL Server 中超过 80,000 条记录。问题是我有正确的索引,但返回记录集需要超过 15 分钟。
我使用的是 MS SQL Server 2000,我发现了一种使用存储过程的分页方法,但它使用了一个临时表,我必须插入整个结果集,然后选择每页要显示的记录数量。这种方法耗时太长。
对我可以实施的更快方法有什么帮助吗?
您必须对其进行编辑以实现用户过滤和排序选项的输入参数,但一般原则将适用。我在 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
有几个选项。通常的数据库调优技巧(我不是专家)。是否可以在后台将您关心的子集数据提取到较小的表中?
它肯定使用索引吗?是聚集索引吗?检查执行计划。您可能还想重建索引。
如果做不到这一点,请发布查询以及表定义和索引。
它也可能是您的 SQL 配置(正在使用的 RAM 量等)或您的硬件的限制。它是单个磁盘还是 RAID?如果 RAID 有一个驱动器发生故障导致后台重建?
@jmpena:抱歉,执行计划需要 2% 的书签读取和 98% 的索引扫描
我想你在这里回答了你自己的问题。“98% 扫描索引”。扫描索引仅意味着 SQL 找到了一个索引,该索引可能有助于根据统计信息选择性能。根据索引,操作可能与表扫描本身一样糟糕。
如果正确调整索引/查询,您应该看到的是索引搜索。
你能分享一下桌子上有什么索引吗?(sp_help {tablename})