2017-11-01 4 views
0

저는 SQL Server를 처음 사용하기 때문에 CMS에서 생성 된 일부 SQL 쿼리를 최적화하는 작업이 할당되었습니다. 내가 코드를'SET SHOWPLAN_ALL'을 추가 한 후 임시 테이블에 잘못된 개체 이름이 throw됩니다. SQL Server MS17

SET SHOWPLAN_ALL ON 
GO; 

을 추가하고 쿼리를 실행 한 후, 로컬 임시 테이블 #tempSecondLevel 문 INTO 내 INSERT의 '잘못된 개체 이름'예외가 발생합니다. SELECT INTO #tmpSecondLevel 문 다음에 INSERT INTO #tmpSecondLevel 문이 나타납니다. 다음 문장은 #tmpFirstLevel을위한 문장이며,이 문장과 관련이 있는지 확실하지 않습니다.

use Kentico8_2; 
go 
set showplan_all on; 
go 

-- Write revised query here. 
DECLARE @ProductNodeGuid uniqueidentifier = '6F6F733D-AE4F-47DC-9BE9-52B967E9F41D' 

IF OBJECT_ID('tempdb..#tmpSecondLevel') IS NOT NULL 
DROP TABLE #tmpSecondLevel 

IF OBJECT_ID('tempdb..#tmpFirstLevel') IS NOT NULL 
DROP TABLE #tmpFirstLevel 

-- Get all of the items(that go on the secondLevel) that go underneath a heading(on the firstLevel) 
-- Get all of the materials that belong to this node that go on the second level 
SELECT 
    NodeLevel = 1 
    ,NodeParentID = CASE WHEN MaterialTypeSelectByMaterial = 0 THEN M.NodeID ELSE M.NodeParentID END 
    ,M.NodeID 
    ,M.MaterialName 
    ,MaterialImage = MV.MaterialVariantImage 
    ,M.NodeAliasPath 
    ,M.Published 
    ,M.NodeGUID 
    ,M.ClassName 
    ,M.NodeOrder 
INTO 
    #tmpSecondLevel 
FROM 
    View_NOF_Material_Joined M 
    JOIN View_NOF_Product_Joined P 
     ON P.ProductMaterialNodeGuidList LIKE '%' + CONVERT(nvarchar(36), M.NodeGUID) + '%' 
    JOIN View_NOF_MaterialType_Joined MT 
     ON MT.NodeID = M.NodeParentID 
    LEFT JOIN View_NOF_MaterialVariant_Joined MV 
     ON MV.NodeParentID = M.NodeID AND MV.NodeOrder = 1 -- always the first 
WHERE 
    P.NodeGUID = @ProductNodeGuid AND MaterialTypeSelectByMaterial = 1 

-- Get all of the material variants that belong to this node that go on the second level 
INSERT INTO 
    #tmpSecondLevel 
SELECT 
    NodeLevel = 1 
    ,NodeParentID = CASE WHEN MaterialTypeSelectByMaterial = 0 THEN M.NodeID ELSE M.NodeParentID END 
    ,MV.NodeID 
    ,MaterialName = MV.MaterialVariantName 
    ,MaterialImage = MV.MaterialVariantImage 
    ,MV.NodeAliasPath 
    ,MV.Published 
    ,MV.NodeGUID 
    ,MV.ClassName 
    ,MV.NodeOrder 
FROM 
    View_NOF_MaterialVariant_Joined MV 
    JOIN View_NOF_Product_Joined P 
     ON P.ProductMaterialNodeGuidList LIKE '%' + CONVERT(nvarchar(36), MV.NodeGUID) + '%' 
    JOIN View_NOF_Material_Joined M 
     ON M.NodeID = MV.NodeParentID 
    JOIN View_NOF_MaterialType_Joined MT 
     ON MT.NodeID = M.NodeParentID 
WHERE 
    P.NodeGUID = @ProductNodeGuid 
     AND MaterialTypeSelectByMaterial = 0 

-- Get all of the headings(for the firstLevel) that go above a list of items(on the secondLevel) 
-- Get all of the material types that are used as headings 
SELECT DISTINCT 
    NodeLevel = 0 
    ,NodeParentID = NULL 
    ,MT.NodeID 
    ,MaterialName = MT.MaterialTypeName 
    ,MaterialImage = '' 
    ,MT.NodeAliasPath 
    ,MT.Published 
    ,MT.NodeGUID 
    ,MT.ClassName 
    ,MT.NodeOrder 
INTO 
    #tmpFirstLevel 
FROM 
    View_NOF_MaterialType_Joined MT 
    INNER JOIN #tmpSecondLevel M 
     ON MT.NodeID = M.NodeParentID 

-- Get all of the materials that are used as headings 
INSERT INTO 
    #tmpFirstLevel 
SELECT DISTINCT 
    NodeLevel = 0 
    ,NodeParentID = NULL 
    ,MJ.NodeID 
    ,MaterialName = MJ.MaterialName 
    ,MaterialImage = '' 
    ,MJ.NodeAliasPath 
    ,MJ.Published 
    ,MJ.NodeGUID 
    ,MJ.ClassName 
    ,MTJ.NodeOrder 
FROM 
    View_NOF_Material_Joined MJ 
    INNER JOIN View_NOF_MaterialType_Joined MTJ 
     ON MTJ.NodeID = MJ.NodeParentID 
    INNER JOIN #tmpSecondLevel M 
     ON MJ.NodeID = M.NodeParentID 

-- Put all of the second level items (the details) and first level items (the headings) in the same table 
SELECT * FROM #tmpSecondLevel 
UNION 
SELECT * FROM #tmpFirstLevel 
ORDER BY NodeOrder 

IF OBJECT_ID('tempdb..#tmpSecondLevel') IS NOT NULL 
DROP TABLE #tmpSecondLevel 

IF OBJECT_ID('tempdb..#tmpFirstLevel') IS NOT NULL 
DROP TABLE #tmpFirstLevel 

이 코드는 두 줄의 코드 만 추가했기 때문에 간단한 질문이지만 예측할 수는 있습니다. 이 쿼리를 최적화하는 데 도움이되는 조언이 있으면 크게 환영합니다.

미리 감사드립니다.

+0

'SELECT * INTO # tmpFirstLevel','INSERT INTO # tmpFirstLevel' 대신에 논리 블록으로 먼저 CREATE TABLE # tmpFirstLevel을, INSERT INTO # tmpFirstLevel을 사용해 주시겠습니까? – Arulkumar

+0

예, 시작했을 때 염두에 두었습니다. 구체적으로하는 것이 좋습니다! @Arulkumar 입력을 주셔서 감사합니다 –

답변

1

SET SHOWPLAN_ALL이 예상 실행 계획을 표시하는 명령이기 때문에 오류가 발생합니다. 따라서 실제로 실행되는 TSQL 명령이 없으므로 #tmpSecondLevel 테이블이 만들어지지 않습니다. 그래서 당신은 오류가 발생합니다. 이것은 SSMS의 "예상 실행 계획 표시"를 클릭하는 것과 같습니다. 현재이 명령에 대한 읽을 수

:

당신이 실제 실행이 SET STATISTICS XML ON으로 SHOWPLAN_ALL 라인을 대체 표시 할 경우 https://docs.microsoft.com/en-us/sql/t-sql/statements/set-showplan-all-transact-sql. 그러면 쿼리를 실행할 때 실제 실행 계획이 표시됩니다.

+0

그것은 작동합니다! 매우 감사합니다! –