0

Users1,000 万件のレコードを含むテーブルがあります。これはテーブル構造です:

CREATE TABLE [dbo].[Users](
    [UsersID] [int] IDENTITY(100000,1) NOT NULL,
    [LoginUsersName] [nvarchar](50) NOT NULL,
    [LoginUsersPwd] [nvarchar](50) NOT NULL,
    [Email] [nvarchar](80) NOT NULL,
    [IsEnable] [int] NOT NULL,
    [CreateTime] [datetime] NOT NULL,
    [LastLoginTime] [datetime] NOT NULL,
    [LastLoginIp] [nvarchar](50) NOT NULL,
    [UpdateTime] [datetime] NOT NULL,
 CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
(
    [UsersID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

列に非クラスター化インデックスがありUpdateTimeます。

ページング SQL:

;WITH UserCTE AS (
   SELECT * FROM 
    (SELECT 
        ROW_NUMBER() OVER (ORDER BY UpdateTime DESC) AS row,UsersID as rec_id -- select primary key only
    FROM 
        dbo.Users WITH (NOLOCK)
    ) A WHERE row BETWEEN 9700000 AND 9700020
)
SELECT
   *
FROM
    dbo.Users WITH (NOLOCK) WHERE UsersID IN (SELECT UserCTE.rec_id FROM UserCTE)

上記のクエリ:

SQL Server parse and compile time: 
CPU time = 0 ms, elapsed time = 3 ms.
(21 row(s) affected)

SQL Server Execution Times:
CPU time = 2574 ms,  elapsed time = 3549 ms.

ここに画像の説明を入力

ページングの速度を向上させる方法についての提案をいただければ幸いです。ありがとう!

4

1 に答える 1

4

これは、動作方法を変更したり、何らかの事前計算を行ったりしなくても、ほぼ同じように見えます。

ページ上のを検索するために使用されるインデックスUserIdは可能な限り狭いです (リーフ ページにはUpdateTimeと のクラスター化インデックス キーのみが含まれますUsersIDdatetime2また、このインデックスに過度の断片化がないことも確認できます。

インデックス付きの順次整数列がある場合は、次のUpdateTimeOrderことができます

SELECT *
FROM dbo.Users
WHERE UpdateTimeOrder BETWEEN 9700000 AND 9700020

INSERTSしかし、並行する/ UPDATES/とともにそのような列を維持DELETESすることは困難です。簡単ではあるが効果的ではない事前計算の 1 つは、インデックス付きビューを作成することです。

CREATE VIEW dbo.UserCount
WITH SCHEMABINDING
AS
SELECT COUNT_BIG(*) AS Count
FROM [dbo].[Users]

GO

CREATE UNIQUE CLUSTERED INDEX IX ON dbo.UserCount(Count)

次に、事前に計算されたカウントを取得しROW_NUMBER() OVER (ORDER BY UpdateTime ASC)、インデックスの半分以上の行を探している場合に別のクエリを呼び出します (もちろん、カウントから元の行番号を減算します)。

しかし、とにかくこれが実際に必要なのはなぜですか?実際に 485,000 ページにアクセスしてくれる人はいますか?

于 2013-06-29T17:21:25.720 に答える