2015-12-07 3 views
0

Как найти, какой запрос потребляет больше места в temp db в версии SQL 2000. Я не хочу использовать профилировщик SQL, поскольку на диске не так много места.tsql query-consuming большое пространство в tempdb

Вопрос является версией 2000 года. Данную информацию можно не использовать с помощью dmv.

Как отследить, что между 1-2 запросами и по какой базе данных размер tempdb увеличивается настолько, что поступают уведомления, которые могут выделять страницу под tempdb, она заполнена.

+0

Вы можете скопировать базу данных в тестовую среду с достаточным пространством и запустить там профайлер? Кроме того, почему вы не хотите использовать профилировщик sql-сервера? – user1666620

+0

Нет, это невозможно сделать, поскольку в среде много баз данных и нет тестового сервера. –

+0

aНа другую возможную вещь, которая может быть выполнена. Что такое sqltext? –

ответ

0

Вы можете создать процесс из сценария ниже, который может быть выполнен по заданию. Более или менее это шаблон и может быть изменен, как вы считаете нужным.

EDIT: добавлены дополнительные комментарии ниже.

--Create temp table for sysprocesses records 
IF OBJECT_ID('tempdb.dbo.#SYSPROC') IS NOT NULL 
    DROP TABLE #SYSPROC; 
BEGIN 
    CREATE TABLE #SYSPROC 
    (
     spid smallint NOT NULL, 
     dbid smallint NOT NULL, 
     blocked smallint NOT NULL, 
     lastwaittype nchar(32) NOT NULL, 
     cpu int NOT NULL, 
     physical_io int NOT NULL, 
     memusage int NOT NULL, 
     login_time datetime NOT NULL, 
     Last_batch datetime NOT NULL, 
     status nchar(30) NOT NULL, 
     cmd nchar(16) NOT NULL, 
     loginame nchar(128) NOT NULL, 
     sql_handle binary(20) NOT NULL, 
     sh_text text NULL, 
     snapshot_dt datetime NULL 
    ) 
END; 


--Insert sysprocesses records into temp #SYSPROC 
INSERT INTO #SYSPROC 
(
    spid, 
    dbid, 
    blocked, 
    lastwaittype, 
    cpu, 
    physical_io, 
    memusage, 
    login_time, 
    Last_batch, 
    status, 
    cmd, 
    loginame, 
    sql_handle, 
    snapshot_dt 
) 
SELECT 
    sp.spid, 
    sp.dbid, 
    sp.blocked, 
    sp.lastwaittype, 
    sp.cpu, 
    sp.physical_io, 
    sp.memusage, 
    sp.login_time, 
    sp.Last_batch, 
    sp.status, 
    sp.cmd, 
    sp.loginame, 
    sp.sql_handle, 
    GETDATE() 
FROM master.dbo.sysprocesses sp 
WHERE sp.spid > 50; 


/* 
Update temp #SYSPROC with sql text. Since CROSS APPLY is not 
available in SQL Server 2000, a loop is required to interate 
through each record. 
*/ 
DECLARE @min_spid smallint = (SELECT MIN(spid) FROM #SYSPROC); 
DECLARE @max_spid smallint = (SELECT MAX(spid) FROM #SYSPROC); 
DECLARE @sql_handle binary(20); 
DECLARE @sql_text varchar(max); 

WHILE @min_spid <= @max_spid 
BEGIN 

    --Set @sql_handle variable to be evaluated by the fn_get_sql function 
    SELECT 
     @sql_handle = S.sql_handle 
    FROM #SYSPROC S 
    WHERE spid = @min_spid 

    --Identify the sql_text for the session by passing the @sql_handle variablet through fn_get_sql 
    SELECT 
     @sql_text = H.text 
    FROM fn_get_sql(@sql_handle) H 

    --Update #SYSPROC with the sql_text. 
    UPDATE S 
    SET sh_text = @sql_text 
    FROM #SYSPROC S 
    WHERE spid = @min_spid 

    SET @min_spid = @min_spid + 1 

END; 


INSERT INTO <SOMETABLE YOU CREATE> 
(
    spid, 
    dbid, 
    blocked, 
    lastwaittype, 
    cpu, 
    physical_io, 
    memusage, 
    login_time, 
    Last_batch, 
    status, 
    cmd, 
    loginame, 
    sql_handle, 
    snapshot_dt 
) 
SELECT 
    spid, 
    dbid, 
    blocked, 
    lastwaittype, 
    cpu, 
    physical_io, 
    memusage, 
    login_time, 
    Last_batch, 
    status, 
    cmd, 
    loginame, 
    sql_handle, 
    snapshot_dt 
FROM #SYSPROC 

Надеюсь, это поможет!

Смежные вопросы