2013-08-14 2 views
4

클러스터되지 않은 인덱스에 대한 클러스터 된 인덱스는 성능을 삽입하기위한 인덱스가없는 클러스터 된 인덱스를 의미합니다.SqlServer 2008에 인덱스가없는 클러스터 된 인덱스 또는 테이블이있는 테이블에서만 삽입 성능을 향상시킬 수 있습니까?

나는 아래와 같이 많은 링크를 보았는데, 클러스터 된 인덱스는 IAM/PFS/bitmap/... 때문에 삽입 작업에 대한 인덱스가없는 것에 비해 더 나은 성능을 보였지만 내 테스트에서는 인덱스가없는 것 같습니다. 클러스터 인덱스보다 빠르다. 무엇이 문제인가?

Removing a Primary Key (Clustered Index) to increase Insert performance http://support.microsoft.com/kb/297861

내 테스트 스크립트 : 어떤 삽입 작업을 위해

------------------------------------------- 
--prepare table with clustered index 
CREATE TABLE [dbo].[BigTable_CI](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [BigChar] [char](4100) NOT NULL 
) 
GO 

CREATE CLUSTERED INDEX CIX_BigTable_CI 
    ON BigTable_CI(id) 
GO 


ALTER TABLE [dbo].[BigTable_CI] 
ADD CONSTRAINT [DF_BigTable_BigChar_CI] DEFAULT ('a') FOR [BigChar] 
GO 

CREATE PROCEDURE [dbo].[AddDataToBigTable_CI] 
(@NumberOfRows bigint)  
AS 
    SET NOCOUNT ON; 

    DECLARE @Counter int = 0; 
    DECLARE @Start datetime = GETDATE(); 
    DECLARE @End  datetime; 
    DECLARE @ElapsedTime int = 0; 
    DECLARE @RowsPerSecond int = 0; 

    WHILE (@Counter < @NumberOfRows) 
     BEGIN 
      INSERT INTO dbo.BigTable_CI DEFAULT VALUES; 
      SELECT @Counter += 1; 
     END; 

    -- Calculate elapsed time and rows/second 
    SET @End = GETDATE(); 
    SET @ElapsedTime = CONVERT(INTEGER, DATEDIFF (second, @Start, @End)); 
    SET @RowsPerSecond = @NumberOfRows/@ElapsedTime; 

    -- Record results in local table 
    INSERT INTO dbo.Results 
    (StartTime, EndTime, ElapsedTime, NumberOfRows, RowsPerSecond) 
    VALUES (@Start, @End, @ElapsedTime, @NumberOfRows, @RowsPerSecond); 

    RETURN; 


------------------------------------------- 
--prepare table without any index at all. 
CREATE TABLE [dbo].[BigTable_NI](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [BigChar] [char](4100) NOT NULL 
) 
GO 

ALTER TABLE [dbo].[BigTable_NI] 
ADD CONSTRAINT [DF_BigTable_BigChar_NI] DEFAULT ('a') FOR [BigChar] 
GO 

CREATE PROCEDURE [dbo].[AddDataToBigTable_NI] 
(@NumberOfRows bigint)  
AS 
    SET NOCOUNT ON; 

    DECLARE @Counter int = 0; 
    DECLARE @Start datetime = GETDATE(); 
    DECLARE @End  datetime; 
    DECLARE @ElapsedTime int = 0; 
    DECLARE @RowsPerSecond int = 0; 

    WHILE (@Counter < @NumberOfRows) 
     BEGIN 
      INSERT INTO dbo.BigTable_NI DEFAULT VALUES; 
      SELECT @Counter += 1; 
     END; 

    -- Calculate elapsed time and rows/second 
    SET @End = GETDATE(); 
    SET @ElapsedTime = CONVERT(INTEGER, DATEDIFF (second, @Start, @End)); 
    SET @RowsPerSecond = @NumberOfRows/@ElapsedTime; 

    -- Record results in local table 
    INSERT INTO dbo.Results 
    (StartTime, EndTime, ElapsedTime, NumberOfRows, RowsPerSecond) 
    VALUES (@Start, @End, @ElapsedTime, @NumberOfRows, @RowsPerSecond); 

    RETURN; 

------------------------------------------- 
--prepare the results table 
    create table dbo.Results 
    (
     StartTime datetime, 
     EndTime datetime, 
     ElapsedTime int, 
     NumberOfRows int, 
     RowsPerSecond int 
    ) 

------------------------------------------- 
--run scripts: 
    exec [dbo].[AddDataToBigTable_NI] 1000000 
    exec [dbo].[AddDataToBigTable_CI] 1000000 
+0

다음을 참조하십시오. http : //social.msdn.microsoft.com/Forums/sqlserver/en-US/600d34c6-d143-4487-bcc8-2876e4a82523/better-insert-performance-on-a-table-only- 클러스터되지 않은 인덱스 또는 테이블없이 인덱스가없는 경우 – Q123

답변

0

는, 인덱스는 인덱스보다 빠른 없다. 테이블에 인덱스가있는 경우 각 행을 삽입 한 후 데이터베이스 서버는 비트 맵 인덱스 또는 인덱스 저장소의 행에 대한 참조를 할당해야합니다. 이는 서버의 오버 헤드입니다. 이것은 초당 삽입되는 행의 수에 영향을 미칩니다.