2014-05-12 4 views
2

나는 모니터링 프로젝트를 진행하고 있으며 데이터를 수집 할 때마다 해당 컬렉션에 대한 새 ID를 생성합니다.인덱싱 된보기를 사용하여 최신 레코드 받기

인덱스 된 뷰에서 최신 코드를 갖고 싶습니다. 이 같은

SELECT THE_ID = MAX(THE_ID) FROM [dbo].[monit_server_space_by_drive] 

뭔가 :

CREATE VIEW V_LAST_ID 
WITH SCHEMABINDING 
AS 
SELECT THE_ID = MAX(THE_ID) FROM [dbo].[monit_server_space_by_drive] 

CREATE UNIQUE CLUSTERED INDEX UC_IDX_V_LAST_ID ON V_LAST_ID (THE_ID) 

이 가능하거나 어떤 대안이 있습니까?

이 내가 그것을 사용하려는 방법입니다

테이블의 기본 키가 [DBO] [monit_server_space_by_drive] 세 개의 필드로 구성되어
SELECT 
    M.[THE_ID] 
    ,M.[serverid] 
    ,s.SQLServerName 
    ,s.[Environment] 
    ,M.[DRIVE] 
    ,M.[Volume_Size_GB] 
    ,[VolumeUsed_GB] = CAST (M.[VolumeUsed_MB]/1024.00 AS NUMERIC (18,2)) 
    ,M.[VolumeSpaceAvailable_GB] 
, DrivePercentUsed = 100 - M.[VolumePercentAvailable] 
    ,M.[VolumePercentAvailable] 

    FROM [dbo].[monit_server_space_by_drive] M 
    INNER JOIN DBO.V_LAST_ID V 
     ON M.THE_ID = V.THE_ID 
    INNER JOIN [dbo].[tblServers] S 
     ON M.serverid = s.ServerID 
    order by M.[ClusterName] 

:.

USE [Monitoring] 
GO 

ALTER TABLE [dbo].[monit_server_space_by_drive] ADD CONSTRAINT [PK_monit_server_space_by_drive] PRIMARY KEY CLUSTERED 
( [THE_ID] ASC, 
[serverid] ASC, 
[volumeID] ASC 
)ON [FGMONITORING] 

테이블 정의 :

CREATE TABLE [dbo].[monit_server_space_by_drive](
[THE_ID] [int] NOT NULL, 
[serverid] [int] NOT NULL, 
[ClusterName] [nvarchar](260) NOT NULL, 
[nodeid] [int] NOT NULL, 
[DRIVE] [nchar](1) NULL, 
[volumeID] [int] NOT NULL, 
[LastSync] [datetime] NULL, 
[Volume_Size_MB] [numeric](18, 2) NULL, 
[Volume_Size_GB] [numeric](18, 2) NULL, 
[VolumeSpaceAvailable_MB] [numeric](18, 2) NULL, 
[VolumeSpaceAvailable_GB] [numeric](18, 2) NULL, 
[VolumePercentAvailable] [numeric](5, 2) NULL, 
[dt] [datetime] NULL, 
[_year] [smallint] NULL, 
[_month] [tinyint] NULL, 
[_day] [tinyint] NULL, 
[_week] [tinyint] NULL CONSTRAINT [DF_monit_server_space_by_drive__week] DEFAULT ((0)), 
[_hour] [tinyint] NULL, 
[_min] [tinyint] NULL, 
[_weekday] [tinyint] NULL, 
[VolumeUsed_MB] AS ([volume_size_MB]-[volumeSpaceAvailable_MB]) PERSISTED, 
CONSTRAINT [PK_monit_server_space_by_drive] PRIMARY KEY CLUSTERED 
(
[THE_ID] ASC, 
[serverid] ASC, 
[volumeID] ASC 
) ON [FGMONITORING_INDEX] 
) ON [FGMONITORING] 

아래 표는이 테이블에 들어있는 데이터의 예입니다. 연결을 위해 데이터를 수집 할 때마다 THE_ID가 1 씩 증가합니다. 같은 THE_ID 안에는 내 환경에 모든 서버가 있습니다.

enter image description here

답변

1

새 레코드를 삽입 할 때마다이 작업을 수행하려면 뷰의 색인을 업데이트해야합니다.

트리거를 사용하여 마지막 ID를 작은 테이블로 업데이트하는 것이 더 어떨까요?

CREATE TABLE DBO.V_LAST_ID([THE_ID] [int] NOT NULL); 

INSERT DBO.V_LAST_ID (THE_ID) VALUES (0); --Starting row 

CREATE TRIGGER Dbo.KeepV_LAST_IDNumber ON [dbo].[monit_server_space_by_drive] 
AFTER INSERT AS 
BEGIN 
    DECLARE @MaxInserted int; 

    SELECT @MaxInserted = MAX(THE_ID) FROM inserted; 

    UPDATE DBO.V_LAST_ID 
    SET THE_ID = @MaxInserted 
    WHERE THE_ID < @MaxInserted; 
END 

이 표는보기 대신 원하는대로 사용할 수 있습니다.

1

는 THE_ID는 [dbo가]. [monit_server_space_by_drive] 테이블에 고유 클러스터 된 인덱스로 정의되어 있습니까? 현장이 신분입니까? 그렇다면 인덱스 된 뷰를 사용하여 어떤 이득도 얻지 못할 것이라고 생각합니다.

Set Statistics IO ON; 
Set Statistics Time ON; 
Select * from V_LAST_ID; 
Set Statistics IO OFF; 
Set Statistics Time OFF; 

또는

Set Statistics IO ON; 
Set Statistics Time ON; 
SELECT THE_ID = MAX(THE_ID) FROM [dbo].[monit_server_space_by_drive]; 
Set Statistics IO OFF; 
Set Statistics Time OFF; 

또는 개별적으로 SSMS에서

Set Statistics IO ON; 
Set Statistics Time ON; 
SELECT Top 1 THE_ID FROM [dbo].[monit_server_space_by_drive] Order by THE_ID Desc 
Set Statistics IO OFF; 
Set Statistics Time OFF; 

실행 각

및 메시지 탭이 표시됩니다 CPU 및 기간 :

는 이러한 가능성의 성능을 비교.

두 대안 솔루션 모두 적어도 인덱싱 된 뷰와 마찬가지로 성능을 발휘할 것으로 생각되지만 직접 테스트해야합니다.

+0

bsivel, 내가 뷰를 사용하는 방법을 추가하고 테이블의 기본 키가 무엇인지 추가하는 질문을 편집했습니다. 나는 현재 인덱싱되지 않고 뷰를 사용하고 있으며 좋은 결과를 얻었습니다. –

+0

THE_ID 필드를 ID로 생성하고 있습니까? 질문에 표 정의를 넣으면 도움이됩니다. – bsivel

+0

bsivel 요청한 모든 정보를 포함하도록 질문을 다시 편집했습니다. 감사. –