Skip to content

Commit 95ba4bd

Browse files
committed
Adicionado e revisado mais scripts: crypt, log, transacoes, cache, etc.
1 parent 68e2fb6 commit 95ba4bd

13 files changed

+875
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*#info
2+
3+
# Autor
4+
Rodrigo Ribeiro Gomes
5+
6+
# Descrição
7+
Gera o comando para criar o certificado a partir do binário, em outro banco.
8+
Se o certificado for protegido por um password apenas , especifique a senha para incluir a private key.
9+
Se nao quiser incluir a private key, apenas deixe como string vazia.
10+
Se quiser incluir a private key, usando a key do banco, especifique NULL como cert password.
11+
12+
Funcuona apenas no 2012+
13+
Baseadi em: https://learn.microsoft.com/en-us/sql/t-sql/functions/certencoded-transact-sql?view=sql-server-ver17#b-copying-a-certificate-to-another-database
14+
*/
15+
16+
17+
declare
18+
@CurrentCertPassword nvarchar(max) = ''
19+
20+
select
21+
'CREATE CERTIFICATE '+QUOTENAME(c.name)+' FROM BINARY = '+CONVERT(varchar(max),PublicKey,1)+CHAR(13)+CHAR(10)
22+
+ISNULL('WITH PRIVATE KEY( BINARY = '+CONVERT(varchar(max),PrivateKey,1)+', DECRYPTION BY PASSWORD = '''+DecryptPass+''' )','/* PRIVATE KEY NOT FOUND */')
23+
from
24+
(
25+
select
26+
DecryptPass = convert(Varchar(100),newid())
27+
) P
28+
cross apply
29+
(
30+
select
31+
PublicKey = CERTENCODED(certificate_id)
32+
,PrivateKey = case when @CurrentCertPassword is null THEN CERTPRIVATEKEY(certificate_id,DecryptPass)
33+
else CERTPRIVATEKEY(certificate_id,DecryptPass,@CurrentCertPassword)
34+
end
35+
,c.name
36+
FROM
37+
sys.certificates C
38+
WHERE
39+
C.name = '<NomeCertificado,,>'
40+
) C
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*info
2+
3+
# autor
4+
Rodrigo rieiro Gomes
5+
6+
# descricao
7+
Cálculos para determinar o PLAN CACHE Pressure Limit
8+
Script que criei provavelmente enquanto estava estudando isso e fui comentnaod para deixar um scrip e um texto como eu estava entendendo tudo.
9+
Isso foi epoca do 2005/2008 ainda, muita coisa pode ter mudado 20 anos depois!
10+
11+
12+
Table 5-3 em http://technet.microsoft.com/en-us/library/cc293624.aspx
13+
14+
TGV = target visible memory ( não engloba AWE. )
15+
16+
SQL 2005 SP1 - 75% de TGV[0-8GB] + 50% de TGV[8-64GB] + 25% de TGV[>64GB]
17+
SQL 2005 SP2 - 75% de TGV[0-4GB] + 10% de TGV[4-64GB] + 5% de TGV[>64GB]
18+
SQL 2000 - Passou de 4GB considera memory pressure!
19+
20+
Local Memory pressure ( independente a cada uma das stores, neste caso as de plan cache )
21+
Condições ( se ocorrer qualquer uma das seguintes )
22+
- 75% do Pressure Limit (Single-Page)
23+
- 50% do Pressure Limit (Multi-Page)
24+
- Número de plans = 4*HashTableSize
25+
Obs:
26+
- Se o limite for atingindo quando o add o plan para o cache, a mesma thread que add é usada para remover!!!
27+
28+
Global Memory Pressure ( Todas os caches stores terão entradas removidas )
29+
Internal
30+
Condições:
31+
- Virtual address space is low
32+
- Memory broker diz que todas stores devem usar 80% do Pressure Limit
33+
External
34+
Condições:
35+
- Sistema operacional pede memória!
36+
37+
*/
38+
39+
--> Determinando qual o Pressure Limit( considerando SQL 2005 SP2 ou > )
40+
DECLARE
41+
@MemVisivelGB INT
42+
SET @MemVisivelGB = 2
43+
SELECT
44+
(@MemVisivelGB*0.75) as PressureLimit
45+
,(@MemVisivelGB*0.75)*0.75 as LocalPressureSPLimit
46+
,(@MemVisivelGB*0.75)*0.5 as LocalPressureMPLimit
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
/*#info
2+
3+
# autor
4+
Rodrigo
5+
6+
# descricao
7+
Retorna os atributos de um plano como uma tabela, para facilitar a visualiazação.
8+
Normalmebte, você precisa usar um pivot, ou algo do tipo. Esse script facilita isso.
9+
10+
11+
Esse script da função fnDelimitar, disponível em Misc/fnDelimitar.sql
12+
13+
ATENÇÃO: ESSE SCRIPT PODE VARRER O SEU PLAN CACHE E CAUSAR UM ALTO CONSUMO DE CPU. Use com cuidado!
14+
15+
*/
16+
17+
USE master
18+
GO
19+
20+
DECLARE
21+
@Attribs nvarchar(max)
22+
23+
SET @Attribs = 'set_options,inuse_exec_context';
24+
25+
26+
IF OBJECT_ID('tempdb..#PlanAtrib') IS NOT NULL
27+
DROP TABLE #PlanAtrib;
28+
CREATE TABLE
29+
#PlanAtrib( c bit );
30+
31+
IF OBJECT_ID('tempdb..#PlanDados') IS NOT NULL
32+
DROP TABLE #PlanDados;
33+
34+
35+
IF OBJECT_ID('tempdb..#PlanCacheAttrib') IS NOT NULL
36+
DROP TABLE #PlanCacheAttrib;
37+
CREATE TABLE
38+
#PlanCacheAttrib( nome nvarchar(max) );
39+
40+
DECLARE
41+
@SQLCmd nvarchar(max)
42+
,@ColunasAttribs nvarchar(max)
43+
,@ColunasAttribsMolde nvarchar(max)
44+
,@FiltroAttribs nvarchar(max)
45+
,@AttribsDelimStr nvarchar(max)
46+
,@AttribsSQLCmdMolde nvarchar(max)
47+
,@NomeTempTable nvarchar(max)
48+
,@ColsMetaTipoAttribs nvarchar(max)
49+
,@AlterTableStr nvarchar(max)
50+
,@AlterTableDropCStr nvarchar(max)
51+
;
52+
53+
-- inserindo as opções em uma tabela que deverá ser consultada.
54+
SET @SQLCmd = model.dbo.fnDelimitar( @Attribs
55+
,N'INSERT INTO #PlanCacheAttrib(nome) VALUES('+CHAR(0x27)
56+
,NCHAR(0x27)+N');'
57+
,N','
58+
,0 --> Não manter o separador
59+
);
60+
EXECUTE(@SQLCmd);
61+
62+
-- Montando a parte das colunas com os atributos
63+
SET @ColunasAttribs = N'';
64+
SET @ColunasAttribsMolde = N',MAX( CASE pa.attribute WHEN '+QUOTENAME('$[ATTRIB_NOME]',NCHAR(0x27))+N' THEN pa.value END) as [$[ATTRIB_NOME]] ';
65+
66+
-- Criando a versao delimitada com aspas simples de cada atributo
67+
SET @AttribsDelimStr = model.dbo.fnDelimitar(@Attribs
68+
,DEFAULT --> Aspas simples
69+
,DEFAULT --> Aspas simples
70+
,DEFAULT --> vírgula
71+
,DEFAULT --> Manter o separador na substiuição
72+
);
73+
SET @FiltroAttribs = N'pa.attribute IN '+QUOTENAME(@AttribsDelimStr,N'(');
74+
SELECT
75+
@ColunasAttribs = @ColunasAttribs + REPLACE(@ColunasAttribsMolde,N'$[ATTRIB_NOME]',pca.nome) + NCHAR(13)+NCHAR(10)
76+
FROM
77+
#PlanCacheAttrib pca
78+
79+
-- Criando o string contendo o IN com nomes de tipos de dados que tem parênteses
80+
SET @ColsMetaTipoAttribs = N'nvarchar,varchar,varbinary,binary,char,nchar'
81+
SET @ColsMetaTipoAttribs = model.dbo.fnDelimitar(@ColsMetaTipoAttribs
82+
,DEFAULT --> Aspas simples
83+
,DEFAULT --> Aspas simples
84+
,DEFAULT --> vírgula
85+
,DEFAULT --> Manter o separador na substiuição
86+
);
87+
88+
-- Tabela temporária gerada internamente na query dinamica.
89+
SET @NomeTempTable = N'#PlanAttribDinamic';
90+
91+
-- String contendo o começo do alter table das colunas.
92+
SET @AlterTableStr = QUOTENAME(N'ALTER TABLE #PlanAtrib ADD',CHAR(0x27))
93+
94+
-- String contendo o começo do alter para remover a coluna.
95+
SET @AlterTableDropCStr = N'ALTER TABLE #PlanAtrib DROP COLUMN c;'
96+
97+
SET @AttribsSQLCmdMolde = N'
98+
DECLARE
99+
@SQLCmdD nvarchar(max)
100+
,@SQLAlterTable nvarchar(max)
101+
;
102+
103+
SET @SQLCmdD = N'''';
104+
105+
SELECT
106+
cp.plan_handle
107+
,cp.objtype
108+
,cp.cacheobjtype
109+
,cp.size_in_bytes
110+
,cp.usecounts
111+
,cp.refcounts
112+
$[ATTRIBS_COLUNAS]
113+
INTO
114+
'+@NomeTempTable+'
115+
FROM
116+
sys.dm_exec_cached_plans cp
117+
CROSS APPLY
118+
sys.dm_exec_plan_attributes(cp.plan_handle) pa
119+
WHERE
120+
$[ATTRIBS_FILTROS]
121+
GROUP BY
122+
cp.plan_handle
123+
,cp.objtype
124+
,cp.cacheobjtype
125+
,cp.size_in_bytes
126+
,cp.usecounts
127+
,cp.refcounts
128+
129+
/*
130+
Esta parte da query irá montar um ALTER TABLE ... ADD para adicionar as colunas
131+
geradas do insert acima, na tabela temporária criada fora do script.
132+
Assim a tabela de fora terá os mesmos campos que a tabela criada dentro deste batch.
133+
*/
134+
SELECT
135+
@SQLCmdD = @SQLCmdD +
136+
$[ATTRIBS_ALTERTABLE_STR_COL]
137+
+
138+
CHAR(0x20)
139+
+
140+
c.name
141+
+
142+
CHAR(0x20)
143+
+
144+
tp.name
145+
+
146+
CHAR(0x20)
147+
+
148+
CASE
149+
WHEN tp.name IN ($[ATTRIBS_COLSMETA_TIPOS]) THEN QUOTENAME(
150+
CONVERT(NVARCHAR(MAX)
151+
,CASE c.max_length
152+
WHEN -1 THEN '+QUOTENAME('max',NCHAR(0x27))+'
153+
ELSE c.max_length
154+
END
155+
)
156+
,'+QUOTENAME('(',NCHAR(0x27))+'
157+
)
158+
159+
160+
ELSE N''''
161+
END
162+
+
163+
'+QUOTENAME(N';',NCHAR(0x27))+' --> Ponto-e-vírgula
164+
FROM
165+
tempdb.sys.tables t
166+
JOIN
167+
tempdb.sys.columns c
168+
ON c.object_id = t.object_id
169+
JOIN
170+
tempdb.information_schema.columns isc
171+
ON isc.table_name = t.name
172+
AND isc.column_name = c.name
173+
JOIN
174+
tempdb.sys.types tp
175+
ON tp.user_type_id = c.user_type_id
176+
WHERE
177+
t.object_id = OBJECT_ID('+QUOTENAME(N'tempdb..'+@NomeTempTable,CHAR(0x27))+')
178+
ORDER BY
179+
isc.ordinal_position
180+
;
181+
182+
EXEC(@SQLCmdD)
183+
184+
---> Comando para fazer o alter table e dropar a coluna "c".
185+
$[ATTRIBS_ALTERTABLE_STR_DROPCOL]
186+
187+
INSERT INTO
188+
#PlanAtrib
189+
SELECT
190+
*
191+
FROM
192+
'+@NomeTempTable+'
193+
';
194+
195+
-- Montando o comando para obter as informações de um plano específico.
196+
SET @SQLCmd = REPLACE(@AttribsSQLCmdMolde,N'$[ATTRIBS_COLUNAS]',@ColunasAttribs)
197+
SET @SQLCmd = REPLACE(@SQLCmd,N'$[ATTRIBS_FILTROS]',@FiltroAttribs)
198+
SET @SQLCmd = REPLACE(@SQLCmd,N'$[ATTRIBS_COLSMETA_TIPOS]',@ColsMetaTipoAttribs)
199+
SET @SQLCmd = REPLACE(@SQLCmd,N'$[ATTRIBS_ALTERTABLE_STR_COL]',@AlterTableStr)
200+
SET @SQLCmd = REPLACE(@SQLCmd,N'$[ATTRIBS_ALTERTABLE_STR_DROPCOL]',@AlterTableDropCStr)
201+
202+
EXECUTE(@SQLCmd)
203+
SELECT * FROM #PlanAtrib;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*#info
2+
3+
# autor
4+
Rodrigo ribeiro Gomes
5+
6+
# descricao
7+
8+
Alguma query que devo ter usada uma ou outra vez pra obter os buckets de alguns caches.
9+
Query simples, mas mantive aqui para deixar a referência para a dmv de hash_tables que pode ser útil para alguma investigação relacionada ao uso do plan cache.
10+
11+
12+
*/
13+
SELECT DISTINCT
14+
cht.cache_address
15+
,cht.name
16+
,cht.type
17+
,cht.buckets_count
18+
FROM
19+
sys.dm_os_memory_cache_hash_tables cht
20+
WHERE
21+
type IN ( 'CACHESTORE_OBJCP','CACHESTORE_SQLCP','CACHESTORE_PHDR','CACHESTORE_XPROC' )
22+

0 commit comments

Comments
 (0)