반응형
  1. /**********************************************************************************************
    -- Title : [2k5] 실행 계획 캐싱 유형 데모
    -- Reference : mcpworld.com
    -- Key word : parameterization sp_executesql handle 핸들 prepared qeury exec
    **********************************************************************************************/
    ----------------------------------------------------------
    --1. Ad-hoc query
    ----------------------------------------------------------
    USE AdventureWorks;
    GO

    --기존 실행 계획 및 실행 버퍼 풀 초기화
    DBCC FREEPROCCACHE;
    DBCC DROPCLEANBUFFERS;
    GO

    --Space 및 줄 바꿈에 대해서도 서로 다른 실행 계획 생성됨. (Case Sensitive, Space Sensitive)
    SELECT ProductID
    FROM Sales.SalesOrderDetail
    GROUP BY ProductID
    HAVING AVG(OrderQty) > 5
    ORDER BY ProductID;

    SELECT ProductID FROM Sales.SalesOrderDetail
    GROUP BY ProductID
    HAVING AVG(OrderQty) > 5
    ORDER BY ProductId;

    SELECT bucketid, cacheobjtype, objtype, objid, usecounts, sql FROM sys.syscacheobjects order by sql;

    ----------------------------------------------------------
    --2. Auto-parameterized 쿼리
    ----------------------------------------------------------
    USE AdventureWorks;
    GO

    /*
    SELECT is_parameterization_forced FROM master.sys.databases where name = 'AdventureWorks'
    GO
    --0 : Auto-parameterized 비활성화된 상태
    */

    --기존 실행 계획 및 실행 버퍼 풀 초기화
    DBCC FREEPROCCACHE;
    DBCC DROPCLEANBUFFERS;
    GO

    SELECT ProductID, SalesOrderID, LineTotal
     FROM Sales.SalesOrderDetail
    WHERE ProductID = 707
    ORDER BY ProductID;
    GO
     
    SELECT ProductID, SalesOrderID, LineTotal
     FROM Sales.SalesOrderDetail
    WHERE ProductID = 966
    ORDER BY ProductID;
    GO

    --캐싱된 실행 계획 확인 : 각각의 실행 계획이 존재
    SELECT bucketid, cacheobjtype, objtype, objid, sql FROM sys.syscacheobjects order by sql;

    ------------------------------------------
    --현재 Database를 Auto-parameterized 로 설정
    ------------------------------------------
    ALTER DATABASE AdventureWorks
    SET Parameterization FORCED;
    GO

    --기존 실행 계획 및 실행 버퍼 풀 초기화
    DBCC FREEPROCCACHE;
    DBCC DROPCLEANBUFFERS;
    GO

    SELECT ProductID, SalesOrderID, LineTotal
     FROM Sales.SalesOrderDetail
    WHERE ProductID = 707
    ORDER BY ProductID;
    GO

    SELECT ProductID, SalesOrderID, LineTotal
     FROM Sales.SalesOrderDetail
    WHERE ProductID = 966
    ORDER BY ProductID;
    GO

    --캐싱된 실행 계획 확인 : objtype가 Prepared 인 Compiled Plan이 존재
    SELECT bucketid, cacheobjtype, objtype, objid, sql FROM sys.syscacheobjects order by sql
    GO

    --원상 복구
    ALTER DATABASE AdventureWorks
    SET Parameterization SIMPLE;
    GO

    ----------------------------------------------------------
    --3. sp_executesql 쿼리
    ----------------------------------------------------------
    USE AdventureWorks;
    GO

    --기존 실행 계획 및 실행 버퍼 풀 초기화
    DBCC FREEPROCCACHE;
    DBCC DROPCLEANBUFFERS;
    GO

    --실제 실행 계획(CTRL+M)  표시후 다음을 수행
    EXEC sp_executesql N'SELECT p.ProductID, p.Name, p.ProductNumber
    FROM Production.Product p
    INNER JOIN Production.ProductDescription pd
    ON p.ProductID = pd.ProductDescriptionID
    WHERE p.ProductID >= @a', N'@a int', 170
    GO
    --Merge Join 수행

    EXEC sp_executesql N'SELECT p.ProductID, p.Name, p.ProductNumber
    FROM Production.Product p
    INNER JOIN Production.ProductDescription pd
    ON p.ProductID = pd.ProductDescriptionID
    WHERE p.ProductID >= @a', N'@a int', 900
    GO
    --Merge Join 수행

    SELECT bucketid, cacheobjtype, objtype, objid, sql FROM sys.syscacheobjects order by sql;
    GO

    --기존 실행 계획 및 실행 버퍼 풀 초기화
    DBCC FREEPROCCACHE;
    DBCC DROPCLEANBUFFERS;
    GO

    EXEC sp_executesql N'SELECT p.ProductID, p.Name, p.ProductNumber
    FROM Production.Product p
    INNER JOIN Production.ProductDescription pd
    ON p.ProductID = pd.ProductDescriptionID
    WHERE p.ProductID >= @a', N'@a int', 900
    GO
    --Nested Loops Join 수행

    EXEC sp_executesql N'SELECT p.ProductID, p.Name, p.ProductNumber
    FROM Production.Product p
    INNER JOIN Production.ProductDescription pd
    ON p.ProductID = pd.ProductDescriptionID
    WHERE p.ProductID >= @a', N'@a int', 170
    GO
    --Nested Loops Join 수행

    ----------------------------------------------------------
    --4. Prepared 쿼리
    ----------------------------------------------------------
    USE AdventureWorks;
    GO

    --기존 실행 계획 및 실행 버퍼 풀 초기화
    DBCC FREEPROCCACHE;
    DBCC DROPCLEANBUFFERS;
    GO

    Declare @HD int  --Handle 값을 저장
    Exec sp_prepare @HD output,
      N'@a int',
      N'SELECT p.ProductID, p.Name, p.ProductNumber
    FROM Production.Product p INNER JOIN Production.ProductDescription pd
    ON p.ProductID = pd.ProductDescriptionID
    WHERE p.ProductID >= @a'
    Select @HD as Handle

    --핸들 값이 1인 경우
    Exec sp_execute 1,900;
    Exec sp_execute 1,800;
    Exec sp_execute 1,700;

    --캐싱된 실행 계획 확인 : objtype가 Prepared 인 Compiled Plan이 존재
    SELECT bucketid, cacheobjtype, objtype, objid, sql FROM sys.syscacheobjects order by sql
    GO

    ----------------------------------------------------------
    --7. EXEC
    ----------------------------------------------------------
    USE AdventureWorks;
    GO

    --기존 실행 계획 및 실행 버퍼 풀 초기화
    DBCC FREEPROCCACHE;
    DBCC DROPCLEANBUFFERS;
    GO

    Declare @a int
    SET @a = 170
    EXEC ( 'SELECT p.ProductID, p.Name, p.ProductNumber
    FROM Production.Product p INNER JOIN Production.ProductDescription pd
    ON p.ProductID = pd.ProductDescriptionID
    WHERE p.ProductID >= ' + @a)
    GO

    Declare @a int
    SET @a = 900
    EXEC ( 'SELECT p.ProductID, p.Name, p.ProductNumber
    FROM Production.Product p INNER JOIN Production.ProductDescription pd
    ON p.ProductID = pd.ProductDescriptionID
    WHERE p.ProductID >= ' + @a)
    GO

    --캐싱된 실행 계획 확인 : 각각의 실행 계획이 생성된 것을 확인
    SELECT bucketid, cacheobjtype, objtype, objid, sql FROM sys.syscacheobjects order by sql
    GO
반응형

+ Recent posts