다음을 통해 공유


저장 프로시저 다시 컴파일

이 항목에서는 Transact-SQL을 사용하여 SQL Server 2014에서 저장 프로시저를 다시 컴파일하는 방법을 설명합니다. 이 WITH RECOMPILE 작업을 수행하는 방법에는 프로시저 정의 또는 프로시저가 호출될 때의 옵션, RECOMPILE 개별 문에 대한 쿼리 힌트 또는 시스템 저장 프로시저를 사용하는 sp_recompile 세 가지 방법이 있습니다. 이 항목에서는 프로시저 정의를 만들고 기존 프로시저를 실행할 때 WITH RECOMPILE 옵션을 사용하는 방법에 대해 설명합니다. 또한 sp_recompile 시스템 저장 프로시저를 사용하여 기존 프로시저를 다시 컴파일하는 방법을 설명합니다.

이 항목에서

시작하기 전에

권장 사항

  • 프로시저를 처음으로 컴파일하거나 다시 컴파일하면 프로시저의 쿼리 계획이 데이터베이스 및 해당 개체의 현재 상태에 최적화됩니다. 데이터베이스의 데이터 또는 구조가 크게 변경되면 프로시저를 다시 컴파일하면 해당 변경 내용에 대한 프로시저의 쿼리 계획이 업데이트되고 최적화됩니다. 이렇게 하면 프로시저의 처리 성능이 향상될 수 있습니다.

  • 프로시저 다시 컴파일을 강제로 적용해야 하는 경우와 프로시저가 자동으로 발생하는 경우도 있습니다. SQL Server를 다시 시작할 때마다 자동 다시 컴파일이 발생합니다. 프로시저에서 참조하는 기본 테이블이 물리적 디자인 변경을 겪은 경우에도 발생합니다.

  • 프로시저를 강제로 다시 컴파일하는 또 다른 이유는 프로시저 컴파일의 "매개 변수 스니핑" 동작을 중화하기 위해서입니다. SQL Server에서 프로시저를 실행할 때 컴파일할 때 프로시저에서 사용하는 모든 매개 변수 값은 쿼리 계획 생성의 일부로 포함됩니다. 이러한 값이 이후에 프로시저가 호출되는 일반적인 값을 나타내는 경우 프로시저는 컴파일하고 실행할 때마다 쿼리 계획의 이점을 누릴 수 있습니다. 프로시저의 매개 변수 값이 자주 비정형인 경우 프로시저를 다시 컴파일하고 다른 매개 변수 값을 기반으로 하는 새 계획을 강제로 적용하면 성능이 향상될 수 있습니다.

  • SQL Server는 프로시저의 문 수준 다시 컴파일을 제공합니다. SQL Server가 저장 프로시저를 다시 컴파일하는 경우 전체 프로시저 대신 다시 컴파일을 발생시킨 문만 컴파일됩니다.

  • 프로시저의 특정 쿼리가 정기적으로 비정형 또는 임시 값을 사용하는 경우 해당 쿼리 내에서 RECOMPILE 쿼리 힌트를 사용하여 프로시저 성능을 향상시킬 수 있습니다. 쿼리 힌트를 사용하는 쿼리만 전체 프로시저 대신 다시 컴파일되므로 SQL Server의 문 수준 다시 컴파일 동작은 모방됩니다. 그러나 RECOMPILE 쿼리 힌트는 프로시저의 현재 매개 변수 값을 사용하는 것 외에도 문을 컴파일할 때 저장 프로시저 내의 모든 지역 변수 값을 사용합니다. 자세한 내용은 쿼리 힌트(Transact-SQL)를 참조하세요.

안전

권한

WITH RECOMPILE 선택
프로시저 정의를 만들 때 이 옵션을 사용하려면 데이터베이스의 CREATE PROCEDURE 권한과 프로시저가 만들어지는 스키마에 대한 ALTER 권한이 필요합니다.

EXECUTE 문에서 이 옵션을 사용하는 경우 프로시저에 대한 EXECUTE 권한이 필요합니다. EXECUTE 문 자체에 대한 사용 권한은 필요하지 않지만 EXECUTE 문에서 참조하는 프로시저에 대한 실행 권한이 필요합니다. 자세한 내용은 EXECUTE(Transact-SQL)를 참조하세요.

RECOMPILE 쿼리 힌트
이 기능은 프로시저가 만들어지고 힌트가 프로시저의 Transact-SQL 문에 포함될 때 사용됩니다. 따라서 데이터베이스의 CREATE PROCEDURE 권한과 프로시저를 만드는 스키마에 대한 ALTER 권한이 필요합니다.

sp_recompile 시스템 저장 프로시저
지정된 프로시저에 대한 ALTER 권한이 필요합니다.

Transact-SQL 사용

WITH RECOMPILE 옵션을 사용하여 저장 프로시저를 다시 컴파일하려면

  1. 데이터베이스 엔진에 연결합니다.

  2. 표준 도구 모음에서 새 쿼리를 클릭합니다.

  3. 다음 예를 복사하여 쿼리 창에 붙여 넣고 실행을 클릭합니다. 이 예제에서는 프로시저 정의를 만듭니다.

USE AdventureWorks2012;  
GO  
IF OBJECT_ID ( 'dbo.uspProductByVendor', 'P' ) IS NOT NULL   
    DROP PROCEDURE dbo.uspProductByVendor;  
GO  
CREATE PROCEDURE dbo.uspProductByVendor @Name varchar(30) = '%'  
WITH RECOMPILE  
AS  
    SET NOCOUNT ON;  
    SELECT v.Name AS 'Vendor name', p.Name AS 'Product name'  
    FROM Purchasing.Vendor AS v   
    JOIN Purchasing.ProductVendor AS pv   
      ON v.BusinessEntityID = pv.BusinessEntityID   
    JOIN Production.Product AS p   
      ON pv.ProductID = p.ProductID  
    WHERE v.Name LIKE @Name;  
  

WITH RECOMPILE 옵션을 사용하여 저장 프로시저를 다시 컴파일하려면

  1. 데이터베이스 엔진에 연결합니다.

  2. 표준 도구 모음에서 새 쿼리를 클릭합니다.

  3. 다음 예를 복사하여 쿼리 창에 붙여 넣고 실행을 클릭합니다. 이 예제에서는 모든 직원(제공된 이름과 성), 직위 및 부서 이름을 보기에서 반환하는 간단한 절차를 만듭니다.

    그런 다음 두 번째 코드 예제를 복사하여 쿼리 창에 붙여넣고 실행을 클릭합니다. 프로시저를 실행하고 프로시저의 쿼리 계획을 다시 컴파일합니다.

USE AdventureWorks2012;  
GO  
EXECUTE HumanResources.uspGetAllEmployees WITH RECOMPILE;  
GO  
  

sp_recompile 사용하여 저장 프로시저를 다시 컴파일하려면

  1. 데이터베이스 엔진에 연결합니다.

  2. 표준 도구 모음에서 새 쿼리를 클릭합니다.

  3. 다음 예를 복사하여 쿼리 창에 붙여 넣고 실행을 클릭합니다. 이 예제에서는 모든 직원(제공된 이름과 성), 직위 및 부서 이름을 보기에서 반환하는 간단한 절차를 만듭니다.

    그런 다음, 다음 예제를 복사하여 쿼리 창에 붙여넣고 실행을 클릭합니다. 프로시저를 실행하지는 않지만 다음에 프로시저가 실행될 때 쿼리 계획이 업데이트되도록 프로시저를 다시 컴파일하도록 표시합니다.

USE AdventureWorks2012;  
GO  
EXEC sp_recompile N'HumanResources.uspGetAllEmployees';  
GO  
  

또한 참조하십시오

저장 프로시저 만들기
저장 프로시저 수정
저장 프로시저 이름 바꾸기
저장 프로시저의 정의 보기
저장 프로시저의 종속성 보기
DROP PROCEDURE(Transact-SQL)