3

2 つのテーブルCompany(ほぼ 60K レコード) とPosition(ほぼ 600K レコード) があるとします。

Companyテーブル:

CompanyID     INT                --PRIMARY KEY
CompanyName   NVARCHAR(100)      
CompanyType   INT               --Just can be (1,2,3,4,5,6)     

Positionテーブル:

PositionID       INT             --Primary key
PositionName     NVARCHAR(100)   
CompanyID        INT             --FK point to Company Table
WorkExperience   INT             --Just can be (1,2,3,4,5,6,7,8) 
WorkType         INT             --Just can be (1,2) 
CreateTime       datetime
UpdateTime       datetime

テーブルに を作成しNONCLUSTERED INDEXました:Company

CREATE NONCLUSTERED INDEX [IX_1] ON [dbo].[Company] 
(
    [CompanyKind] ASC
)
INCLUDE ( [CompanyName]) ON [PRIMARY]
GO

そしてNONCLUSTERED INDICESPositionテーブルにも2つ作成しました:

CREATE NONCLUSTERED INDEX [IX_6] ON [dbo].[Position] 
(
    [CompanyID] ASC
)ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IX_8] ON [dbo].[Position] 
(
    [UpdateTime] ASC
) ON [PRIMARY]

私のページング ストアド プロシージャは次のようになります。

ALTER PROC [dbo].[spIndexJobList]
    @KeyWord NVARCHAR(50) ,
    @WorkExperience INT ,
    @WorkType INT ,
    @CompanyType INT ,
    @PageSize INT ,
    @PageNumber INT 
    --@RowCount INT OUTPUT
AS 
    DECLARE @RowStart INT
    DECLARE @RowEnd INT
    DECLARE @SQL NVARCHAR(4000)
    DECLARE @ParamDefinition NVARCHAR(2000) 

    SET @SQL = N'SELECT C.CompanyID,C.CompanyName,P.PositionName,P.PositionID,P.UpdateTime, Row_number() OVER (ORDER BY P.UpdateTime DESC) AS RowNumber FROM Company C INNER JOIN Position P ON C.CompanyID=P.CompanyID WHERE 1=1 '
    IF @KeyWord!=''
      SET @SQL = @SQL + ' AND PositionName LIKE @KeyWord'
    IF @WorkExperience !=0 
        SET @SQL = @SQL + ' AND P.WorkExperience=@WorkExperience'
    IF @CompanyType != 0 
        SET @SQL = @SQL + ' AND C.CompanyType=@CompanyType'
    IF @WorkType !=0
        SET @SQL = @SQL + ' AND P.WorkType=@WorkType'
    SET @ParamDefinition = ' @KeyWord    NVarchar(50),
                             @WorkExperience   INT,
                             @WorkType       INT,
                             @CompanyType       INT,
                             @PageSize   INT,
                             @PageNumber INT'
    IF @PageNumber > 0 
        BEGIN
            SET @PageNumber = @PageNumber - 1
            SET @RowStart = @PageSize * @PageNumber + 1 ;
            SET @RowEnd = @RowStart + @PageSize - 1 ;
            SET @SQL = '
        WITH AllJobs
             AS (' + @SQL
                + ')

   SELECT *,(SELECT Count(RowNumber)  FROM   AllJobs) AS TotalRows FROM   AllJobs  WHERE  RowNumber >='
                + STR(@RowStart) + '  AND RowNumber <= ' + STR(@RowEnd) + ''

            EXECUTE sp_Executesql @SQL, @ParamDefinition,
                @KeyWord, @WorkExperience,@WorkType, 
                @CompanyType, @PageSize, @PageNumber

        END 

私の呼び出しステートメントは次のとおりです。

SET STATISTICS IO ON
DECLARE @return_value int
EXEC    @return_value = [dbo].[spIndexJobList]
        @KeyWord='',
        @WorkExperience = 3,
        @CompanyType = 2,
        @WorkType =1,
        @PageSize = 30,
        @PageNumber =2000

SELECT  'Return Value' = @return_value
GO
SET STATISTICS IO OFF

//------------------------------------------------ -----------------------

(30 row(s) affected)
Table 'Company'. Scan count 3, logical reads 632, physical reads 0
Table 'Position'. Scan count 3, logical reads 4865, physical reads 0
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0

//------------------------------------------------ -----------------------

ここに画像の説明を入力

実行プラン プロンプトに (WorkExperience,WorkType) のインデックスがありません。しかし、(WorkExperience、WorkType)クエリでインデックスを作成した後は遅くなります。

誰でも私にいくつかの提案をしていただければ幸いです。私の悪い英語でごめんなさい!

4

4 に答える 4

0

Company.CompanyID と Position.CompanyID にインデックスを付ける必要があります。これら 2 つの列にインデックスを付ける CLUSTER を利用して、行がインデックスと同期して物理的に順序付けられるようにすることもできます。これにより、パフォーマンスが大幅に向上するはずです。

于 2013-07-18T06:06:13.653 に答える
0

次のように、Position に非クラスター化インデックスを作成します。

CREATE NONCLUSTERED INDEX IX_Position_WorkExperienceWorkTypePositionName 
ON Position (WorkExperience, WorkType, PositionName)
INCLUDE (PositionID, UpdateTime)
于 2013-07-18T03:23:03.503 に答える
0

また、以下のように、Company に別の非クラスター化インデックスを作成します。

CREATE NONCLUSTERED INDEX IX_Company_CompanyId_Type
ON Company(CompanyId,CompanyType)

where 句に "C.CompanyType=@CompanyType" が含まれているため、このインデックスがないと、この条件でテーブル スキャン Company が発生します。このインデックスでは、インデックス シークです。

于 2013-07-18T05:50:08.520 に答える