2014-12-08 6 views
0

현재 성능과 관련하여 질문이 있습니다. 쿼리 성능에 문제가있는 테이블은 이미 수백만 개의 레코드가있을 때마다 사용됩니다.SQL Server 2014 Standard Edition 큰 테이블 성능

CREATE TABLE [dbo].[HistorySampleValues] 
(
    [HistoryParameterID] [int] NOT NULL, 
    [SourceTimeStamp] [datetime2](7) NOT NULL, 
    [ArchiveTimestamp] [datetime2](7) NOT NULL CONSTRAINT [DF__HistorySa__Archi__2A164134] DEFAULT (getutcdate()), 
    [ValueStatus] [int] NOT NULL, 
    [ArchiveStatus] [int] NOT NULL, 
    [IntegerValue] [bigint] SPARSE NULL, 
    [DoubleValue] [float] SPARSE NULL, 
    [StringValue] [varchar](100) SPARSE NULL, 
    [EnumNamedSetName] [varchar](100) SPARSE NULL, 
    [EnumNumericValue] [int] SPARSE NULL, 
    [EnumTextualValue] [varchar](256) SPARSE NULL 
) ON [PRIMARY] 

CREATE CLUSTERED INDEX [Source_HistParameterID_Index] ON [dbo].[HistorySampleValues] 
(
    [HistoryParameterID] ASC, 
    [SourceTimeStamp] ASC 
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
GO 

그것은 HistoryParameterIDSourceTimeStamp에 클러스터 된 인덱스와 상당히 평평 :

는 테이블입니다.

HistoryParameterIDSourceTimestamp (가) 첫 번째 쿼리에 대한 매개 변수로 사용되는 볼 수 있듯이 내가

SET NOCOUNT ON; 
    DECLARE @SqlCommand NVARCHAR(MAX) 

    SET @SqlCommand = 'SELECT HistoryParameterID, 
          SourceTimestamp, ArchiveTimestamp,ValueStatus,ArchiveStatus, 
          IntegerValue,DoubleValue,StringValue,EnumNumericValue, 
          EnumTextualValue,EnumNamedSetName 
         FROM [HistorySampleValues] WITH(NOLOCK) 
         WHERE ([HistoryParameterID] =' + @ParamIds + ' 
         AND 
         [SourceTimeStamp] >= ''' + CONVERT(VARCHAR(30),@StartTime, 25) + ''' 
    AND   
    [SourceTimeStamp] <= ''' + CONVERT(VARCHAR(30),@EndTime, 25) + ''') 
    AND ValueStatus = ' + @ValueStatus 

    EXECUTE(@SqlCommand) 

를 사용하고 저장 프로 시저입니다. 그리고 ~ 28k 레코드 인 8 시간 분량의 레코드를 검색하면 1.8 초 ~ 700ms의 오차가있는 성능으로 반환됩니다.

디자인 규모가? 그것이 770 억 기록에 도달 할 때마다? 또는 사용할 전략이 있습니까? SQL Server 버전은 Standard Edition이므로 파티션 할 컬럼 스토어는 사용할 수 없습니다. 아니면 SQL Server Standard Edition의 최대 성능에 도달 했습니까?


이 업데이트 된 저장된 프로 시저

@ParamIds int, 
    @StartTime datetime, 
    @EndTime datetime, 
    @ValueStatus int 
AS 
BEGIN 
     SET NOCOUNT ON; 
     SELECT HistoryParameterID, 
     SourceTimestamp, ArchiveTimestamp,ValueStatus,ArchiveStatus, 
     IntegerValue,DoubleValue,StringValue,EnumNumericValue, 
     EnumTextualValue,EnumNamedSetName 
     FROM [HistorySampleValues] WITH(NOLOCK) 
     WHERE 
     HistoryParameterID = @ParamIds 
     AND (SourceTimeStamp >= @StartTime AND SourceTimeStamp <[email protected]) 
     AND (@ValueStatus = -1 OR ValueStatus = @ValueStatus) 

나는 테이블에서 ~ 849,600,000 행 41,213 행을 검색에 1.396 초 클라이언트 처리 시간을 얻었다에게 있습니다.

개선 할 수있는 방법이 있습니까?

+2

왜 동적 쿼리를 알고 싶습니까? – Anil

+0

테스트를 기반으로 동적 쿼리를 사용하여 성능을 향상시킬 수있었습니다. – carlcrol

+0

쿼리를 다시 사용하려는 경우 매개 변수를 사용하면 더 나은 결과를 얻을 수 있습니다. –

답변

0

새 SQL 명령을 실행할 때마다 MS SQL Server에서 컴파일해야합니다. 명령을 다시 사용하면 컴파일 시간을 절약 할 수 있습니다. 이런 식으로 저장 프로 시저에서 명령을 직접 실행해야합니다. 이렇게하면 컴파일이 가능해지며보다 일관된 결과를 얻을 수 있습니다.

SELECT ... 
WHERE ([HistoryParameterID] = @ParamIds 
AND [SourceTimeStamp] >= @StartTime 
AND [SourceTimeStamp] <= @EndTime 
AND ValueStatus = @ValueStatus 

이렇게하면 명령 성능을 모니터링 할 수 있습니다.

+0

올리버에게 감사드립니다. 이것을 시도 할 것이다. – carlcrol

+0

글을 참고하세요 : 질문에 대한 관점에서 SQL Server의 성능은 무엇입니까? 파티없이 표준 에디션에서 경험할 수있는 시나리오를 처리 할 수 ​​있습니까? – carlcrol

+0

안녕하세요 올리버, 당신이 제안을 시도하고 2 ~ 28k 레코드를 동시에 검색하는 2 개의 응용 프로그램으로 시도했습니다. 나는 2 초 평균을 얻었다. 그것은 아주 느리다. – carlcrol