현재 성능과 관련하여 질문이 있습니다. 쿼리 성능에 문제가있는 테이블은 이미 수백만 개의 레코드가있을 때마다 사용됩니다.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
그것은 HistoryParameterID
및 SourceTimeStamp
에 클러스터 된 인덱스와 상당히 평평 :
이
는 테이블입니다.이
는HistoryParameterID
및
SourceTimestamp
(가) 첫 번째 쿼리에 대한 매개 변수로 사용되는 볼 수 있듯이 내가
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 초 클라이언트 처리 시간을 얻었다에게 있습니다.
개선 할 수있는 방법이 있습니까?
왜 동적 쿼리를 알고 싶습니까? – Anil
테스트를 기반으로 동적 쿼리를 사용하여 성능을 향상시킬 수있었습니다. – carlcrol
쿼리를 다시 사용하려는 경우 매개 변수를 사용하면 더 나은 결과를 얻을 수 있습니다. –