Luciano Moreira

Luciano Moreira

(0 comments, 174 posts)

This user hasn't shared any profile information

Home page: http://luticm.blogspot.com/

Posts by Luciano Moreira

Vídeo 05 – Minha empresa não investe em mim

Vídeo do Luti #05 - Minha empresa não investe em mim



Canal no YouTube: https://www.youtube.com/channel/UCaDiCu2LF-PRkswTKrLSpow

Abraços

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

Pesquisa sobre treinamentos da Sr. Nimbus

Depois que voltei a dedicar 100% do meu tempo para a Nimbus, tenho trabalhado bastante na revisão dos nossos treinamentos e nos modelos que podemos oferecer para vocês. E nunca é simples, pois são pedidos diversos e é impossível conciliar tudo. Algumas vezes os mais inesperados treinamentos agradam o público, enquanto outros que parecem prometer, acabam com pouca demanda.

Uma curiosidade… Você sabia que na história do treinamento Mastering SQL Server (antigo Internals), o pior público foi em uma turma noturna em São Paulo? Mesmo já tendo recebido diversos pedidos de treinamento no período da noite, o interesse sempre é maior quando integral.

São essas experiências que acabam por moldar o que oferecemos na Nimbus, e pode ser que haja uma oportunidade de melhor atendê-los, então gostaríamos de saber um pouco mais de vocês através de uma rápida pesquisa (1 a 5 minutos).




*** A cada 50 respostas sortearemos um treinamento on-demand no dia 15 de Setembro de 2015 (nome e e-mail necessário para o sorteio) ***

Abraços

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

Vídeo 04 – Se sentindo um bosta

Vídeo do Luti #04 - Se sentindo um bosta.



Abraços

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

SQL Server Administração e Monitoramento em São Paulo

Anunciei o treinamento de Administração e Monitoramento do SQL Server.
Este será realizado em Fevereiro de 2016, São Paulo, antes do Carnaval, e está CONFIRMADA.

Turma: http://www.srnimbus.com.br/calendario/sql22_fev2016_sp/
Ementa:  http://www.srnimbus.com.br/sql22/

Passei as últimas semanas atualizando o material (estou ministrando o treinamento in-company) e gostei bastante do resultado. Dei a ele uma ênfase muito grande na parte de segurança avançada, backup/restore, corrupção de dados, xEvents e wait types.

Para conseguir passar tudo em 40 horas eu precisei remover os laboratórios e aumentei consideravelmente o número de demonstrações. Somente considerando os módulos 05 e 08, neste momento temos exatamente 30 demonstrações diferentes.

Como durante o curso explorarmos muitos detalhes do funcionamento do SQL Server, a combinação do SQL22 com o SQL23 (Mastering SQL Server) se tornou uma excelente pedida para DBAs SQL Server. Só não vou anunciar os 2 juntos porque depois de duas semanas em treinamento o cérebro da galera vai fritar…

PS: Se você tem problema com agenda e liberação da empresa, já emende suas férias com o treinamento!

Abraços

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

Vídeo 03 – O que é um profissional sênior?

Vídeo do Luti 03 - O que é um profissional sênior?
Concorda? Discorda? Não deixe de colocar aqui ou no YouTube o seu comentário!




Abraços

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

Post connect – minidump apagando snapshot com DDL trigger e linked server

Murphy realmente é um canalha... Estou ministrando treinamentos de SQL Server para um cliente e ontem iríamos usar um database snapshot que se encaixa perfeitamente em um cenário. para validarmos nosso script, criamos um snapshot e depois fomos removê-lo antes do primeiro uso.

DROP DATABASE XYZSnap

...

Minidump e service down. Divertido não é?!
Nos minutos seguintes tudo em pé funcionando corretamente, encontramos registro no connect e hoje reproduzi com SQL Server 2012 e, com uma variação de comportamento, no 2014.

Abri um item no Connect (https://connect.microsoft.com/SQLServer/feedback/details/1658842), por favor votem se conseguir reproduzir (não em produção, ok?!).

Deixo o texto original que escrevi para referência...

==========================================================

I found this connect item that is exactly what I went thru yesterday in a customer: https://connect.microsoft.com/SQLServer/feedback/details/474486/sql-server-assertion-file-tmpilb-cpp-line-1306-failed-assertion-null-m-ptaskmain-sos-task-getcurrent-m-ptaskmain

When dropping a database snapshot, a DDL trigger uses a linked server to delete a record from a control table. Then a minidump is generated and the service crashes. The SQL Server version is 2008 R2 (SP2) - 10.50.4321.0 (X64).

Using my machine with some instances I could reproduce the problem configuring a linked server from SQL Server 2012 to 2014 and dropping a database snapshot. Here is the beginning of the SQLDumpXXXX.txt:

Computer type is Intel(R) Core(TM) i7-2670QM CPU @ 2.20GHz.                                                    
Bios Version is DELL   - 2                                                                                    
8 X64 level 8664, 2 Mhz processor (s).                                                                        
Windows NT 6.2 Build 9200 CSD .                                                                                
                                   
Memory                            
MemoryLoad = 32%                  
Total Physical = 16278 MB          
Available Physical = 11058 MB      
Total Page File = 18746 MB        
Available Page File = 12232 MB    
Total Virtual = 134217727 MB      
Available Virtual = 134200260 MB  
**Dump thread - spid = 0, EC = 0x000000019943AB90                                                              
***Stack Dump being sent to C:\Program Files\Microsoft SQL Server\MSSQL11.INST2012\MSSQL\LOG\SQLDump0008.txt  
* *******************************************************************************                              
*                                                                                                              
* BEGIN STACK DUMP:                                                                                            
*   08/12/15 08:44:42 spid 48                                                                                  
*                                                                                                              
* Location: tmpilb.cpp:1301                                                                                  
* Expression: NULL == m_pTaskMain || SOS_Task::GetCurrent() == m_pTaskMain                                    
* SPID: 48                                                                                                  
* Process ID: 5644


From SQL Server 2014 with a linked server to SQL Server 2012 the behavior is different. The connection is lost, a minidump is generated, but SQL Server doesn't goes down. The drawback of this is that now I can see an exclusive lock on the database, owned by resquest_session_id -2 (DTC is envolved) and request_owner_type EXCLUSIVE_TRANSACTION_WORKSPACE.

Process ID 52 attempted to unlock a resource it does not own: DATABASE: 20 . Retry the transaction, because this error may be caused by a timing condition. If the problem persists, contact the database administrator.
Msg 0, Level 20, State 0, Line 15
A severe error occurred on the current command.  The results, if any, should be discarded.

***Stack Dump being sent to C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\LOG\SQLDump0010.txt
* *******************************************************************************                              
*                                                                                                              
* BEGIN STACK DUMP:                                                                                            
*   08/12/15 09:37:56 spid 16                                                                                  
*                                                                                                              
* Location: tmpilb.cpp:1301                                                                                  
* Expression: NULL == m_pTaskMain || SOS_Task::GetCurrent() == m_pTaskMain                                    
* SPID: 16                                                                                                  
* Process ID: 7840  

In this machine I got the following SQL Server versions. Haven't tried with other builds.
Microsoft SQL Server 2014 - 12.0.2480.0 (X64)
Microsoft SQL Server 2012 - 11.0.5058.0 (X64)

The original connect item was closed as "as Not Reproducible", hopefully you will be able to reproduce this one.

/*
Control database on the server that the linked server points to.
*/
--DROP DATABASE ControlDB
CREATE DATABASE ControlDB

USE ControlDB
GO

-- DROP TABLE DatabaseList
CREATE TABLE DatabaseList
( ID INT IDENTITY NOT NULL
, Name VARCHAR(256) NOT NULL)
 GO

USE master
GO

/*
Server where the triggers and linked server are configured.
Authentication is made using a specific security context (SQL Server authentication)
*/

USE master
GO

CREATE TRIGGER [ddl_trig_database] 
ON ALL SERVER 
FOR CREATE_DATABASE 
AS 
SET ANSI_PADDING ON
    PRINT 'Database Created.'
    DECLARE @name Varchar(255)
-- CommandText is wrong in the implementation
    SELECT @name = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
    
    SET @name = replace(@name, 'Create Database ', '')
    SET @name = RTRIM(ltrim(@name))
    print @name

-- Effectively we don't need to insert nothing
    insert into [LUTIXPS\INST2012].ControlDB.dbo.DatabaseList (Name) values (@name)
GO

-- DISABLE TRIGGER [ddl_trig_database] ON ALL SERVER
ENABLE TRIGGER [ddl_trig_database] ON ALL SERVER
GO


CREATE TRIGGER [ddl_trig_database_drop] 
ON ALL SERVER 
FOR DROP_DATABASE 
AS 
    --PRINT 'Database Droped.'
    DECLARE @name Varchar(255)
    SELECT @name = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
    print @name + char(13)
    SET @name = replace(@name, 'Drop Database ', '')
    print @name

    Delete [LUTIXPS\INST2012].ControlDB.dbo.DatabaseList WHERE Name = @name
GO

-- DISABLE TRIGGER [ddl_trig_database_drop] ON ALL SERVER
ENABLE TRIGGER [ddl_trig_database_drop] ON ALL SERVER
GO


-- DROP DATABASE Test
CREATE DATABASE Test

-- SELECT * FROM sys.master_files

CREATE DATABASE TestSnap
ON PRIMARY (NAME = 'Test', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Test_SNAP.mdf')
AS SNAPSHOT OF Test

DROP DATABASE testSnap
GO

==========================================================

Abraços

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

Teaser – portal…

Trabalhando bastante no portal de treinamentos on-demand da Sr. Nimbus!
Novidades por vir...



Abraços

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

SQLSat 424 – ColumnStore Internals e PreCon

No dia 26 de Setembro estarei em São Paulo para mais um SQL Saturday! O SQLSat #424 vai acontecer na UNIP Tatuapé e novamente vai juntar grandes nomes da comunidade técnica de SQL Server deste país.

A grade foi publicada (http://www.sqlsaturday.com/424/Sessions/Schedule.aspx) e confesso que fiquei surpreso com a quantidade de assuntos interessantes. Espero que os palestrantes se preparem bastante e mandem muito bem, agradando ao público.

Estarei apresentando sobre Columnstore Internals (http://www.sqlsaturday.com/424/Sessions/Details.aspx?sid=38361), apareça por lá!

Aproveito para deixar uma dica sobre a precon do Kevin Boles, por R$ 300,00 você pode participar de um treinamento de um dia sobre tuning.



Tune like a Guru!
Com Kevin Boles (@TheSQLGuru)
Não perca essa chance de participar da Precon Tune Like a Guru com o Kevin Boles aqui em São Paulo. Será na sexta-feira, 25/Setembro. Esta Precon apresentada em inglês vai cobrir uma ampla gama de temas que formam a espinha dorsal da análise de desempenho do SQL Server. Como consultor OLTP a muito tempo, @TheSQLGuru percebeu repetidamente que a maioria dos clientes com quem trabalhou obtiveram melhorias surpreendentes passando apenas a usar um conjunto relativamente pequeno de conhecimentos e ferramentas.

Serão cobertos muitos tópicos, como:
  • Processo de Otimização;
  • Estatísticas: Uso e Manutenção;
  • Índices: Uso e Manutenção;
  • Entendendo o Query Plan;
  • Configurações de Servidor e Database;
  • Melhoramentos no Design;
  • Melhoramentos no Código;
  • Análise de Profiler;
  • Uso de objetos temporários;
  • Análises de Waits e IO




Abraços

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

SQLServerDF – Material do encontro XXVI

Post rápido para publicar o material do último encontro do SQLServerDF.

Apresentando o DocumentDB

Para variar eu esqueci de tirar fotos da sessão, só tirei uma foto da recepção do pessoal, então quem tiver algum outro registro, por favor me envie.



Abraços

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

Non-foldable expressions e o QO

Post rápido.
Estou executando um pequeno benchmark para um cliente, avaliando se uma mudança na modelagem vai trazer benefícios para a aplicação, quando me deparo com um problema interessante. Conversando com o Fabiano ele citou non-foldable expressions, a causa raiz da questão.

Resumindo, quando o QO encontra non-foldable expressions ele não utiliza a densidade ou o histograma para estimar o número de registros, então ele chuta que um percentual dos registros será retornado (10% no meu caso).

Qual o problema disso? Mesmo com um índice em uma coluna com boa seletividade, acabo por ver cluster index scans e planos bem ruins.

Me parece que seria mais interessante o QO usar a densidade no caso de igualdade com non-foldable expression, mas com certeza devem haver cenários onde isso acaba por trazer resultados ruins.

Quer testar? Abaixo está o código que eu gerei para simular o problema utilizando o AdventureWorks2012.
Aproveite e teste o código no SQL Server 2014 e veja a diferença…

E não deixe de testar a última consulta do script e analisar a estimativa do QO. #fun


/****************************************************************************************
*****************************************************************************************

Autor: Luciano Caixeta Moreira
E-mail: luciano.moreira@srnimbus.com.br
LinkedIn: http://www.linkedin.com/in/luticm
Blog: http://luticm.blogspot.com
Twitter: @luticm

Título: non-foldable expression and bad plans
Descrição: 

Histórico de atualização (yyyy-mm-dd):
- 2015-07-30: Criação do script


*   Copyright (C) 2015 Sr. Nimbus Prestação de Serviços em Tecnologia LTDA
*   http://www.srnimbus.com.br

*****************************************************************************************
****************************************************************************************/

USE tempdb
GO

SELECT *
INTO tempdb.dbo.TestePredicado
FROM AdventureWorks2012.Sales.SalesOrderDetail

CREATE UNIQUE CLUSTERED INDEX idx01
ON dbo.TestePredicado (SalesOrderDetailID)
go

CREATE NONCLUSTERED INDEX idx02
ON dbo.TestePredicado (SalesOrderID)
GO

EXEC sp_helpindex 'TestePredicado'

DBCC SHOW_STATISTICS('dbo.TestePredicado', idx02)
GO

-- Usa o histograma, conforme esperado, e estima 1 registro.
SELECT *
FROM dbo.TestePredicado
WHERE salesorderid = 46040
GO

-- Vetor de densidade
-- 3.178134435086604e-5 * 121317 = 3.855617352614016
DECLARE @X INT
SET @X = 46040

SELECT *
FROM dbo.TestePredicado
WHERE salesorderid = @X
GO

-- Utiliza a densidade
SELECT *
FROM dbo.TestePredicado
WHERE salesorderid = CAST(RAND() * 10000 AS INT)
GO

-- Estimated number of rows: 12131.7 => 10%
-- Plano ruim, scan (10% estimate) + filter
SELECT *
FROM dbo.TestePredicado
WHERE salesorderid = CAST(CAST(NEWID() AS binary(6)) % 20000000 AS INT)
GO

-- Ok, densidade
SELECT *
FROM dbo.TestePredicado
WHERE salesorderid = DATEPART(YEAR,GETDATE()) 
GO

-- Para resolver o problema...
DECLARE @X INT
SET @X = CAST(CAST(NEWID() AS binary(6)) % 20000000 AS INT)

SELECT *
FROM dbo.TestePredicado
WHERE salesorderid = @X
GO

/*
In a larger and more complex query on a larger data set, this type of error can result 
in bad plan selection. If this is a problem for your application, consider using a 
technique like the one illustrated above. Use sp_executesql or a stored procedure 
containing the problem query, and pass in the precomputed result of the non-foldable 
expression as a parameter. 
This will allow you to work around the problem and get good cardinality estimates.

https://technet.microsoft.com/en-us/library/cc966419.aspx
*/

-- Estimativa OK
WITH C AS (
SELECT TOP 100
CAST(RAND() * 10000 AS INT) AS IDVenda
FROM sys.columns
)
SELECT *
FROM dbo.TestePredicado AS T
INNER JOIN C
ON T.SalesOrderID = C.IDVenda

-- Estimativa ficou ótima (!!!??!!!?!!), considerou um cross join...
WITH C AS (
SELECT TOP 100
CAST(CAST(NEWID() AS binary(6)) % 20000 AS INT) AS IDVenda
FROM sys.columns
)
SELECT *
FROM dbo.TestePredicado AS T
INNER JOIN C

ON T.SalesOrderID = C.IDVenda


Abraços

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br
Luciano Moreira's RSS Feed
Go to Top