Contexto: Estou ministrando um treinamento in-company e preparando uma série de novas demonstrações para este cliente. Após escrever uma procedure que era para ser problemática, esbarrei em deadlocks mais interessantes do que eu havia planejado….
Gostei da brincadeira e resolvei compartilhar com vocês um deadlock art generator!
Algumas imagens da saída estão abaixo. Também coloquei no OneDrive um trace com alguns deadlocks que eu coletei.
A primeira ver que ouvi falar sobre deadlock art foi em um post do Catae (https://blogs.msdn.microsoft.com/fcatae/2010/03/18/deadlock-art/) que sempre cito no módulo de locking nos meus treinamentos.
Para reproduzir em seu ambiente, você vai fazer o seguinte.
1. Crie a procedure proc_Divertida no AdventureWorks2014
2. Utilizando o SQLQueryStress, mande 20/30 threads com 3/4 execuções “EXEC proc_Divertida;”
a. O número de threads/repetições você muda de acordo com seu interesse na arte. kkkk
3. Monitore o deadlock graph no profiler
HAVE FUN!
Abraços,
USE AdventureWorks2014
GO
IF OBJECT_ID('dbo.proc_Divertida') IS NOT NULL
DROP PROCEDURE dbo.proc_Divertida
go
CREATE PROCEDURE dbo.proc_Divertida
AS
DECLARE @OrderID INT = (CAST((RAND() * 100000) AS INT) % 30000) + 43659;
PRINT @OrderID
BEGIN TRANSACTION
UPDATE Sales.SalesOrderDetail
SET UnitPrice = UnitPrice
WHERE SalesOrderID = @OrderID
; WITH C AS (
SELECT (Quantity * ActualCost) AS LineTotal, PRODUCTID, TransactionDate
FROM Production.TransactionHistory
UNION
SELECT (Quantity * ActualCost), PRODUCTID, TransactionDate
FROM Production.TransactionHistoryArchive
UNION
SELECT (UnitPrice * OrderQty), SOD.ProductID, SOH.OrderDate
FROM Sales.SalesOrderDetail AS SOD
INNER JOIN Sales.SalesOrderHeader AS SOH
ON SOH.SalesOrderID = SOD.SalesOrderID
)
SELECT
C.ProductID,
YEAR(TransactionDate),
SUM(LineTotal)
FROM C
GROUP BY GROUPING SETS (ProductID, YEAR(TransactionDate), (ProductID, YEAR(TransactionDate)), ())
COMMIT TRANSACTION
GO
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br
SELECT CAST (power(CrazyIdeas, Curiosity) * (RealLifeExperience + MyMistakes)) / FreeTime) AS VARCHAR(MAX)) FROM MyBrain WITH (NOLOCK, INDEX('idx_Neuron')) WHERE ThingsIThinkIKnow in ('SQL Server', 'DB2', '.NET', 'Cloud')
Mostrando postagens com marcador SQL Server. Mostrar todas as postagens
Mostrando postagens com marcador SQL Server. Mostrar todas as postagens
sexta-feira, 24 de junho de 2016
quinta-feira, 31 de março de 2016
SQL Server Developer Edition - for free
Excelente notícia! SQL Server Developer Edition agora é grátis. Veja o anúncio da Microsoft na íntegra: https://blogs.technet.microsoft.com/dataplatforminsider/2016/03/31/microsoft-sql-server-developer-edition-is-now-free/
Ele vem junto com um conjunto de ferramentas disponíveis no Visual Studio Dev Essentials (http://www.visualstudio.com/products/visual-studio-dev-essentials-vs). Que tem até um crédito para brincar com o Azure (nada demais, mas é algo legal para quem nunca brincou com o Azure!).
Além disso tem muita novidade rolando no Build 2016. Se quiser acompanhar o que anda acontecendo por lá, não deixe de dar uma olhada no Channel9: https://channel9.msdn.com/Events/Build/2016.
É meu amigo, cada dia que passa temos menos desculpas para não nos reinventarmos...
Abraços
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br
Ele vem junto com um conjunto de ferramentas disponíveis no Visual Studio Dev Essentials (http://www.visualstudio.com/products/visual-studio-dev-essentials-vs). Que tem até um crédito para brincar com o Azure (nada demais, mas é algo legal para quem nunca brincou com o Azure!).
Além disso tem muita novidade rolando no Build 2016. Se quiser acompanhar o que anda acontecendo por lá, não deixe de dar uma olhada no Channel9: https://channel9.msdn.com/Events/Build/2016.
É meu amigo, cada dia que passa temos menos desculpas para não nos reinventarmos...
Abraços
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br
quarta-feira, 16 de março de 2016
TODOS os treinamentos da Nimbus com preço promocional
Durante o fim de semana, talvez incentivado por um espírito de mudança, resolvi fazer algo diferente na Nimbus. Conversei com os outros instrutores, que se mostraram abertos à seguinte ideia…
Todos os treinamentos da Nimbus que já estão anunciados, serão comercializados por R$ 1.500,00 (originalmente os valores estavam entre R$ 2.250,00 e R$ 2.750,00) - http://www.srnimbus.com.br/calendario/turmas/turmas-sql/
Alguns aspectos que nos motivaram a fazer isso:
• Recorrentemente estou vendo um número grande de pessoas em fóruns, postando frases como "em busca de recolocação no mercado", "procurando trabalho", etc.
○ Este é um público que, com a escassez de vagas atualmente, pode se beneficiar de um valor diferenciado.
• O país está em crise e em geral as famílias estão apertando o orçamento, o que faz com que muitos deixem de se capacitar (o que é um erro, às vezes necessário!) ou aceitem qualquer centro de treinamento, que com frequência acaba contratando instrutores inexperientes e disseminando um conteúdo básico, só para conseguir "fechar a conta".
○ Com isso o retorno do SEU investimento é baixo, porém com o conteúdo já entregue muitas vezes você acaba por aceitar o mediano ou medíocre.
• Sempre foi meu objetivo criar os mais avançados e melhores treinamentos de SQL Server do país, algo que sinceramente acredito que conseguimos, com o apoio de profissionais diferenciados.
○ Porém queremos atingir (ou "iluminar") o maior número de pessoas possível, o que nem sempre é viável, seja por agenda, por estar em outra cidade, pela situação financeira, etc.
• Por último e não menos importante, por conta da agenda dos instrutores, que anda bastante tumultuada por conta de outras atividades, e por outros fatores pessoais (no meu caso), neste momento não existe previsão para anunciarmos mais treinamentos no ano de 2016!
Levando todos esses fatores em conta, achamos por bem colocar no ar este grande incentivo! Como instrutores, o que queremos é uma sala com muita gente interessada, nos metralhando de perguntas, e saindo do curso pensando: "Nossa, eu achei que conhecia o SQL Server…".
Com nossa orientação os profissionais que trabalham com o SQL Server poderão sair do básico e avançar mais rapidamente na jornada para se tornar um DBA sênior ou consultor.
Espero que esse seja o empurrão que faltava para você participar em um de nossos treinamentos. Se não for neste ano, quem sabe em 2017 ou em outro ano, quando abrirmos mais turmas…
Um forte abraço,
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br
Todos os treinamentos da Nimbus que já estão anunciados, serão comercializados por R$ 1.500,00 (originalmente os valores estavam entre R$ 2.250,00 e R$ 2.750,00) - http://www.srnimbus.com.br/calendario/turmas/turmas-sql/
Alguns aspectos que nos motivaram a fazer isso:
• Recorrentemente estou vendo um número grande de pessoas em fóruns, postando frases como "em busca de recolocação no mercado", "procurando trabalho", etc.
○ Este é um público que, com a escassez de vagas atualmente, pode se beneficiar de um valor diferenciado.
• O país está em crise e em geral as famílias estão apertando o orçamento, o que faz com que muitos deixem de se capacitar (o que é um erro, às vezes necessário!) ou aceitem qualquer centro de treinamento, que com frequência acaba contratando instrutores inexperientes e disseminando um conteúdo básico, só para conseguir "fechar a conta".
○ Com isso o retorno do SEU investimento é baixo, porém com o conteúdo já entregue muitas vezes você acaba por aceitar o mediano ou medíocre.
• Sempre foi meu objetivo criar os mais avançados e melhores treinamentos de SQL Server do país, algo que sinceramente acredito que conseguimos, com o apoio de profissionais diferenciados.
○ Porém queremos atingir (ou "iluminar") o maior número de pessoas possível, o que nem sempre é viável, seja por agenda, por estar em outra cidade, pela situação financeira, etc.
• Por último e não menos importante, por conta da agenda dos instrutores, que anda bastante tumultuada por conta de outras atividades, e por outros fatores pessoais (no meu caso), neste momento não existe previsão para anunciarmos mais treinamentos no ano de 2016!
Levando todos esses fatores em conta, achamos por bem colocar no ar este grande incentivo! Como instrutores, o que queremos é uma sala com muita gente interessada, nos metralhando de perguntas, e saindo do curso pensando: "Nossa, eu achei que conhecia o SQL Server…".
Com nossa orientação os profissionais que trabalham com o SQL Server poderão sair do básico e avançar mais rapidamente na jornada para se tornar um DBA sênior ou consultor.
Espero que esse seja o empurrão que faltava para você participar em um de nossos treinamentos. Se não for neste ano, quem sabe em 2017 ou em outro ano, quando abrirmos mais turmas…
Um forte abraço,
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br
Marcadores:
SQL Server,
Sr.Nimbus,
Treinamento
terça-feira, 8 de março de 2016
SQL Server on Linux
A essa
altura do campeonato você já deve estar sabendo do anúncio que a Microsoft fez
no dia 07/03/2016 (ontem): https://blogs.microsoft.com/blog/2016/03/07/announcing-sql-server-on-linux/
Sim, SQL Server rodando em Linux.
Um
assunto que pegou até MVPs de Data Plataform desprevenidos, pois muitos não
tinham ideia de que isso poderia acontecer. E mesmo com inúmera incógnitas, não
posso deixar passar em branco o assunto sem um post.
Eu estou
ANIMADO com o anúncio e vou expor meus motivos, porém primeiro vou listar o que
nós não sabemos (nem mesmo os MVPs de SQL
Server):
- Quais serão as funcionalidades suportas pelo produto. Será todo o core da engine relacional? Integration Services?
- Hekaton, Columnstore, e outras funcionalidades que estão brilhando, estarão incluídas?
- Teremos Enterprise, Standard e todas as outras edições?
- Os releases serão sincronizados ou podemos esperar uma defasagem de funcionalidade entre SQL Server do Windows e Linux?
- Como será o SQL Server Agent? Controlaremos nossos jobs pela cron?
- Quais serão as distribuições de Linux suportadas? Suse?
- Suportaremos quais file systems? Ext3, ext4, reiserFS, XFS?
- Quais serão as ferramentas? Vamos ter o SSMS on Linux? Visual Code será suficiente? Vamos usar IDEs como Eclipse?
- Haverá interoperabilidade entre plataformas? Isto é, um backup de um banco no Linux pode ser restaurado em um SQL Server rodando no Windows?
- Teremos 100% de compatibilidade no T-SQL?
- Como fica integração com o CLR?
- Diferente do Windows, onde o SQL Server não alterada nada no kernel do SO, será que teremos compilações de kernel específicas para o SQL Server?
- Vão abrir o código fonte do SQL Server? (Aqui eu aposto contra…)
O que nós
sabemos:
- O produto está em preview, então não é vaporware.
- Portanto não esperamos declarações infelizes, como o Bob Evans da Oracle fez no passado, comentando sobre Hekaton (https://blogs.technet.microsoft.com/dataplatforminsider/2012/11/20/oracle-surprised-by-the-present/).
- General Availability está programada para meados de 2017, isto é, mais de um ano para frente.
- Primeiramente devemos ver o SQL Server com Red Hat e Ubuntu.
Ficou
claro que a listagem de dúvidas é muito maior que a de certezas, o que não
deixa o assunto menos interessante.
O que é
mais legal e me deixa motivado, é que teremos a possibilidade de acompanhar o
SQL Server em uma nova jornada, podendo analisar e aprender com os acertos e
erros da Microsoft e seus desenvolvedores. Então elucubro sobre alguns pontos…
- Fica evidente mesmo para os mais míopes, o que já sabemos: “Data is the core asset now.” Mr. Nadella said.
- Linux é um grande sistema operacional e com um market share significativo. Estar presente nele representa uma oportunidade para a Microsoft e, claro, para todos os DBAs SQL Server.
- O que não significa que o SQL Server irá se comportar melhor.
- As empresas poderão optar por ter um excelente banco de dados (veja prosa abaixo) mesmo que esteja com seus servidores rodando Linux.
- O poder de escolha é importante para o negócio, e caso a Microsoft garanta compatibilidade do T-SQL e boa integração entre plataformas, a migração Windows -> Linux pode ser facilitada.
- Será possível fazer comparações efetivas de desempenho entre o SQL Server e outras engines rodando com mesmo sistema operacional e hardware.
- Só isso já vale o ingresso, a comparação efetiva de engines ou funcionalidades específicas, sem ficar com discursinho de que se fosse no Linux o resultado seria outro.
- Muitos DBAs SQL Server vão ter que aprender Linux e isso fará com que eles estudem e comparem as plataformas. Saber as diferenças e como explorar os pontos fortes de cada sistema operacional vai te deixar um melhor profissional.
- O que não significa que será melhor ou mais fácil… Por exemplo: deixe de agendar seus jobs com o SQL Server Agent e passe a usar a cron. Ou melhor, tente criar no Linux um monitor de desempenho como faz no Perfmon, cruzando dados de sistema operacional (memória, processos, processadores, I/O, rede), com contadores do SQL Server (access methods, buffer manager, SQL Statistics).
- Poderemos observar a qualidade do código produzido pela Microsoft para suportar diferentes sistemas operacionais. Será que ela fará melhor ou vou encontrar listas gigantescas de correções como eu vejo no DB2 LUW?
Prosa SQL Server, Oracle, DB2, PostgreSQL, …
Relembrando:
Essa prosa vem de um geek que estudou por muito tempo o SQL Server, administrou
por quase 2 anos e meio o DB2 LUW com Suse Linux, foi massacrado com
informações sobre o Oracle no treinamento do Portilho e agora eventualmente
investe uns minutinhos lendo coisas a sobre o PostgreSQL. Isto é, com certeza
escrevo muita besteira…
Hoje
temos o DB2 e Oracle com mais funcionalidades que o SQL Server, algumas
sensacionais que eu gostaria de ver no SQL Server, além da possibilidade de
fazer ajustes finos em diversas configurações (mesmo que quase ninguém o faça).
Já no SQL Server eu vejo uma engine mais concisa e muito eficiente, e um
produto que está se adaptando mais rápido às inovações/pesquisas de banco de
dados (talvez por não ter que manter diferentes SOs), o que pode ser um
diferencial nos próximos anos.
Vejo na
nova direção da Microsoft, abraçando o Linux e open source, a possibilidade de
muitos de nós sair de um casulo dentro de uma plataforma (como eu vivi por
muitos anos!!) e até de abraçarmos modelos diferentes. Quem sabe no futuro
veremos menos gastos com uma cadeia gigantesca de vendedores, minimizando o
custo do licenciamento, melhorando o serviço de suporte e focando no que
realmente importa: a qualidade dos produtos e resolver os problemas dos
clientes. Seria muito bom ter que parar de desmentir histórias que alguns
vendedores contam…
Já disse
isso para vários clientes (inclusive um bem recente) que para a grande maioria
dos ambientes transacionais, não importa se o seu banco é Oracle, SQL Server,
DB2 ou PostgreSQL (que tem recebido muitos elogios e acho que merece ser
acompanhado de perto), o que importa muito mais é como fazemos a adoção da tecnologia e se estamos utilizando-a de forma
efetiva.
Por fim,
espero sinceramente que o maior benefício seja produzirmos comparações de
qualidade, discussões inteligentes e que isso traga maior maturidade para TODOS
os profissionais que trabalham com banco de dados. A aproximação da Microsoft
com o Linux deve fazer com que DBAs SQL Server se aproximem de outras engines e
também trazer DBAs Oracle/DB2/PostgreSQL para explorar um pouco do SQL Server,
quebrando mitos e preconceitos.
Quero
poder discutir e testar se o completely fair scheduler (https://en.wikipedia.org/wiki/Completely_Fair_Scheduler) é realmente ruim para máquinas com banco de dados que não adotam
um modelo cooperativo de escalonamento (como eu acredito ser). Quero poder
falar sobre configurações do SO (ex.: swapiness, huge pages), ou se a
implementação do Vectored I/O (https://en.wikipedia.org/wiki/Vectored_I/O) no Linux realmente não é a ideal (como eu
já soube), tudo isso sem esbarrar na barreira de minha versus sua plataforma de
banco de dados ou sistema operacional.
Mas tem
uma coisa que continuará igual: os manés xiitas
sempre existirão.
Isso não
mudará, infelizmente teremos manés em todas as plataformas. Vou continuar
observando calado um DBA de outro SGBDR dizendo que eu, DBA SQL Server, não
sei administrar banco de dados sem mouse, notando em seguida que o infeliz não
tem a menor ideia do funcionamento de um banco de dados (pela minha observação, os xiitas tendem a ser os mais leigos). E mesmo sabendo que em
dois ou três meses estudando o SGBDR muitos profissionais seriam melhores do
que ele, continuarei calado. Para esses xiitas, que por desconhecimento de
outra tecnologia, continuam a arrotar besteiras colossais e se sentindo
maiorais, meu total desprezo.
Estamos
vivendo tempos excitantes no mundo dos bancos de dados e essa mudança dentro da
Microsoft e com o SQL Server eu quero assistir de camarote. Pode ser que
ninguém adote o "novo" produto, pode ser que o desenvolvimento falhe
espetacularmente e venha com muitos bugs ou péssimo desempenho, ou que as
ferramentas não sejam tão interessantes como as que temos hoje. Ou pode ser que
o SQLOS ofereça uma abstração fantástica e o produto se adapte muito bem em um
novo SO, deixando muita gente de queixo caído. Seja qual for o resultado desse
movimento, com certeza ele trará muito aprendizado.
De
quebra, quem sabe um dia não teremos um treinamento Mastering SQL Server on
Linux na Sr. Nimbus, irmão do já conhecido Mastering http://www.srnimbus.com.br/sql23/.
Quer
acompanhar de perto também? Se cadastre no preview e acompanhe o evento Data
Driven que acontecerá no dia 10 de março, onde provavelmente vão falar sobre o
assunto.
- https://www.microsoft.com/en-us/server-cloud/sql-server-on-linux.aspx
- https://www.microsoft.com/en-us/server-cloud/data-driven.aspx
Se
estiver com tempo e quiser analisar por outras fontes como está sendo recebida
a notícia, alguns links:
Ah, Kevin
Farlee colocou essa imagem no twitter… Esse não acredito ser fake, como muitos outros que já vi. :-)
======================
UPDATE ======================
Brent
Ozar traz para a mesa mais outros questionamentos, que podem ser tão
importantes quanto a qualidade do produto desenvolvido. Recomendo a leitura: https://www.brentozar.com/archive/2016/03/microsoft-sql-server-coming-linux
Seria
legal também ouvir comentários de profissionais Oracle, DB2, Postgres… E aí,
acham que isso vai vingar? Tem curiosidade com o que está por vir ou não vai
fazer a menor diferença no mercado?
Abraços
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br
sexta-feira, 4 de setembro de 2015
Nível de isolamento e sp_reset_connection
Ajudando um cliente encontrei um comportamento do ADO.NET que eu desconhecia e, sinceramente, acredito que todos que trabalham com ADO.NET deveriam saber.
Cenário: uma mudança no EF 6.1 fez com que este cliente mudasse a aplicação e chamasse explicitamente a instrução SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ao instanciar o DBContext.
O problema surgiu quando a aplicação começa a abrir/utilizar/fechar as conexões, e o nível de isolamento READ UNCOMITTED é mantido.
Minha reação inicial: o ADO.NET não está chamando o sp_reset_connection ao reutilizar a conexão do pool, então pode ser um problema na configuração do pool de conexões.
Ao pesquisar sobre a configuração do pool de conexões me deparei com o comportamento que não conhecia: a sp_reset_connection não redefine o nível de isolamento.
Referências:
O item do Connect foi fechado como by design.
Então suponha o seguinte, você uma aplicação que funciona perfeitamente bem. Um novo módulo é desenvolvido e para uma interface específica você define o nível de isolamento READ UNCOMMITTED ou SERIALIZABLE, quando essa conexão é devolvida para o pool, uma outra classe da sua aplicação pode pegar essa conexão e trabalhar com um nível de isolamento inadequado, causando efeitos colaterais inesperados na aplicação. Nada bom.
Se você é desenvolvedor .NET e já trabalha com o ADO.NET provavelmente já sabe disso, mas achei importante registrar aqui para referência futura.
The devil is in the details…
Quer fazer o teste você mesmo?
Utilize os scripts abaixo para:
1. Criar o banco de dados e deixar uma transação aberta
2. Executar uma aplicação console em C# com pool de conexão habilitado
a. A segunda execução não vai ficar bloqueada (comportamento READ UNCOMMITTED)
3. Executar uma aplicação console em C# com pool de conexão desabilitado
a. A segunda execução vai ficar bloqueada (comportamento READ COMMITTED)
Você pode brincar com o profiler e DMVs para monitorar o comportamento das sessões.
1 - Scripts para testar comportamento (SSMS e VS)
USE master
go
CREATE DATABASE IsolationLevel
go
USE IsolationLevel
go
IF (OBJECT_ID('dbo.TabelaBase') IS NOT NULL)
DROP TABLE dbo.TabelaBase
go
CREATE TABLE dbo.TabelaBase
(Codigo INT IDENTITY NOT NULL PRIMARY KEY,
Nome VARCHAR(100) NOT NULL,
DataHora DATETIME2 NOT NULL DEFAULT SYSDATETIME())
GO
INSERT INTO DBO.TabelaBase (Nome) VALUES ('Sr. Nimbus')
INSERT INTO DBO.TabelaBase (Nome) VALUES ('SQL Server')
INSERT INTO DBO.TabelaBase (Nome) VALUES ('ADO.NET')
GO
-- Monitorar as sessões
-- 1 = read uncommitted
-- 2 = read committed
SELECT session_id, transaction_isolation_level, *
FROM sys.dm_exec_sessions
WHERE program_name = '.Net SqlClient Data Provider'
BEGIN TRANSACTION
UPDATE dbo.TabelaBase SET Nome = 'Luti @ Sr. Nimbus' WHERE Codigo = 1
SELECT @@TRANCOUNT
static void Main(string[] args)
{
SqlConnection con = new SqlConnection("Server=LUTIXPS;Database=IsolationLevel;UID=sa;PWD=.sql2014.;");
// SqlConnection con = new SqlConnection("Server=LUTIXPS;Database=IsolationLevel;UID=sa;PWD=.sql2014.;Pooling=false;");
SqlCommand com = new SqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED", con);
con.Open();
com.ExecuteNonQuery();
com.CommandText = "SELECT * FROM dbo.TabelaBase";
SqlDataReader dr = com.ExecuteReader();
while(dr.Read())
{
Console.WriteLine(dr["Nome"].ToString());
}
con.Close();
// novamente...
con.Open();
dr = com.ExecuteReader();
while (dr.Read())
{
Console.WriteLine(dr["Nome"].ToString());
}
con.Close();
}
Abraços
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br
Cenário: uma mudança no EF 6.1 fez com que este cliente mudasse a aplicação e chamasse explicitamente a instrução SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ao instanciar o DBContext.
O problema surgiu quando a aplicação começa a abrir/utilizar/fechar as conexões, e o nível de isolamento READ UNCOMITTED é mantido.
Minha reação inicial: o ADO.NET não está chamando o sp_reset_connection ao reutilizar a conexão do pool, então pode ser um problema na configuração do pool de conexões.
Ao pesquisar sobre a configuração do pool de conexões me deparei com o comportamento que não conhecia: a sp_reset_connection não redefine o nível de isolamento.
Referências:
- http://blogs.msdn.com/b/jimmymay/archive/2009/02/02/sp-reset-connection-does-not-reset-transaction-isolation-level-unexpected-behavior-by-design.aspx
- https://connect.microsoft.com/SQLServer/feedback/details/243527/sp-reset-connection-doesnt-reset-isolation-level
O item do Connect foi fechado como by design.
Então suponha o seguinte, você uma aplicação que funciona perfeitamente bem. Um novo módulo é desenvolvido e para uma interface específica você define o nível de isolamento READ UNCOMMITTED ou SERIALIZABLE, quando essa conexão é devolvida para o pool, uma outra classe da sua aplicação pode pegar essa conexão e trabalhar com um nível de isolamento inadequado, causando efeitos colaterais inesperados na aplicação. Nada bom.
Se você é desenvolvedor .NET e já trabalha com o ADO.NET provavelmente já sabe disso, mas achei importante registrar aqui para referência futura.
The devil is in the details…
Quer fazer o teste você mesmo?
Utilize os scripts abaixo para:
1. Criar o banco de dados e deixar uma transação aberta
2. Executar uma aplicação console em C# com pool de conexão habilitado
a. A segunda execução não vai ficar bloqueada (comportamento READ UNCOMMITTED)
3. Executar uma aplicação console em C# com pool de conexão desabilitado
a. A segunda execução vai ficar bloqueada (comportamento READ COMMITTED)
Você pode brincar com o profiler e DMVs para monitorar o comportamento das sessões.
1 - Scripts para testar comportamento (SSMS e VS)
USE master
go
CREATE DATABASE IsolationLevel
go
USE IsolationLevel
go
IF (OBJECT_ID('dbo.TabelaBase') IS NOT NULL)
DROP TABLE dbo.TabelaBase
go
CREATE TABLE dbo.TabelaBase
(Codigo INT IDENTITY NOT NULL PRIMARY KEY,
Nome VARCHAR(100) NOT NULL,
DataHora DATETIME2 NOT NULL DEFAULT SYSDATETIME())
GO
INSERT INTO DBO.TabelaBase (Nome) VALUES ('Sr. Nimbus')
INSERT INTO DBO.TabelaBase (Nome) VALUES ('SQL Server')
INSERT INTO DBO.TabelaBase (Nome) VALUES ('ADO.NET')
GO
-- Monitorar as sessões
-- 1 = read uncommitted
-- 2 = read committed
SELECT session_id, transaction_isolation_level, *
FROM sys.dm_exec_sessions
WHERE program_name = '.Net SqlClient Data Provider'
BEGIN TRANSACTION
UPDATE dbo.TabelaBase SET Nome = 'Luti @ Sr. Nimbus' WHERE Codigo = 1
SELECT @@TRANCOUNT
static void Main(string[] args)
{
SqlConnection con = new SqlConnection("Server=LUTIXPS;Database=IsolationLevel;UID=sa;PWD=.sql2014.;");
// SqlConnection con = new SqlConnection("Server=LUTIXPS;Database=IsolationLevel;UID=sa;PWD=.sql2014.;Pooling=false;");
SqlCommand com = new SqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED", con);
con.Open();
com.ExecuteNonQuery();
com.CommandText = "SELECT * FROM dbo.TabelaBase";
SqlDataReader dr = com.ExecuteReader();
while(dr.Read())
{
Console.WriteLine(dr["Nome"].ToString());
}
con.Close();
// novamente...
con.Open();
dr = com.ExecuteReader();
while (dr.Read())
{
Console.WriteLine(dr["Nome"].ToString());
}
con.Close();
}
Abraços
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br
quinta-feira, 30 de julho de 2015
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
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
quarta-feira, 1 de julho de 2015
SQL Server MVP 6.0
01 de Julho de 2015, mais um ano renovado como Microsoft Most Valuable Professional (MVP) na especialidade SQL Server. Curiosamente ontem foi meu último dia no Sicoob, uma coincidência legal, pois junto com o ânimo das mudanças e meu retorno full-time para a Nimbus, aproveito também para comemorar o MVP 6.0!
Espero contribuir ainda mais com a comunidade técnica de SQL Server e poder ajudar profissionais do mundo todo. E obrigado a todos que leem este blog e as tranqueiras que eu escrevo.
De quebra, junto com a mudança eu aproveitei e dei uma repaginada no escritório, inclusive sei que vou aproveitar para ler alguns livros atrasados e revisitar outros. Abaixo porque evito comprar muitos mais livros impressos… Isso que ainda estão alguns outros e essa é só a estante técnica. :-)
Abraços
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br
Espero contribuir ainda mais com a comunidade técnica de SQL Server e poder ajudar profissionais do mundo todo. E obrigado a todos que leem este blog e as tranqueiras que eu escrevo.
De quebra, junto com a mudança eu aproveitei e dei uma repaginada no escritório, inclusive sei que vou aproveitar para ler alguns livros atrasados e revisitar outros. Abaixo porque evito comprar muitos mais livros impressos… Isso que ainda estão alguns outros e essa é só a estante técnica. :-)
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br
sexta-feira, 3 de outubro de 2014
Sessões no PASS Summit 2014
Ontem eu montei minha agenda para o PASS Summit 2014, que acontecerá em novembro, na nossa queria Seattle. Na verdade a minha semana será bem cheia, pois em seis dias participarei do MVP Summit e do PASS Summit, então pense em sessões com muito deep dive técnico. Vai ser bbeeemm cansativo, mas excelente para qualquer sqlgeek!
Um ponto interessante deste ano é a quantidade de brasileiros vão ao evento. Muita gente mesmo, são os Brazucas invadindo Seattle! Se você está nessa condição não deixe de nos avisar, pois temos um grupo no facebook e dicas (já escrevi parte de um post) para todos.
Como não posso deixar de destacar, vejam algumas sessões do PASS deste ano... J
[DBA-502] Advanced Data Recovery Techniques – Paul Randal
[DBA-500-HD] Inside SQL Server I/O – Bob Ward
[DBA-501-HD] Locking Internals Deep Dive – Bradley Ball
[DBA-403] High Performance Infrastructure for SQL Server 2014 - Michael Frandsen
Gostou? Então já vai fazendo sua reserva financeira para o PASS do próximo ano.
Abraços,
terça-feira, 18 de março de 2014
PASS Summit para Brazucas
OBS: já comprei minha passagem e estarei no PASS Summit 2014!
Atendendo pedidos escrevo esse post, que espero que esse seja um living post, com diversas atualizações e dicas para Brasileiros que irão ao PASS Summit em Seattle, pois é um lugar que conheço razoavelmente bem...
Atendendo pedidos escrevo esse post, que espero que esse seja um living post, com diversas atualizações e dicas para Brasileiros que irão ao PASS Summit em Seattle, pois é um lugar que conheço razoavelmente bem...
· PASS Summit 2014: http://www.sqlpass.org/summit/2014/RegisterNow.aspx
· Meus posts do PASS Summit 2012:
A viagem
Seattle não fica ali na esquina, então se prepare para uma viagem cansativa. A menos que você pegue alguma promoção eu espero que gaste entre R$ 2.500,00 e R$ 3.500,00 na passagem aérea, se tiver milhas para gastar, melhor. O aeroporto que você quer é Seattle Tacoma International Airport (Sigla: SEA - http://www.portseattle.org/Sea-Tac/Pages/default.aspx).
Para quem sai de Brasília a Delta oferece os melhores trechos, sendo o melhor BSB – Atlanta – Seattle (média de 17 horas de viagem). Vale ressaltar que o trecho dentro dos EUA é longo, com mais que 4 horas, e as refeições usualmente pagas. Então aproveito os minutos no aeroporto de entrada nos EUA para comprar alguma coisa para comer e já faço um teste com o cartão de crédito, para ver se foi liberado para uso no exterior.
Outra coisa que gosto de fazer é sair na sexta-feira de noite e chegar sábado de manhã em Seattle, assim eu aproveito o fim de semana antes do evento. Costumo voltar no voo de sábado, para chegar domingo cedo no Brasil, curtir a família e descansar para a segunda-feira.
O evento
O Summit tem 3 dias de duração com sessões diversas, precedido por 2 dias de pre-con (pagos à parte, US$ 495 cada). Idealmente você compra seu ingresso com bastante antecedência (se comprar até o fim desse ano o Summit de 2015 o desconto é muito bom!) e também as pre-sessions, que costumam ter de altíssimo nível. Não deixe de comprar o DVD Set com as gravações do evento, que para participantes costuma sair por US$ 195,00 e muito legal, pois usualmente existe colisão de horário entre grandes sessões.
O evento acontece no centro de convenções da cidade, o Washington State Conference Center (http://www.wscc.com/), que é um lugar grande, bem localizado e que acomoda muito bem um evento desse porte.
Caso você não vá participar da pre-con, pode procurar outros eventos, com o SQLSaturday que costuma acontecer nas redondezas de Seattle ou SQL in the City da RedGate (http://sqlinthecity.red-gate.com/), que torço para acontecer neste ano.
Dicas para aproveitar ao máximo o evento
TODO
Carro
Durante o evento é besteira você ficar com o carro, a menos que queria sair de noite para lugares mais longes, porém no centro de Seattle tem muita coisa legal para fazer, então minha recomendação é para pegar um carro antes ou depois do evento. Aí você deve considerar se o seu hotel tem incluso estacionamento, pois alguns cobram uma taxa (ex.: US$ 15) pela diária do estacionamento.
Outra dica é ficar atendo a lugares onde se pode estacionar e horários permitidos, pois é normal ficarmos sabendo de história onde amigos tomaram multa. Eu nunca tomei, mas bastou empresar um dia o carro que tomaram uma por mim! Hehehehe
Como o aluguel da semana é relativamente barato, muitos acabam optando por ficar a semana inteira com o carro. Se você optar por isso, ao invés de pagar a diária do GPS, por um pouco mais você compra um GPS novo e fica com ele para você.
Hospedagem
Ao lado do evento existem hotéis excelentes, como o Sheraton, Hilton, Crowne, Westin e W hotel, todos muito bons, mas um pouco salgado ($$$).
No meu caso eu costumo ficar nos hotéis pertos do Space Needle, que tem um bom custo benefício e são relativamente perto do centro de convenções (8 a 10 quarteirões – 15 a 20 minutos de caminhada). Alguns deles (busque por “<nomedoHotel> by the space needle”):
· Travelodge: http://www.travelodgeseattlecenter.com/
· Best Western: http://book.bestwestern.com/bestwestern/US/WA/Seattle-hotels/BEST-WESTERN-PLUS-Executive-Inn/Hotel-Overview.do?propertyCode=48068
Além do estacionamento duas outras coisas que sempre checo é o café da manhã e política de entrega de pacotes, pois alguns hotéis cobram para guardar e entregar suas encomendas.
Clima
TODO
Compras
Esse aqui Brasileiro curte:
· Eletrônicos: Bestbuy que nada, eu gosto de ir à Frys, que é uma loja de eletrônicos imensa que tem perto do aeroporto de Seattle (SEA-TAC) - http://www.frys.com/.
· Seattle Premium Outlet: aaaaahhhh, outlets, ruim né? O de Seattle fica longe da cidade, então recomendo ir de carro.
o Faça seu cadastro no site, imprima as promoções e pegue o cupom book, que dá bons descontos no outlet.
· Toys r’us e Baby r’us: para quem tem filho é parada obrigatória e existem lojas espalhadas ao redor de Seattle.
Não vou esticar aqui mais lojas, se quiserem mais dicas peçam.
O que visitar e conhecer
TODO – Provavelmente a parte mais longa deste post
Abraços
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br
Assinar:
Postagens (Atom)