2016-04-19 13 views
0

私たちは生物学的実験の構成に役立つWebアプリケーションを用意しています(ユーザーは実験を記述し、実験データをアップロードします)。メインページでは、最初の10回の実験を表示します。次に前へ次へ1 2 3 .. 30.合計カウントで効率的なページ番号をつける方法

私は効率的なカウントとページ付けを効率的に行う方法を私にバグします。現在:

大規模なデータコード> 200.000を扱う場合、このスケールはどのようになりますか?私はランダムな実験をテーブルにインポートしようとしましたが、まだそれはかなりok(300.000実験で0.6秒)を実行します。

私が考えたもう1つの代替案は、追加表statistics (column tableName, column recordsCount)を追加することです。だから、テーブルexperimentsへの各挿入の後に私はrecordsCountstatisticsに増やします(これは、もちろん、SQLトランザクションを使用して1つのテーブルに挿入し、他のテーブルを更新することを意味します)。その逆もまたdelete文(recordsCount--)になります。

ページングの場合、最も効率的な方法は、をSQLのインデックスとして使用することです。他に良い方法はありますか?

結果がフィルタリングされる場合、例えば、 select * from experiment where name like 'name%'、テーブルstatisticsのオプションは失敗します。合計カウントをselect count(id) from experiment where name like 'name%'として取得する必要があります。

アプリケーションはLaravel 3を使用して開発されました。

常に同じことを行うページネーションを開発したいと思います。レコード数は、ページ数やレコードの総数に影響してはなりません。

答えて

0

以下のようなクエリを持っていてください。

CREATE PROCEDURE [GetUsers]  
( 
@Inactive Bit = NULL,  
@Name Nvarchar(500),  
@Culture VarChar(5) = NULL,  
@SortExpression VarChar(50),  
@StartRowIndex Int,  
@MaxRowIndex Int, 
@Count INT OUTPUT  
)  
AS  
BEGIN  



    SELECT ROW_NUMBER()  
    OVER  
    ( 
    ORDER BY  

    CASE WHEN @SortExpression = 'Name' THEN [User].[Name] END,  
    CASE WHEN @SortExpression = 'Name DESC' THEN [User].[Name] END DESC  

    ) AS RowIndex, [User].*  
    INTO #tmpTable 
    FROM [User] WITH (NOLOCK)  
    WHERE (@Inactive IS NULL OR [User].[Inactive] = @Inactive)  
    AND (@Culture IS NULL OR [User].[DefaultCulture] = @Culture)  
    AND [User].Name LIKE '%' + @Name + '%'  



SELECT *  
FROM #tmpTable WITH (NOLOCK)  
WHERE #tmpTable.RowIndex > @StartRowIndex  
AND #tmpTable.RowIndex < (@StartRowIndex + @MaxRowIndex + 1)  

SELECT @Count = COUNT(*) FROM #tmpTable    

IF OBJECT_ID('tempdb..#tmpTable') IS NOT NULL DROP TABLE #tmpTable;  
END 
関連する問題