sql >> データベース >  >> RDS >> Sqlserver

SQL のページネーション - パフォーマンスの問題

    私は常にクエリでアクセスしているデータの量をチェックし、不要な列と行を排除しようとしています.まあ、これらはあなたがすでにチェックしているかもしれない明らかなポイントですが、まだチェックしていない場合に備えて指摘したかっただけです.クエリのパフォーマンスが遅いのは、「Select *」を実行していることが原因である可能性があります。テーブルからすべての列を選択すると、適切な実行計画が得られません。選択した列のみが必要かどうかを確認し、テーブル Orders に正しいカバリング インデックスがあることを確認してください。

    明示的な SKIPP または OFFSET 関数は SQL 2008 バージョンでは使用できないため、作成する必要があり、INNER JOIN によって作成できます。1 つのクエリでは、最初に OrderDate で ID を生成し、そのクエリには他に何もありません。同じことを行います。 2 番目のクエリでは、すべての列が必要な場合は、テーブル ORDER または ALL から他の関連する列も選択します。次に、これを JOIN して ID と OrderDate で結果をクエリし、データ セットが最小サイズの最初のクエリの ADD SKIPP 行フィルターを使用します。このコードを試してください。

        SELECT q2.*
        FROM
        (
            SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, OrderDate
            FROM      Orders
            WHERE     OrderDate >= '1980-01-01'
        )q1
        INNER JOIN 
        (
            SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, *
            FROM      Orders
            WHERE     OrderDate >= '1980-01-01'
        )q2
            ON q1.RowNum=q2.RowNum AND q1.OrderDate=q2.OrderDate AND q1.rownum BETWEEN 30000 AND 30020
    
        IF object_id('TestSelect','u') IS NOT NULL
            DROP TABLE TestSelect
        GO
        CREATE TABLE TestSelect
        (
            OrderDate   DATETIME2(2)
        )
        GO
    
        DECLARE @i bigint=1, @dt DATETIME2(2)='01/01/1700'
        WHILE @I<=2000000
        BEGIN
    
            IF @i%15 = 0
                SELECT @DT = DATEADD(DAY,1,@dt)
    
            INSERT INTO dbo.TestSelect( OrderDate )
            SELECT @dt
    
            SELECT @[email protected]+1
        END
    
        SELECT q2.*
        FROM
        (
            SELECT  ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum 
                    ,OrderDate
            FROM TestSelect
            WHERE OrderDate >= '1700-01-01'
        )q1
        INNER JOIN
        (
            SELECT  ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum 
                    ,*
            FROM TestSelect
            WHERE OrderDate >= '1700-01-01'
        )q2
            ON q1.RowNum=q2.RowNum 
            AND q1.OrderDate=q2.OrderDate 
            AND q1.RowNum BETWEEN 50000 AND 50010
    



    1. cx oracle ImportError

    2. MariaDBサーバーでのAriaストレージエンジンの使用

    3. 大きなmysqlテーブルにインデックスを追加する最も効率的な方法

    4. PL / SQLでスレッドを使用できますか?