terça-feira, 9 de fevereiro de 2010

Comandos DBCC úteis

DBCC DROPCLEANBUFFERS

Estatísticamente é mais comum que uma query acabou de ser executada, seja executada novamente, do que um nova query seja encaminhada. Por este motivo, todas as querys executadas no Sql Server ficam armazenadas em um cache. Este comando, limpa os buffers do Sql Server.Muito bom para fazer testes mais justos de performance de query e enquanto se está realizando processos de tuning.

Exemplo:

DBCC DROPCLEANBUFFERS

DBCC ERRORLOG

Se você raramente reinicializa o seu servidor, pode notar que um crescimento exagerado no log e demoras para visualização. Este comando DBCC, trunca o seu log.

Exemplo: DBCC ERRORLOG

DBCC INDEXDEFRAG

Introduzido no Sql Server 2000, o index defrag permite evitar a fragmentação lógica dos índices, mas sem realizar locks nos objetos, permitindo aos usuários acesso as tabelas enquanto os comandos estão em execução. Porém, o REBUILD faz a desfragmentação com maior eficiência (entretanto, faz o lock dos objetos).

Exemplo:

DBCC INDEXDEFRAG ('NOME_DO_BANCO','NOME_TABELA','NOME_INDICE')

segunda-feira, 8 de fevereiro de 2010

Conflicting locking hints specified

Hoje, durante um processo de migração de banco de dados Sql 2000 para o 2005, tive que recompilar uma série de procedures no novo ambiente e ao tentar re-compilar uma procedure me deparei com a seguinte mensagem:

Msg 1047, Level 15, State 1, Line 3
Conflicting locking hints specified.

A situação era similar (porém não igual) a esta:

create table teste_locks(
  nome varchar(100)
)
go

insert into teste_locks values ('Rodrigo')
insert into teste_locks values ('Marcelo')
insert into teste_locks values ('Scheidt')
go

delete teste_locks with (rowlock)
from teste_locks with (nolock)

Não sei qual a intenção original do desenvolvedor, mas fui obrigado a dar algumas risadas enquanto olhava o script. Observe no delete, o conflito de conceitos: no delete é informado um rowlock e no from um nolock. Imagino que se executamos um rowlock (lock de linha), não podemos especificar que não teremos lock nenhum, que é o que faz o nolock.

Removi o rowlock e tudo funcionou de novo. Imagino como esta proc foi criada da primeira vez, considerando que esta mensagem aparece no Sql Server 2000.

Até a próxima!


Problemas com restore

Hoje ao tentar realizar o restore de um banco de dados em uma instância 2005, criado no SQL Server 2000, me deparei com a seguinte mensagem:

TITLE: Microsoft SQL Server Management Studio
------------------------------

Restore failed for Server 'MyServer\sql05'.  (Microsoft.SqlServer.Smo)


------------------------------
ADDITIONAL INFORMATION:

System.Data.SqlClient.SqlError: File 'E:\MSSQL$DES\data\base.mdf' is claimed by 'base_Index'(3) and 'base'(1). The WITH MOVE clause can be used to relocate one or more files. (Microsoft.SqlServer.Smo)


O banco de dados original, tinha um arquivo de índices separado, e por algum motivo o DBA decidiu nomear o arquivo de índices com a terminação MDF salvando-o em outro diretório. Ao tentar restaurar, o Sql Server optou por colocar os dois na mesma pasta e por isto a mensagem. Rename no arquivo de índices para *.ndf e problema resolvido.

Até a próxima!




sexta-feira, 5 de fevereiro de 2010

Conectando um pacote DTS 2000 com um Web Service - Script Task

Faz algum tempo, precisei realizar um suporte em um ambiente SQL 2000, mais precisamente em pacotes DTS. A dificuldade era implementar em uma carga, uma validação através de um WEB Service. Se esta solução fosse escrita em Integration Services, minha vida seria muito mais fácil, porém, quem disse que a vida é fácil?

 

Bom, a solução foi desenvolver tudo através de um VB Script dentro de uma Script Task. O código implementado foi bem mais complexo, e estou anexando aqui apenas um Snipet.

 

 

'**********************************************************************

'  Visual Basic ActiveX Script

'************************************************************************

 

Function Main()

 

 

    Dim str_telefones

 

    str_telefones = "123456"

 

    http = CreateObject("Microsoft.XmlHttp")

 

    http.open("GET", "http://enderecowebservice/varPergunta?valor=" + str_telefones + " ", False)

    http.send("")

 

    str_texto = http.responseText

 

    Main = DTSTaskExecResult_Success

End Function

 

 

Mais um usuário feliz!