sexta-feira, 14 de dezembro de 2012

Identity e Truncate


Esticando um pouco a prosa sobre IDENTITY, a dica do dia é a seguinte:
Quando precisar limpar uma tabela, excluindo todos seus registros, lembre-se:
TRUNCATE TABLE (apesar de ser extremamente mais rápido que o DELETE) pode lhe gerar problemas caso sua tabela tenha uma coluna com o IDENTITY, isto porque sempre que “truncamos” uma tabela, o IDENTITY da mesma é reiniciado; ou seja, ao fim da operação  o retorno do comando abaixo será 1:
1
select IDENT_CURRENT('suaTabela');
Se desejar retomar a sequencia anterior, utilize o comando abaixo logo após o TRUNCATE TABLE:
1
DBCC CHECKIDENT (<suaTabela>, RESEED, <X*>);
* onde, X representa o ID inicial da sua sequencia
Se sua opção for o DELETE não há necessidade em se preocupar com a sequência do IDENTITY. Esta será preservada.

terça-feira, 11 de dezembro de 2012

Verifica Tempo restante de Backup /restore

FUNCIONA NO SQLSEVER 2005, 2008 e 2008 R2

SELECT start_time,
       (total_elapsed_time/1000/60) AS MinutesRunning,
       percent_complete,
       command,
       b.name AS DatabaseName,
              -- MASTER will appear here because the database is not accesible yet.
       DATEADD(ms,estimated_completion_time,GETDATE()) AS StimatedCompletionTime,
      (estimated_completion_time/1000/60) AS MinutesToFinish
FROM  sys.dm_exec_requests a
          INNER JOIN sys.DATABASES b ON a.database_id = b.database_id
WHERE command LIKE '%restore%'
          OR command LIKE '%backup%'
          AND estimated_completion_time > 0

Uso de memória por Banco da Instância

DECLARE @total_buffer INT;

SELECT @total_buffer = cntr_value
   FROM sys.dm_os_performance_counters
   WHERE RTRIM([object_name]) LIKE '%Buffer Manager'
   AND counter_name = 'Total Pages';

;WITH src AS
(
   SELECT
       database_id, db_buffer_pages = COUNT_BIG(*)
       FROM sys.dm_os_buffer_descriptors
       --WHERE database_id BETWEEN 5 AND 32766
       GROUP BY database_id
)
SELECT
   [db_name] = CASE [database_id] WHEN 32767
       THEN 'Resource DB'
       ELSE DB_NAME([database_id]) END,
   db_buffer_pages,
   db_buffer_MB = db_buffer_pages / 128,
   db_buffer_percent = CONVERT(DECIMAL(6,3),
       db_buffer_pages * 100.0 / @total_buffer)
FROM src
ORDER BY db_buffer_MB DESC;
Go

Verificar qual a porta que o SQLSERVER esta utilizando

DECLARE @TcpPort VARCHAR(5)
        ,@RegKey VARCHAR(100)

IF @@SERVICENAME !='MSSQLSERVER'
    BEGIN
        SET @RegKey = 'SOFTWARE\Microsoft\Microsoft SQL Server\' + @@SERVICENAME + '\MSSQLServer\SuperSocketNetLib\Tcp'
    END
    ELSE
    BEGIN
        SET @RegKey = 'SOFTWARE\MICROSOFT\MSSQLSERVER\MSSQLSERVER\SUPERSOCKETNETLIB\TCP'
    END

EXEC master..xp_regread
    @rootkey = 'HKEY_LOCAL_MACHINE'
    ,@key = @RegKey
    ,@value_name = 'TcpPort'
    ,@value = @TcpPort OUTPUT

SELECT @TcpPort AS PortNumber
        ,@@SERVERNAME AS ServerName
        ,@@SERVICENAME AS ServiceName

Tamanho de tabelas no SQL Server

SELECT OBJECT_NAME(ID) TABELA, CONVERT(DEC(15),SUM(RESERVED)) RESERVED
INTO #X
FROM SYSINDEXES
WHERE indid in (0, 1, 255)
GROUP BY ID

SELECT TABELA, LTRIM(STR(RESERVED * D.LOW / 1024., 15, 0)) + ' KB'
FROM #X, master.dbo.spt_values d
where d.number = 1
and d.type = 'E'
ORDER BY RESERVED DESC

Como descobrir/exibir as instâncias do SQL Server instaladas

Recentemente precisei descobrir o nome da instância do SQL Server que estava instalada no meu servidor, como já conhecia o utilitário de linha de comando do SQL Server (sqlcmd), executei no prompt de comando o seguinte: SQLCMD -L e obtive o resultado abaixo: