2010-04-13 5 views
2

이전 question을 기반으로하고 Damir Sudarevic (감사)의 도움을 많이 받았다. 다음과 같은 위대한 코드는 있지만 속도는 매우 느리다. 누구든지이 속도를 높이고 속도를 최적화 할 수있는 방법을 제안 할 수 있습니까?뷰를 사용하는 저장 프로 시저에 대한 최적화 속도에 대한 조언

저는 현재 SQL Server Express 2008을 사용하고 있습니다 (2005 년 원래 질문은 아닙니다).

이 코드의 기능은 여러 테이블에서 매개 변수와 관련 값을 검색하고 쉽게 비교할 수있는 형식으로 테이블을 회전시키는 것입니다. 두 행의 데이터 중 하나에 대해 훌륭하지만 지금은 100 행으로 테스트하고 GetJobParameters를 실행하는 데 7 분 이상이 소요됩니다.

아무쪼록 감사드립니다. 진심으로 감사드립니다. @sql_output의

/*********************************************************************************************** 
** CREATE A VIEW (VIRTUAL TABLE) TO ALLOW EASIER RETREIVAL OF PARMETERS 
************************************************************************************************/ 
CREATE VIEW dbo.vParameters AS 
SELECT m.MachineID AS [Machine ID] 
,j.JobID AS [Job ID] 
,p.ParamID AS [Param ID] 
,t.ParamTypeID AS [Param Type ID] 
,m.Name AS [Machine Name] 
,j.Name AS [Job Name] 
,t.Name AS [Param Type Name] 
,t.JobDataType AS [Job DataType] 
,x.Value AS [Measurement Value] 
,x.Unit AS [Unit] 
,y.Value AS [JobDataType] 
FROM dbo.Machines AS m 
JOIN dbo.JobFiles AS j ON j.MachineID = m.MachineID 
JOIN dbo.JobParams AS p ON p.JobFileID = j.JobID 
JOIN dbo.JobParamType AS t ON t.ParamTypeID = p.ParamTypeID 
LEFT JOIN dbo.JobMeasurement AS x ON x.ParamID = p.ParamID 
LEFT JOIN dbo.JobTrait AS y ON y.ParamID = p.ParamID 

GO 

-- Step 2 
CREATE VIEW dbo.vJobValues AS 
SELECT [Job Name] 
     ,[Param Type Name] 
     ,COALESCE(cast([Measurement Value] AS varchar(50)), [JobDataType]) AS [Val] 
FROM dbo.vParameters 

GO 

/*********************************************************************************************** 
** GET JOB PARMETERS FROM THE VIEW JUST CREATED 
************************************************************************************************/ 
CREATE PROCEDURE GetJobParameters 
AS 

-- Step 3 

DECLARE @Params TABLE (
id int IDENTITY (1,1) 
,ParamName varchar(50) 
); 

INSERT INTO @Params (ParamName) 
SELECT DISTINCT [Name] 
FROM dbo.JobParamType 

-- Step 4 
DECLARE @qw TABLE(
id int IDENTITY (1,1) 
, txt nchar(300) 
) 

INSERT INTO @qw (txt) 
    SELECT 'SELECT' UNION 
    SELECT '[Job Name]' ; 

INSERT INTO @qw (txt) 
    SELECT ',MAX(CASE [Param Type Name] WHEN ''' + ParamName 
    + ''' THEN Val ELSE NULL END) AS [' + ParamName + ']' 
    FROM @Params 
    ORDER BY id; 

INSERT INTO @qw (txt) 
SELECT 'FROM dbo.vJobValues' UNION 
SELECT 'GROUP BY [Job Name]' UNION 
SELECT 'ORDER BY [Job Name]'; 


-- Step 5 
--SELECT txt FROM @qw 

DECLARE @sql_output VARCHAR (MAX) 
SET @sql_output = ''  -- NULL + '' = NULL, so we need to have a seed 
SELECT @sql_output =  -- string to avoid losing the first line. 
     COALESCE (@sql_output + txt + char (10), '') 
    FROM @qw 

EXEC (@sql_output) 

GO 

출력 :

SELECT                                                                          
[Job Name]                                                                         
,MAX(CASE [Param Type Name] WHEN '001' THEN Val ELSE NULL END) AS [001]                                                          
,MAX(CASE [Param Type Name] WHEN '002' THEN Val ELSE NULL END) AS [002]                                                          
,MAX(CASE [Param Type Name] WHEN '003' THEN Val ELSE NULL END) AS [003]                                                          
,MAX(CASE [Param Type Name] WHEN '004' THEN Val ELSE NULL END) AS [004]                                                          
,MAX(CASE [Param Type Name] WHEN '005' THEN Val ELSE NULL END) AS [005]                                                          
,MAX(CASE [Param Type Name] WHEN '006' THEN Val ELSE NULL END) AS [006]                                                          
,MAX(CASE [Param Type Name] WHEN '007' THEN Val ELSE NULL END) AS [007]                                                          
,MAX(CASE [Param Type Name] WHEN '008' THEN Val ELSE NULL END) AS [008]                                                          
,MAX(CASE [Param Type Name] WHEN '009' THEN Val ELSE NULL END) AS [009]                                                          
,MAX(CASE [Param Type Name] WHEN '010' THEN Val ELSE NULL END) AS [010]                                                          
,MAX(CASE [Param Type Name] WHEN '011' THEN Val ELSE NULL END) AS [011]                                                          
,MAX(CASE [Param Type Name] WHEN '012' THEN Val ELSE NULL END) AS [012]                                                          
,MAX(CASE [Param Type Name] WHEN '013' THEN Val ELSE NULL END) AS [013]                                                          
,MAX(CASE [Param Type Name] WHEN '014' THEN Val ELSE NULL END) AS [014]                                                          
,MAX(CASE [Param Type Name] WHEN '015' THEN Val ELSE NULL END) AS [015]                                                          
,MAX(CASE [Param Type Name] WHEN '016' THEN Val ELSE NULL END) AS [016]                                                          
,MAX(CASE [Param Type Name] WHEN 'Acceptance' THEN Val ELSE NULL END) AS [Acceptance]                                                      
,MAX(CASE [Param Type Name] WHEN 'AdditionalOptionsAperture1' THEN Val ELSE NULL END) AS [AdditionalOptionsAperture1]                                              
,MAX(CASE [Param Type Name] WHEN 'AdditionalOptionsAperture2' THEN Val ELSE NULL END) AS [AdditionalOptionsAperture2]                                              
,MAX(CASE [Param Type Name] WHEN 'AdditionalOptionsBarcode' THEN Val ELSE NULL END) AS [AdditionalOptionsBarcode]                                               
,MAX(CASE [Param Type Name] WHEN 'AdditionalOptionsFiducial1' THEN Val ELSE NULL END) AS [AdditionalOptionsFiducial1]                                              
,MAX(CASE [Param Type Name] WHEN 'AdditionalOptionsFiducial2' THEN Val ELSE NULL END) AS [AdditionalOptionsFiducial2]                                              
,MAX(CASE [Param Type Name] WHEN 'AlignsFirstPcb' THEN Val ELSE NULL END) AS [AlignsFirstPcb]                                                    
,MAX(CASE [Param Type Name] WHEN 'Aperture1DefinedX' THEN Val ELSE NULL END) AS [Aperture1DefinedX]                                                   
,MAX(CASE [Param Type Name] WHEN 'Aperture1DefinedY' THEN Val ELSE NULL END) AS [Aperture1DefinedY] 

다른 200 선 ...이 스키마입니다

:의 세부 사항에

CREATE TABLE Machines (
     MachineID UNIQUEIDENTIFIER PRIMARY KEY, 
     PrinterType NVARCHAR(255), --UNIQUEIDENTIFIER REFERENCES PrinterTypes(TypeId), 
     Name  NVARCHAR(255), 
     [Desc]  NVARCHAR(MAX), 
     HostName NVARCHAR(255), 
     IP   NVARCHAR(64), -- allows IPv4 and IPv6 
     Serial  NVARCHAR(10), 
     Location NVARCHAR(255)) 
GO 

    CREATE TABLE JobFiles (
     JobID  UNIQUEIDENTIFIER PRIMARY KEY, 
     MachineID UNIQUEIDENTIFIER REFERENCES Machines(MachineID) ON DELETE CASCADE, 
     [Desc]  NVARCHAR(MAX), 
     Name  NVARCHAR(255), 
     JobOpen  BIT, 
     [CreateDate]  DATETIME , 
     [ModifyDate]  DATETIME , 
     [CreatedByUser]  NVARCHAR(64) , 
     [ModifiedByUser] NVARCHAR(64) ) 
GO 

    CREATE TABLE JobParamType (
     ParamTypeID UNIQUEIDENTIFIER PRIMARY KEY, 
     Name  NVARCHAR(255), 
     [Desc]  NVARCHAR(MAX), 
     JobDataType INT) 

GO 
    CREATE TABLE JobParamGroup (
     ParamGroupID UNIQUEIDENTIFIER PRIMARY KEY, 
     Name  NVARCHAR(255), 
     [Desc]  NVARCHAR(MAX)) 

GO 


    CREATE TABLE JobParams (
     ParamID  UNIQUEIDENTIFIER PRIMARY KEY, 
     ParamTypeID UNIQUEIDENTIFIER REFERENCES JobParamType(ParamTypeID) ON DELETE CASCADE, 
     ParamGroupID UNIQUEIDENTIFIER REFERENCES JobParamGroup(ParamGroupID) ON DELETE CASCADE, 
     JobFileID UNIQUEIDENTIFIER REFERENCES JobFiles(JobID) ON DELETE CASCADE, 
     IsEnabled BIT) 

GO 

    -- Text based property 
    CREATE TABLE JobTrait (
     ParamID UNIQUEIDENTIFIER PRIMARY KEY REFERENCES JobParams(ParamID) ON DELETE CASCADE, 
     Value  NVARCHAR(MAX)) 
GO 

    -- Numeric based property 
    CREATE TABLE JobMeasurement (
     ParamID UNIQUEIDENTIFIER PRIMARY KEY REFERENCES JobParams(ParamID) ON DELETE CASCADE, 
     Value FLOAT, 
     Format NVARCHAR(20), 
     Unit NVARCHAR(MAX)) 
+0

@sql_output에 포함 된 내용을 게시 할 수 있습니까? 실행 계획을 봤어? –

+0

"EXEC (@sql_output)"대신 "Print @sql_output"을 실행할 때 SQL Studio Manager에서 볼 수있는 것을 추가했습니다. – Belliez

+0

실행 계획이 무슨 뜻인지 말해 줄 수 있습니까? 저는 SQL 초보자이고 가파른 학습 곡선을 ... 고맙습니다. – Belliez

답변

1

잘하지 않고 다이빙 당신의 데이터베이스 스키마 디자인, 내 첫 번째 질문은 각 조인 조건 자에 인덱스를 만든 것입니다 뷰 정의? 당신의 의견에 응답

.....

데이터베이스를 조정 비 성능에 대한 일반적인 출발점이다 :

  1. 일반적으로 기본 키에, 각 테이블에 클러스터 된 인덱스를 생성 .
  2. T-SQL Join 절에 사용될 가능성이 높기 때문에 모든 외래 키에 대해 클러스터되지 않은 인덱스를 만듭니다. 데이터베이스에 그 자리에 기본 인덱싱 전략없이

나쁜 일이다 (이 테이블의 모든 행을 터치 예) 테이블 스캔을 수행 할 쿼리의 대부분 .....

SQL Server 인덱스에 대한 우수하고 간략한 소개를 위해 다음을 읽어보십시오. Brad's Sure Guide to Indexes

+0

기본 키가 설정되어 있지만 충분하지 않습니다. 스키마와 출력을 포함하도록 내 질문을 수정했습니다. – Belliez

+0

외래 키에 색인을 추가해 주셔서 감사합니다. 7 초에서 30 분으로 2 초가 걸렸습니다. 훌륭 해요, 고맙습니다. – Belliez

+0

@Belliez : 기쁜 소식, 기꺼이 도와 드리겠습니다. –

관련 문제