fev 252011
 

Fiquei muito satisfeito em ver que o SQL Server agora possui instrumentação com visualização em formato de WAIT EVENTs.

Elas já estavam disponíveis em versões anteriores, e a próxima versão, de codinome Denali, já possui 562 WAITs intrumentalizadas, pelo menos em minha instalação de testes. É muito menos do que as >1.100 do Oracle 11gR2, mas é um passo na direção certa, que é o fim do Tuning por Checklist no SQL Server.

A DMV dm_os_wait_stats (onde creio que OS significa o SQL Server OS, e não o Windows OS) permite uma visualização rápida dos maiores gargalos do sistema, e o SQL Server conta com um procedure para limpar seu conteúdo, o que é excelente para uma análise comparativa.

A documentação sobre cada WAIT está disponível no Technet, mas é necessário conhecimento do SQL Server Internals para interpreta-las.

Documentação de WAITs do SQL Server 2008 R2

SELECT * FROM sys.dm_os_wait_stats WHERE wait_time_ms > 0 ORDER BY wait_time_ms DESC
GO

wait_type                                                    waiting_tasks_count  wait_time_ms         max_wait_time_ms     signal_wait_time_ms
------------------------------------------------------------ -------------------- -------------------- -------------------- --------------------
FT_IFTS_SCHEDULER_IDLE_WAIT                                  348                  27569904             600001               27
LAZYWRITER_SLEEP                                             9974                 9987593              1199                 7493
REQUEST_FOR_DEADLOCK_SEARCH                                  1998                 9986710              5064                 9986710
SQLTRACE_INCREMENTAL_FLUSH_SLEEP                             2497                 9986594              4097                 23
HADR_FILESTREAM_IOMGR_IOCOMPLETION                           19910                9984593              1384                 10812
XE_TIMER_EVENT                                               500                  9961136              30061                9960383
SLEEP_TASK                                                   19093                5067603              1186                 5709
BROKER_TO_FLUSH                                              4869                 4993496              1276                 3607
LOGMGR_QUEUE                                                 136                  1434576              485845               36
CHECKPOINT_QUEUE                                             11                   1364931              486916               84
FT_IFTSHC_MUTEX                                              6                    970158               958726               13
BROKER_TASK_STOP                                             13                   111854               10073                22
CLR_AUTO_EVENT                                               8                    18141                5958                 7
LCK_M_S                                                      7                    15106                2912                 86
PAGEIOLATCH_SH                                               638                  8479                 161                  147
PREEMPTIVE_OS_LIBRARYOPS                                     1                    3212                 3212                 0
BROKER_EVENTHANDLER                                          8                    2135                 1678                 42
PREEMPTIVE_OS_CREATEFILE                                     104                  1986                 340                  0
PREEMPTIVE_OS_COMOPS                                         1                    1826                 1826                 0
SLEEP_DBSTARTUP                                              16                   1740                 193                  156
ASYNC_NETWORK_IO                                             234                  1712                 319                  427
PREEMPTIVE_OS_WAITFORSINGLEOBJECT                            25                   1693                 319                  0
IO_COMPLETION                                                164                  1657                 126                  171
PREEMPTIVE_OS_GENERICOPS                                     31                   1650                 719                  0
MSQL_XP                                                      195                  1242                 621                  0
FT_IFTS_RWLOCK                                               11                   1150                 941                  16
PREEMPTIVE_OS_FILEOPS                                        141                  1054                 144                  0
PREEMPTIVE_OS_CRYPTOPS                                       210                  919                  525                  0
WRITELOG                                                     170                  774                  27                   45
PREEMPTIVE_OS_GETPROCADDRESS                                 195                  693                  118                  0
PWAIT_ALL_COMPONENTS_INITIALIZED                             3                    669                  249                  30
SLEEP_TEMPDBSTARTUP                                          6                    658                  229                  18
PREEMPTIVE_OS_FLUSHFILEBUFFERS                               10                   608                  141                  0
SLEEP_SYSTEMTASK                                             1                    566                  566                  63
CHKPT                                                        1                    544                  544                  56
SLEEP_MASTERMDREADY                                          1                    544                  544                  60
WRITE_COMPLETION                                             105                  484                  87                   0
ASYNC_IO_COMPLETION                                          4                    462                  191                  1
LCK_M_U                                                      3                    453                  236                  3
SOS_SCHEDULER_YIELD                                          4266                 436                  171                  415
PAGEIOLATCH_EX                                               42                   434                  86                   0
PAGEIOLATCH_UP                                               77                   333                  84                   0
PREEMPTIVE_OS_DISCONNECTNAMEDPIPE                            206                  315                  99                   0
PREEMPTIVE_OS_GETFILEATTRIBUTES                              64                   297                  61                   0
SLEEP_DCOMSTARTUP                                            1                    287                  287                  0
PREEMPTIVE_OS_NETVALIDATEPASSWORDPOLICY                      208                  282                  106                  0
PREEMPTIVE_OS_AUTHENTICATIONOPS                              663                  253                  24                   0
PREEMPTIVE_OS_QUERYREGISTRY                                  166                  240                  119                  0
PREEMPTIVE_OS_LOADLIBRARY                                    1                    234                  234                  0
PREEMPTIVE_OS_PIPEOPS                                        1                    216                  216                  0
PREEMPTIVE_OS_WRITEFILEGATHER                                12                   213                  73                   0
THREADPOOL                                                   24                   174                  36                   0
PREEMPTIVE_OS_CRYPTACQUIRECONTEXT                            235                  157                  30                   0
DAC_INIT                                                     1                    146                  146                  0
PREEMPTIVE_OS_DELETESECURITYCONTEXT                          206                  117                  17                   0
LCK_M_SCH_M                                                  3                    81                   59                   8
SLEEP_BPOOL_FLUSH                                            93                   72                   6                    0
PREEMPTIVE_FILESIZEGET                                       18                   44                   43                   0
PREEMPTIVE_OS_CRYPTIMPORTKEY                                 230                  41                   11                   0
PREEMPTIVE_OS_LOOKUPACCOUNTSID                               6                    35                   21                   0
PREEMPTIVE_OS_AUTHORIZATIONOPS                               264                  33                   14                   0
PREEMPTIVE_OS_DOMAINSERVICESOPS                              1                    31                   31                   0
CLR_MANUAL_EVENT                                             1                    30                   30                   0
PREEMPTIVE_OS_REPORTEVENT                                    40                   27                   3                    0
LOGBUFFER                                                    1                    27                   27                   0
SOS_PHYS_PAGE_CACHE                                          1                    20                   20                   15
PREEMPTIVE_OS_NETVALIDATEPASSWORDPOLICYFREE                  208                  14                   8                    0
PREEMPTIVE_OS_DECRYPTMESSAGE                                 208                  6                    1                    0
PAGELATCH_EX                                                 138                  5                    0                    2
PAGELATCH_SH                                                 103                  3                    0                    2
SNI_TASK_COMPLETION                                          1                    2                    2                    0
PREEMPTIVE_OS_GETVOLUMENAMEFORVOLUMEMOUNTPOINT               4                    2                    0                    0
PREEMPTIVE_OS_SQMLAUNCH                                      1                    2                    2                    0
SQLTRACE_FILE_WRITE_IO_COMPLETION                            2                    1                    0                    0
PREEMPTIVE_OS_DELETEFILE                                     1                    1                    1                    0
PREEMPTIVE_OS_GETDISKFREESPACE                               4                    1                    0                    0
LATCH_SH                                                     1                    1                    1                    1
SOS_SYNC_TASK_ENQUEUE_EVENT                                  1                    1                    1                    1
BROKER_MASTERSTART                                           1                    1                    1                    0
(79 row(s) affected)
DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR);
GO

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
SELECT * FROM sys.dm_os_wait_stats WHERE wait_time_ms > 0 ORDER BY wait_time_ms DESC
GO

wait_type                                                    waiting_tasks_count  wait_time_ms         max_wait_time_ms     signal_wait_time_ms
------------------------------------------------------------ -------------------- -------------------- -------------------- --------------------
(0 row(s) affected)
fev 222011
 

O programa SQLIO não tem nada de SQL, mas é uma ferramenta da Microsoft para teste de carga de I/O, com várias opções, excelente para testar a capacidade de leitura ou gravação de um ambiente, ou mesmo comparar configurações diferentes de RAID em um Storage.

Opções:
-o: Número de requisições extras de I/O requests.
-LS: Capturar informação de latência de disco.
-k: Especifica se a carga é de Leitura ou Gravação (R ou W).
-s: Duração do teste em segundos.
-b: Tamanho da requisição em bytes.
-f: Tipo de I/O (‘random’ ou (‘sequential’).
-F: Nome do arquivo  que irá conter os arquivos de teste.
No exemplo abaixo eu utilizei as seguintes opções: sqlio -kR -s360 -frandom -o8 -b256 -LS -Fparam.txt

jun 232010
 

Segue aqui o link, pois já procurei ele antes, e foi difícil encontrar:

http://www.microsoft.com/sqlserver/2008/en/us/pricing.aspx

Ao contrário do Oracle, o Processor quer dizer Processador Físico (Socket), e não Core. Em compensação, o preço individual é bem mais alto.

Este outro link (.doc) aborda o licenciamento em detalhes. Embora seja baseado no SQL Server 2005, as regras continuam as mesmas para SQL Server 2008:

Understand Database Pricing

Este outro link (.pdf) tem mais detalhes sobre as Licenças para SQL Server 2008.

Understand Database Pricing

jan 122010
 

Para verificar os SQLs ue consomem mais recursos no SQL Server, utilize a DMV sys.dm_exec_query_stats.

Veja abaixo consultas para ver os SQLs que mais consomem CPU e os que levam mais tempo para executar.

Top SQL por CPU:

SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],
 SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
 ((CASE qs.statement_end_offset
 WHEN -1 THEN DATALENGTH(st.text)
 ELSE qs.statement_end_offset
 END - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY total_worker_time/execution_count DESC;

Top SQL por tempo de execução:

SELECT TOP 5 max_elapsed_time AS [Max Elpased Time],
 SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
 ((CASE qs.statement_end_offset
 WHEN -1 THEN DATALENGTH(st.text)
 ELSE qs.statement_end_offset
 END - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY max_elapsed_time DESC;
jan 072010
 

Estudando para a prova de upgrade de MCDBA para MCITP, me deparei com uma questão sobre os número de Bancos de Dados que o SQL Server 2008 suporta, que são 32.767, incluindo os Bancos de Dados padrão (master, tempdb, msdb).

Resolvi testar. Claro que não ia criar tudo manualmente, então fiz um script Perl para isso:

use strict;
use warnings;
use DBD::ODBC;
my $dsn = 'EXPRESS';
my $username = 'SA';
my $password = 'UberDBA2010';
my $dbh = DBI->connect("dbi:ODBC:$dsn", $username, $password, {PrintError => 0});
my $count;
for ($count = 1; $count<32767; $count++)
 {
 my $database = "database_$count";
 my $sql_01 = "CREATE DATABASE $database";
 my $sth_01 = $dbh->prepare($sql_01) or die $DBI::errstr;
 $sth_01->execute() or die $DBI::errstr;
 print "$sql_01\n";
 }

Em seguida, deixei rodando. Levou algumas horas, mas os Bancos de Dados (de apenas 1MB com apenas 46 tabelas cada, só para testar o conceito) foram criados perfeitamente, até o limite que estava na documentação.

Microsoft Windows XP [versão 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\RPRONI>cd \temp

C:\TEMP>perl SQLServer_CreateDatabases.pl
CREATE DATABASE database_1
CREATE DATABASE database_2
CREATE DATABASE database_3
CREATE DATABASE database_4
CREATE DATABASE database_5
CREATE DATABASE database_6
CREATE DATABASE database_7
CREATE DATABASE database_8
CREATE DATABASE database_9
CREATE DATABASE database_10
...
CREATE DATABASE database_32746
CREATE DATABASE database_32747
CREATE DATABASE database_32748
CREATE DATABASE database_32749
CREATE DATABASE database_32750
CREATE DATABASE database_32751
CREATE DATABASE database_32752
CREATE DATABASE database_32753
CREATE DATABASE database_32754
CREATE DATABASE database_32755
CREATE DATABASE database_32756
CREATE DATABASE database_32757
CREATE DATABASE database_32758
CREATE DATABASE database_32759
CREATE DATABASE database_32760
CREATE DATABASE database_32761
CREATE DATABASE database_32762
[Microsoft][ODBC SQL Server Driver][SQL Server]Unable to create/attach any new database because the number of existing databases has reached
 the maximum number allowed: 32766. (SQL-42000) at SQLServer_CreateDatabases.pl line 16.

C:\TEMP>

Aí embaixo está a prova de que os Bancos de Dados foram criados, e o SQL Server 2008 continuava funcional.

Na verdade, vejam que o número de Bancos de Dados permitidos é menor que 32.767, mesmo incluindo os default.

Bom, agora tenho que alterar o script Perl para apagar esses Bancos todos, e deixar rodando…

dez 292009
 

A View msdb..backupset contém informações sobre todos os backups executados no SQL Server, e pode ser utilizada para verificar várias informações sobre os backups, como no exemplo abaixo.

C:\Documents and Settings\RPRONI>sqlcmd -U SA -S RPRONI-NOTEBOOK\SQLEXPRESS
Password:
1> use msdb
2> go
Changed database context to 'msdb'.
1> select backup_start_date from backupset where description like '%master%';
2> go
backup_start_date
-----------------------

(0 rows affected)
1>
dez 292009
 

O utilitário sqlcmd pode ser utilizado para acesso ao SQL Server (local ou remoto) pelo prompt de comandos CMD (também conhecido como “tela do DOS”), para execução de qualquer consulta que normalmente seria feita pelo Management Studio.

O sqlcmd também é muito útil para execução de comandos em scripts .bat, ou execução seguida em múltiplos servidores.

Segue abaixo um exemplo de conexão, a um servidor SQL Server Express 2008 instalado localmente. Para verificar todas as opções , use a sintaxe padrão de ajuda do CMD (/?).

C:\Documents and Settings\RPRONI>sqlcmd -U SA -S RPRONI-NOTEBOOK\SQLEXPRESS
Password:
1> EXIT

C:\Documents and Settings\RPRONI>sqlcmd /?
Microsoft (R) SQL Server Command Line Tool
Version 10.0.1600.22 NT INTEL X86
Copyright (c) Microsoft Corporation.  All rights reserved.

usage: Sqlcmd            [-U login id]          [-P password]
 [-S server]            [-H hostname]          [-E trusted connection]
 [-d use database name] [-l login timeout]     [-t query timeout]
 [-h headers]           [-s colseparator]      [-w screen width]
 [-a packetsize]        [-e echo input]        [-I Enable Quoted Identifiers]
 [-c cmdend]            [-L[c] list servers[clean output]]
 [-q "cmdline query"]   [-Q "cmdline query" and exit]
 [-m errorlevel]        [-V severitylevel]     [-W remove trailing spaces]
 [-u unicode output]    [-r[0|1] msgs to stderr]
 [-i inputfile]         [-o outputfile]        [-z new password]
 [-f <codepage> | i:<codepage>[,o:<codepage>]] [-Z new password and exit]
 [-k[1|2] remove[replace] control characters]
 [-y variable length type display width]
 [-Y fixed length type display width]
 [-p[1] print statistics[colon format]]
 [-R use client regional setting]
 [-b On error batch abort]
 [-v var = "value"...]  [-A dedicated admin connection]
 [-X[1] disable commands, startup script, enviroment variables [and exit]]
 [-x disable variable substitution]
 [-? show syntax summary]

C:\Documents and Settings\RPRONI>
dez 292009
 

Para inciar o serviço do SQL Server pelo CMD (DOS), ou através de um script .bat, basta utilizar a sintaxe abaixo, seguida do nome do serviço.

No meu caso, que tenho o SQL Server 2008 express instalado, o serviço é o MSSQL$SQLEXPRESS.

O nome do serviço pode ser verificado em “Administrative Tools” -> “Services”.

Microsoft Windows XP [versão 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\RPRONI>NET START MSSQL$SQLEXPRESS
O serviço de SQL Server (SQLEXPRESS) está sendo iniciado.
O serviço de SQL Server (SQLEXPRESS) foi iniciado com êxito.

C:\Documents and Settings\RPRONI>
dez 222009
 

No SQL Server 2005 e 2008, é possível reconstruir o banco de dados MASTER.

No SQL 2005, é necessário executar o Setup.exe do CD de instalação, com as opções abaixo. No SQL Server 2008, o Setup.exe e arquivos necessários já são copiados para o servidor.

Para reconstruir o banco, execute o comando abaixo no diretório indicado, trocando o valor do parâmetro /InstanceName pelo nome da instância em que quer recuperar o banco de dados, e o valor do parâmetro /SqlSysAdminAccounts por uma conta da máquina que tenha acesso administrativo.

A opção /Quiet inibe a exibição da tela gráfica, e se não ocorrer nenhum erro, não há retorno.

Obviamente, este procedimento só irá funcionar com o SQL Server parado. Bom, se você precisar recuperar o banco MASTER, o SQL Server já vai estar bem parado… :-)

C:\Arquivos de programas\Microsoft SQL Server\100\Setup Bootstrap\Release>Setup.Exe /Action=RebuildDatabase /InstanceName=SQLEXPRESS /SqlSysAdminAccounts=RPRONI /Quiet
Microsoft (R) SQL Server 2008 Setup 10.00.2531.00
Copyright (c) Microsoft Corporation.  All rights reserved.

C:\Arquivos de programas\Microsoft SQL Server\100\Setup Bootstrap\Release>

dez 222009
 

Em sua quinta edição, este livro é obrigatório para o DBA que precisa administrar seriamente um ou mais Bancos de Dados rodando sobre o Microsoft SQL Server, especialmente se quiser conhecer Performance Tuning neste ambiente.

Não basta instalar, deixar rodar, e colocar a culpa no desenvolvedor: o DBA sempre tem que conhecer o sistema operacional. Como o Windows Server está no mercado a 20 anos, e deve ficar por mais 20 anos pelo menos, a escolha é sua se irá conhece-lo realmente, ou irá esperar outro que o conhece contrariar sua opinião.
E, mesmo se utiliza Oracle no Windows, ficará grato ao conhecer as diferenças entre Tasks, Processes, Theads e Fibers.

Um dos co-autores é o principal programador por trás das ferramentas Sysinternals, empresa que criava e mantinha programas para depuração e ajuste fino no Microsoft Windows, e que inclusive foi comprada pela própria Microsoft.

Este livro me chamou a atenção especialmente porque diz onde o Windows é ruim. Me supreendi ao ver um livro da Microsoft Press que permite este tipo de comentário. Por exemplo, no capítulo 2, o autor deixa claro que o Windows não é um sistema baseado em micro kernel, e porque não o é. Também deixa claro porque o Windows é mais robusto para Desktops do que para Servidores.