2015-04-14 68 views
0

我有一個包含大約70000000行電話號碼的表。我使用OFFSET來讀取這50個數字。在SQL Server 2014中加速抵消

但它需要很長時間(大約1分鐘)。

但是,該全文索引用於搜索並且不影響偏移量。

我如何加快查詢速度?

SELECT * 
FROM tblPhoneNumber 
WHERE CountryID = @CountryID 
ORDER BY ID 
OFFSET ((@NumberCount - 1) * @PackageSize) ROWS 
FETCH NEXT @PackageSize ROWS ONLY 
+0

爲什麼你只能分批閱讀50份?你能使每批次的行數更高嗎? – Stephan

+0

是的!但我想讀50 50!例如來自美國的50個數字,來自印度的50個數字...... – mohammad

+0

所以你想爲每個國家選擇50行。一次完成所有事情都可以嗎? – Stephan

回答

0

在該表上拋出一個序列,對其進行索引並按順序提取範圍。您也可以使用ID列。

select * 
    FROM tblPhoneNumber 
    WHERE 
     CountryID = @CountryID 
     and Sequence between @NumberCount and (@NumberCount + @PackageSize) 

如果要插入/刪除頻繁,這會留有空隙,所以取決於採用的數字這些批次的代碼,這可能是一個問題,但總的來說這裏的幾個缺口,有可能不成爲你的問題。

0

嘗試使用CROSS APPLY而不是OFFSET FETCH並一次完成。我抓住TOP 2向你展示你可以抓住任意數量的行。

IF OBJECT_ID('tempdb..#tblPhoneNumber') IS NOT NULL 
    DROP TABLE #tblPhoneNumber; 
IF OBJECT_ID('tempdb..#Country') IS NOT NULL 
    DROP TABLE #Country; 

CREATE TABLE #tblPhoneNumber (ID INT, Country VARCHAR(100), PhoneNumber INT); 
CREATE TABLE #Country (Country VARCHAR(100)); 

INSERT INTO #Country 
VALUES ('USA'),('UK'); 

INSERT INTO #tblPhoneNumber 
VALUES (1,'USA',11111), 
     (2,'USA',22222), 
     (3,'USA',33333), 
     (4,'UK',44444), 
     (5,'UK',55555), 
     (6,'UK',66666);  

SELECT * 
FROM #Country 
CROSS APPLY(
       SELECT TOP (2) ID,Country,PhoneNumber --Just change to TOP(50) for your code 
       FROM #tblPhoneNumber 
       WHERE #Country.Country = #tblPhoneNumber.Country 
      ) CA