我有一个包含15列和650万条记录的表。 我需要在分页的帮助下从C#端访问此表。我写了一个SP但是需要大约1.30分钟来检索数据。 这是我的存储过程 -
Create Proc demo
(
@startRowIndex int,
@maximumRows int
)
AS
DECLARE @first_id int, @startRow int
SET @startRowIndex = (@startRowIndex - 1) * @maximumRows
IF @startRowIndex = 0
SET @startRowIndex = 1
SET ROWCOUNT @startRowIndex
SELECT @first_id = RecordID FROM edd_business_listings_05282009 ORDER BY RecordID
PRINT @first_id
SET ROWCOUNT @maximumRows
SELECT * FROM edd_business_listings_05282009 WHERE
RecordID >= @first_id
ORDER BY RecordID
SET ROWCOUNT 0
有没有人知道让这种运行更快的方法。
答案 0 :(得分:2)
你的应用程序可以发送最后一个RecordID吗?
让前端更加努力。
创建Proc演示(@startRowID int,@ maximumRows int)AS
SET ROWCOUNT @maximumRows
SELECT * FROM edd_business_listings_05282009 WHERE RecordID> @startRowID ORDER BY RecordID
SET ROWCOUNT 0
答案 1 :(得分:1)
尝试在SQL 2005中使用ROW_NUMBER:http://www.4guysfromrolla.com/webtech/010406-1.shtml
这样的程序会有所帮助:
CREATE PROCEDURE dbo.GetListingPaged
(
@StartRowIndex int,
@MaximumRows int
)
AS
SELECT
RecordID,
Field2 -- Not *
FROM
(
SELECT
RecordID,
Field2 -- Not *
ROW_NUMBER() OVER (ORDER BY RecordID) AS RowRank
FROM edd_business_listings_05282009
) AS ListingWithRowNumbers
WHERE
RowRank > @StartRowIndex
AND
RowRank <= (@StartRowIndex + @MaximumRows)
GO
答案 2 :(得分:1)
好的,当然,这也是我的猜测:
Create Proc demo ( @startRowIndex int, @maximumRows int ) AS
DECLARE @first_id int, @startRow int
SET @startRowIndex = (@startRowIndex - 1) * @maximumRows
IF @startRowIndex = 0 SET @startRowIndex = 1
SELECT TOP (@maximuRows)
{'all columns except N'}
FROM (
Select *, ROW_NUMBER() Over(Order by RecordID) as N
from edd_business_listings_05282009
) As t
WHERE N >= @startRowIndex
ORDER BY RecordID
答案 3 :(得分:1)
最佳解决方案将严重依赖
1.数据经常变化
2.通常情况下,调用sproc以及用户典型页面的深度和
3.在订购是最新的时候,您可以接受多少延迟(如果有的话)。
通常在网站后端,您的用户只会使用前几页,但谷歌机器人可以抨击您的深层页面,因此抨击您的CPU。支持这种实时排序通常只能达到某一点(例如,对前几百或几千行使用row_number())然后切换到在某个时间间隔(可能是每小时)刷新的非规范化排序列表。 / p>
答案 4 :(得分:0)
如果您使用SQL Server 2005,则可以尝试
SELECT field1, field2, fieldN
FROM (SELECT ROW_NUMBER() OVER (ORDER BY RecordID) AS Row,
field1, field2, fieldN FROM edd_business_listings_05282009)
AS ListingsWithRowNumbers
WHERE Row >= @startRowIndex AND Row <= @startRowIndex + @maximumRows
但无论如何,试着重新思考这个架构。在UI中显示数百万条记录(甚至是分页)有什么用?您可以尝试限制记录数量,并且最初仅查询子集...
答案 5 :(得分:0)
尝试在RecordId列上放置一个索引。我认为正在发生的是你在rowcount到位之前进行整个表扫描所以Sql可以命令一切。如果你已经有一个索引而不是其他问题。我已经对记录数量为两倍的表进行了相同的查询,我的执行时间从未超过2秒。
使用ROWCOUNT或Row_Number()在技术上应该在性能方面完成同样的事情,但我会使用Row_Number(),因为它是一种更现代的方式,并且设置rowcount比Row_Number()更复杂不会进入。