2013-10-09 3 views
0

지난 30 일 동안 SQL Server 데이터베이스에서 실행 된 다양한 쿼리에 사용 된 모든 테이블 이름 목록을 가져 오는 방법을 찾으려고합니다.SQL 쿼리의 테이블 이름 목록

나는 쿼리를 가지고 있으며 프로그래밍 방식으로 (수동으로 파싱하지 않고) 테이블 이름 목록을 가져 오거나 모든 SQL Server 시스템 테이블에서 세부 정보를 얻을 수 있는지 알고 싶습니다. 서버를 가정

+1

이것은 어떤 문제를 해결하는 과정에서 * 들리는 것처럼 들리지만 그 문제가 무엇인지 말해 줄 수 있습니까? –

+0

수집 한 쿼리가 지난 30 일 동안 실행 된 전체 쿼리 집합임을 어떻게 알 수 있습니까? –

+0

예 - 한 가지 문제를 해결하는 단계입니다. 우리는이 프로세스가 완료된 후에 데이터베이스 (약 300 +)의 모든 테이블을로드하는로드 프로세스를 가지고 있습니다. 우리는 약 60-70 개의 테이블을 사용하는 작업을 실행합니다. 이제 전체로드 프로세스가 끝나기를 기다리는 대신 60-70 개의 테이블을 확인하고로드가이 테이블에서 수행되는지 확인한 다음 작업을 시작합니다. 희망이 분명하다. –

답변

1

는 지난 30 일에 다시 시작되지 않은, 조회 된 것을 테이블을 결정하는 잠재적으로 더 정확한 방법 (쿼리 컬렉션이 불완전한 경우에 그) :

SET ANSI_WARNINGS OFF; 
SET NOCOUNT ON; 
GO 

;WITH agg AS 
(
    SELECT 
     [object_id], 
     last_user_seek, 
     last_user_scan, 
     last_user_lookup, 
     last_user_update 
    FROM 
     sys.dm_db_index_usage_stats 
    WHERE 
     database_id = DB_ID() 
) 
SELECT 
    [Schema] = OBJECT_SCHEMA_NAME([object_id]), 
    [Table_Or_View] = OBJECT_NAME([object_id]), 
    last_read = MAX(last_read), 
    last_write = MAX(last_write) 
FROM 
(
    SELECT [object_id], last_user_seek, NULL FROM agg 
    UNION ALL 
    SELECT [object_id], last_user_scan, NULL FROM agg 
    UNION ALL 
    SELECT [object_id], last_user_lookup, NULL FROM agg 
    UNION ALL 
    SELECT [object_id], NULL, last_user_update FROM agg 
) AS x ([object_id], last_read, last_write) 
GROUP BY 
    OBJECT_SCHEMA_NAME([object_id]), 
    OBJECT_NAME([object_id]) 
ORDER BY [Schema],[Table_Or_View]; 

수집 한 쿼리에 의존하려면 쿼리를 테이블에 매핑하는 마법 시스템 테이블이 없습니다. 따라서 정확히 수집 된 쿼리가 저장되는 위치는 분명하지 않지만 sys.dm_exec_cached_planssys.dm_exec_sql_text을 사용하여 계획 XML에서 테이블 또는 인덱스 이름을 구문 분석하려고 시도 할 수 있습니다. 이것은 단순하지 않으며 필요할 수도있는 것보다 많은 메모리가 없으면 30 일 분량의 쿼리에 대한 모든 계획이 현재 계획 캐시에있을 가능성이 거의 없습니다.

+0

이 결과를 데이터베이스에서 실행되는 실제 쿼리와 연결시킬 수 있습니까? –

+0

이 결과는 단지 집계를 부여합니다. 예를 들어 서로 다른 두 개의 쿼리에서 인덱스 스캔을 수행하면 각각 1 스캔으로 계산됩니다. 따라서 특정 쿼리에이를 연결할 방법이 없습니다. 그것이 정말로 당신이하고 싶은 일이라면, 당신은 파싱해야 할 것입니다. 특정 테이블로드가 완료되면로드 프로세스에서 일부 로그 테이블을 업데이트 한 다음 쿼리 통계 또는 기타 DMV를 확인하고 쿼리 텍스트를 구문 분석하지 않아도됩니다. –

+0

로드 프로세스가 로그 테이블을 업데이트하지만 우리는 다음 작업에서 사용되는 60-70 테이블을 찾는 프로세스에 있습니다. 이 작업은 직접 쿼리와 저장 프로 시저의 조합으로 수동으로 구문 분석하기가 어렵습니다. 어떤 제안? –

관련 문제