2016-11-30 1 views
0

다른 4 개의 테이블과 조인해야하는 테이블 1이 있습니다. 하위 쿼리를 사용하여 동일한 쿼리를 작성할 수 있습니까? 왜냐하면 아래 쿼리를 사용하면 실행하는 데 오랜 시간 (40 분 이상)이 걸리기 때문입니다. 다른 방법이 있습니까?하나의 테이블로 4 개의 다른 테이블 조인

select T1.ID as IID, T2.Prokey as Pro, T3.pname as IType, T4.pname as Status, T5.pname as Res 
from table1 T1 
INNER JOIN Table2 T2 on T1.pro = T2.ID 
INNER JOIN table3 T3 on T1.itype =T3.ID 
INNER JOIN table4 T4 on T1.itatus = T4.ID 
INNER JOIN Table5 T5 on T1.Res = T5.ID 
group by T2.ID, convert(nvarchar(max), T2.ID), T1.ID, T1.Pkey, T3.pname, T4.pname, T5.pname 
+0

모든'id' 컬럼에 인덱스가 있는지 확인하십시오. 사실 기본 키로 선언해야합니다. –

+0

위의 쿼리에 인덱스를 포함하려면 어떻게해야합니까? @GordonLinoff –

+0

조인은 하위 쿼리보다 빠릅니다. 따라서 인덱싱 –

답변

0

다음은 SQL 문입니다.

-- CREATE TABLE 1 INDEXES 

CREATE NONCLUSTERED INDEX IX_Table1_pro 
ON Table1 (pro) 

CREATE NONCLUSTERED INDEX IX_Table1_itype 
ON Table1 (itype) 

CREATE NONCLUSTERED INDEX IX_Table1_itatus 
ON Table1 (itatus) 

CREATE NONCLUSTERED INDEX IX_Table1_Res 
ON Table1 (Res) 

-- CREATE TABLE 2 INDEXES 

CREATE NONCLUSTERED INDEX IX_Table2_ID 
ON Table2 (ID) 

-- CREATE TABLE 3 INDEXES 

CREATE NONCLUSTERED INDEX IX_Table3_ID 
ON Table3 (ID) 

-- CREATE TABLE 4 INDEXES 

CREATE NONCLUSTERED INDEX IX_Table4_ID 
ON Table4 (ID) 

-- CREATE TABLE 5 INDEXES 

CREATE NONCLUSTERED INDEX IX_Table5_ID 
ON Table5 (ID) 
+0

고맙습니다. 제 질문은 위의 select 문에서 위의 인덱스를 어디에 추가 할 수 있습니까? @ Riadhovic –

+0

위 쿼리에서 아무것도 변경하지 않고 my sql 코드를 실행 한 다음 쿼리를 실행합니다. – Riadhovic

0

이렇게하면 필요한 색인에 대한 기본적인 아이디어를 얻을 수 있습니다. 귀하의 기본 키에 대한 것들을보십시오.

SELECT CAST(SERVERPROPERTY('ServerName') AS [nvarchar](256)) AS 

[SQLServer] 
    ,db.[database_id] AS [DatabaseID] 
    ,db.[name] AS [DatabaseName] 
    ,id.[object_id] AS [ObjectID] 
    ,id.[statement] AS [FullyQualifiedObjectName] 
    ,id.[equality_columns] AS [EqualityColumns] 
    ,id.[inequality_columns] AS [InEqualityColumns] 
    ,id.[included_columns] AS [IncludedColumns] 
    ,gs.[unique_compiles] AS [UniqueCompiles] 
    ,gs.[user_seeks] AS [UserSeeks] 
    ,gs.[user_scans] AS [UserScans] 
    ,gs.[last_user_seek] AS [LastUserSeekTime] 
    ,gs.[last_user_scan] AS [LastUserScanTime] 
    ,gs.[avg_total_user_cost] AS [AvgTotalUserCost] 
    ,gs.[avg_user_impact] AS [AvgUserImpact] 
    ,gs.[system_seeks] AS [SystemSeeks] 
    ,gs.[system_scans] AS [SystemScans] 
    ,gs.[last_system_seek] AS [LastSystemSeekTime] 
    ,gs.[last_system_scan] AS [LastSystemScanTime] 
    ,gs.[avg_total_system_cost] AS [AvgTotalSystemCost] 
    ,gs.[avg_system_impact] AS [AvgSystemImpact] 
    ,gs.[user_seeks] * gs.[avg_total_user_cost] * (gs.[avg_user_impact] * 0.01) AS [IndexAdvantage] 
    ,'CREATE INDEX [Missing_IXNC_' + OBJECT_NAME(id.[object_id], db.[database_id]) + '_' + REPLACE(REPLACE(REPLACE(ISNULL(id.[equality_columns], ''), ', ', '_'), '[', ''), ']', '') + CASE 
     WHEN id.[equality_columns] IS NOT NULL 
      AND id.[inequality_columns] IS NOT NULL 
      THEN '_' 
     ELSE '' 
     END + REPLACE(REPLACE(REPLACE(ISNULL(id.[inequality_columns], ''), ', ', '_'), '[', ''), ']', '') + '_' + LEFT(CAST(NEWID() AS [nvarchar](64)), 5) + ']' + ' ON ' + id.[statement] + ' (' + ISNULL(id.[equality_columns], '') + CASE 
     WHEN id.[equality_columns] IS NOT NULL 
      AND id.[inequality_columns] IS NOT NULL 
      THEN ',' 
     ELSE '' 
     END + ISNULL(id.[inequality_columns], '') + ')' + ISNULL(' INCLUDE (' + id.[included_columns] + ')', '') AS [ProposedIndex] 
    ,CAST(CURRENT_TIMESTAMP AS [smalldatetime]) AS [CollectionDate] 
FROM [sys].[dm_db_missing_index_group_stats] gs WITH (NOLOCK) 
INNER JOIN [sys].[dm_db_missing_index_groups] ig WITH (NOLOCK) 
    ON gs.[group_handle] = ig.[index_group_handle] 
INNER JOIN [sys].[dm_db_missing_index_details] id WITH (NOLOCK) 
    ON ig.[index_handle] = id.[index_handle] 
INNER JOIN [sys].[databases] db WITH (NOLOCK) 
    ON db.[database_id] = id.[database_id] 
WHERE id.[database_id] > 4 -- Remove this to see for entire instance 

ORDER BY [IndexAdvantage] DESC 
OPTION (RECOMPILE); 
0

우선, 표 4 개 인덱스를 작성 :

IX_Table1_pro , IX_Table1_itype , IX_Table1_itatus , IX_Table1_Res 을이 스크립트를 사용

CREATE NONCLUSTERED INDEX IX_Table1_XXX ON Table1 (XXX) 

그 다음 열 ID를 사용하여 다른 테이블 인덱스를 생성 (XXX 컬럼 이름이다)

+0

감사합니다.하지만 자세히 알려주십시오. @ Riadhovic –

+0

모든 인덱스를 만들려면 SQL statment가 필요합니까? – Riadhovic

+0

예. 제발 위의 쿼리에서 인덱스가있는 SQL 문이 필요합니다. –

관련 문제