Políticas personalizadas para painéis AG de grupos de disponibilidade Always On do SQL Server


Neste 35º artigo em Grupos de disponibilidade Always On do SQL Server, implementaremos uma política personalizada para monitorar grupos de AG.

Introdução

O artigo anterior, O modelo Hub and Spoke de gerenciamento baseado em políticas para o grupo de disponibilidade Always On do SQL Server, explora os seguintes tópicos:

  • Componentes de gerenciamento baseado em políticas (PBM)
  • Modelo de integridade de réplica AG
  • Explorar categorias de política de PBM para Always On
  • Avalie a política e veja os estados das condições
  • Integre o painel AG e sua política de PBM equivalente

O SQL Server integra alguns sistemas definidos de política de PBM, condições para fins de monitoramento. No entanto, você pode querer personalizar o painel AG ou o modelo de integridade AG de acordo com seus requisitos. Vamos começar nossa jornada para uma política AG personalizada. read more

Coluna GUID do SQL Server com considerações de índice e scripts de identificação


Por: Mohammed Moinudheen | Atualizado: 2020-10-15 | Comentários (1) | Relacionado: Mais> Indexação

Problema

Em alguns dos bancos de dados SQL Server que gerencio, percebi que existem tabelas com colunas GUID e a coluna GUID é definida como a chave primária. Em uma verificação mais aprofundada, percebi que essas colunas GUID também têm um índice clusterizado exclusivo na coluna. Quais são os problemas com essa abordagem, especialmente quando o banco de dados cresce consideravelmente?

Solução

No SQL Server, existe um tipo de dados chamado Identificador único que pode ser usado para definir GUIDs. Para saber mais sobre GUIDs, consulte este excelente link de Siddharth Mehta e experimente os exemplos de consultas dessa dica.

Definindo uma chave primária

Definir uma chave primária em uma tabela criará automaticamente um índice clusterizado exclusivo, a menos que seja explicitamente mencionado para não criar um. Você pode usar os mesmos scripts desta dica.

CREATE TABLE Product_A
(
ID uniqueidentifier primary key default newid(),
productname varchar(50)
)

Aqui, você pode ver que definiu a chave primária na coluna ID. Isso criará um índice clusterizado correspondente, conforme mostrado abaixo à esquerda e no script à direita, que pode ser gerado a partir do SSMS.

No entanto, você poderia ter evitado esse cenário especificando a opção não agrupada conforme mostrado abaixo.

CREATE TABLE Product_B
(
ID uniqueidentifier primary key nonclustered default newid(),
productname varchar(50),
)
go
CREATE CLUSTERED INDEX CIX_Product_B_productname
ON Product_B(productname)
GO

Para esta demonstração, criaremos um índice clusterizado não exclusivo na coluna productname. Isso é apenas para fins de teste. Como a opção não clusterizada é mencionada explicitamente para a chave primária, o índice clusterizado não é definido na coluna uniqueidentifier.

Usos de GUIDs no SQL Server

Um dos principais usos dos GUIDs é em aplicativos baseados em mesclagem ou replicação. Colunas de chave primária baseadas em inteiros normais podem enfrentar problemas ao tentar mesclar dados e lidar com os problemas de conflito seria cansativo, especialmente se lidar com bancos de dados enormes em aplicativos ocupados. O uso do GUID ganhou popularidade com o tempo devido a esses benefícios. Você pode consultar este link, onde os prós e contras do uso de chaves primárias baseadas em inteiros ou GUID são explicados por Armando Prato.

Todos os fatores mencionados são úteis, especialmente na fase de design do aplicativo, onde a tabela e os índices podem ser definidos com base nos requisitos corretos. Mas às vezes, coisas como um índice clusterizado em uma coluna de identificador exclusivo definido como uma chave primária podem ser negligenciadas, causando problemas de desempenho em estágios posteriores.

Qual é o problema se o índice clusterizado estiver em uma coluna de chave primária GUID?

O objetivo da chave primária é identificar exclusivamente cada linha da tabela. Portanto, não há problema em ter o GUID como chave primária. No entanto, como vimos anteriormente, criar apenas a chave primária por padrão também cria um índice clusterizado exclusivo, a menos que seja mencionado o contrário.

O índice clusterizado como sabemos, ajuda a definir a ordem física das linhas da tabela. Como os GUIDs são gerados aleatoriamente, definir o índice clusterizado na coluna GUID levará a divisões de página na estrutura da página onde os dados são inseridos no meio da página com base no valor do identificador exclusivo. Este tipo de divisão de página terá um impacto em INSERTs e UPDATEs. Isso levará a problemas com as instruções SELECT também devido à grande fragmentação. Você pode consultar este link de Ben Snaidero, onde ele compara nitidamente as divisões de página ao usar os tipos de dados int, bigint ou GUID.

Demonstração sobre o impacto da fragmentação ao usar o índice clusterizado na chave primária GUID

Para saber mais sobre fragmentação, consulte esta excelente dica de Brady Upton, onde ele oferece uma boa visão geral da fragmentação de índice do SQL Server. Você pode usar os mesmos scripts desta dica para obter a porcentagem de fragmentação.

SELECT OBJECT_NAME(ips.OBJECT_ID) ,i.NAME ,ips.index_id ,index_type_desc ,avg_fragmentation_in_percent ,avg_page_space_used_in_percent ,page_count FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED') ips INNER JOIN sys.indexes i ON (ips.object_id = i.object_id) AND (ips.index_id = i.index_id) ORDER BY avg_fragmentation_in_percent DESC read more

Como provisionar Banco de Dados SQL do Azure usando Ansible


Neste artigo, você aprenderá a escrever um manual com o Ansible para provisionar o banco de dados SQL do Azure. Além disso, você também aprenderá sobre o Ansible e suas construções e conceitos de design.

Neste artigo, você conhecerá os seguintes conceitos:

  1. Visão geral do Ansible
  2. Detalhe a abstração de automação
  3. Manual Ansible
  4. Prepare o ambiente
  5. Escrever tarefas e manipuladores
  6. Implantar Banco de Dados SQL do Azure com manuais Ansible
  7. E mais…

Visão geral do Ansible

Ansible é uma ferramenta simples, flexível, de código aberto e extremamente poderosa que nos dá a capacidade de automatizar tarefas comuns de infraestrutura, executar comandos ou scripts ad-hoc, implantar o aplicativo multicamadas e simplificar o fornecimento de nuvem ou tarefas de gerenciamento de recursos. Isso nos dá a flexibilidade de lançar comandos em vários hosts em paralelo. Além disso, ajuda na implantação perfeita e gerencia de maneira eficaz e eficiente o processo de implantação usando manuais. read more

Explore the Role of Normal Forms in Dimensional Modeling


By: Nai Biao Zhou   |   Updated: 2020-10-06   |   Comments (9)   |   Related: More > Database Design

Problem

The debate over star schemas and snowflake schemas has been around in the dimensional
modeling for a while. Designers with a transactional database design background
cannot resist creating normalized dimension tables even though they agree to use
the star schema. Data redundancy and duplication in dimension tables does not make
them comfortable and they argue that normalized dimension tables require less disk
space and are easier to maintain. To make them use star schemas consistently, we
need to explain what normal forms should be used in the data warehouse design, why
we should use them and how to design a dimensional model. read more

Prediction with Classification in Azure Machine Learning


Introduction


After discussing Regression in the previous article, let us discuss the techniques for Classification in Azure Machine learning in this article. Like regression, classification is also the common prediction technique that is being used in many organizations. Before the regression we have discussed basic cleaning techniques, feature selection techniques and Principal component analysis in previous articles, now we will be looking at data classification techniques in azure
machine learning in this article. read more

Melhor monitoramento de falha de trabalho do SQL Server Agent – SQLServerCentral


O SQL Server Agent tem um processo de alerta integrado para quando os trabalhos falham, mas as informações que ele fornece não são muito úteis. Você só diz qual trabalho, a que horas, quem o executou e qual etapa falhou. Se você quiser ver por que ele falhou, você deve revisar o histórico do trabalho manualmente. Em um sistema ocupado com muitos trabalhos executados com frequência, o histórico de trabalhos pode ter se apagado no momento em que você o examina, especialmente se você deixou os limites do histórico de trabalhos nos padrões do SQL Server, algo que detectamos rotineiramente em nossas revisões de banco de dados.

Como prática recomendada, recomendamos aumentar o Tamanho máximo do registro do histórico de trabalho e a Máximo de linhas de histórico de trabalho por trabalho para 100.000 e 1.000 respectivamente, para dar a você uma chance melhor de obter histórico de trabalho útil do Agente:

Além disso, para um trabalho com várias etapas, em que algumas etapas são definidas para “ir para a próxima etapa” quando falham, você nunca receberá um alerta de que elas falharam. Para remover a investigação manual, supere essas lacunas e garanta que um alerta útil seja gerado para qualquer falha de etapa do trabalho, crie um trabalho do SQL Server Agent que execute a consulta SQL incluída abaixo.

A consulta SQL fornecida usa um token para identificar o trabalho em que está sendo executado e, em seguida, usa-o para descobrir quando o trabalho foi executado pela última vez e obter todas as falhas de trabalho desde então. Isso significa que você pode programar a execução da tarefa com a frequência que desejar e sempre apresentará as falhas desde a última vez em que foi executada.

A consulta SQL envia os detalhes em um e-mail usando o SQL Server Database Mail. Você precisará ter isso ativado e ter um perfil de e-mail padrão configurado (ou atualizar a consulta SQL para especificar seu perfil de e-mail). Ele enviará um e-mail por trabalho, com todas as instâncias desse trabalho falhando contidas no e-mail. Isso significa que você terá tudo em um só lugar para várias falhas de um trabalho, e cada trabalho individual pode ser enviado a diferentes pessoas ou equipes para análise, se necessário.

Os emails de falha são formatados conforme mostrado abaixo:

Tabela de resultados do email de falha do SQL Server xTEN Leeds

O código SQL a ser adicionado ao trabalho é mostrado aqui:

-- Get the job ID for the job this is running in. -- Note, will only run inside the job, not in an SSMS query DECLARE @JobID UNIQUEIDENTIFIER; SET @JobID = (SELECT CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID)))); --Get the last time this job ran DECLARE @LastRunTime DATETIME; SET @LastRunTime = (SELECT MAX([msdb].[dbo].agent_datetime(jh.[run_date], jh.[run_time])) FROM [msdb].[dbo].[sysjobhistory] jh WHERE jh.[job_id] = @JobID); --Get all the failed jobs into a temp table, and give each individual job an ID SELECT RANK() OVER(ORDER BY j.[name] ASC) AS FailedJobsID, j.[name] AS JobName, jh.[step_name] AS StepName, [msdb].[dbo].agent_datetime(jh.[run_date], jh.[run_time]) AS RunDateTime, SUBSTRING(jh2.[message], PATINDEX('%The Job was invoked by User%', jh2.[message]) + 28, PATINDEX('%The last step to run was%', jh2.[message]) -PATINDEX('%The Job was invoked by User%', jh2.[message])-28) AS ExecutedBy, REPLACE(SUBSTRING(jh.[message], 1, PATINDEX('%. %', jh.[message])) , 'Executed as user: ','') AS ExecutionContext, REPLACE(SUBSTRING(jh.[message], PATINDEX('%. %', jh.[message]) + 2, LEN(jh.[message]) - PATINDEX('%. %', jh.[message])-1), ' The step failed.','') AS FailureMessage, 0 AS Emailed INTO #FailedJobs FROM [msdb].[dbo].[sysjobs] j INNER JOIN [msdb].[dbo].[sysjobhistory] jh ON jh.[job_id] = j.[job_id] INNER JOIN [msdb].[dbo].[sysjobsteps] js ON js.[job_id] = j.[job_id] AND js.[step_id] = jh.[step_id] INNER JOIN [msdb].[dbo].[sysjobhistory] jh2 ON jh2.[job_id] = jh.[job_id] --Job isn't currently running WHERE jh.[run_status] = 0 --Only get jobs that ran since we last checked for failed jobs AND [msdb].[dbo].agent_datetime(jh.[run_date], jh.[run_time]) > DATEADD(SECOND,-1,@LastRunTime) --Join back to sysjobhistory again to get step_id 0 for the failed job, to find who executed it AND jh.[sql_severity] > 0 AND jh2.[step_id] = 0 AND [msdb].[dbo].agent_datetime(jh2.[run_date], jh2.[run_time]) <= [msdb].[dbo].agent_datetime(jh.[run_date], jh.[run_time]) AND NOT EXISTS (SELECT 1 FROM [msdb].[dbo].[sysjobhistory] jh3 WHERE [msdb].[dbo].agent_datetime(jh3.[run_date], jh3.[run_time]) > [msdb].[dbo].agent_datetime(jh2.[run_date], jh2.[run_time]) AND jh3.[job_id] = jh2.job_id) --Add any exclusions here, for example: --Any SSIS steps, as the job history doesn't show SSIS catalogue error messages. --Checks for running SQL on either node of an Always On Availability Group AND js.[subsystem] <> 'SSIS' AND jh.[message] NOT LIKE ('%Unable to execute job on secondary node%') AND jh.[message] NOT LIKE ('%Request to run job%refused because the job is already running from a request by User%'); --Variable to store the current job being dealt with DECLARE @CurrentFailedJobID INT; WHILE EXISTS (SELECT 1 FROM #FailedJobs) --Loop through all the failed jobs BEGIN SET @CurrentFailedJobID = (SELECT TOP 1 fj.[FailedJobsID] FROM #FailedJobs fj); --Set the email subject DECLARE @MailSubject VARCHAR(255); SET @MailSubject = (SELECT @@SERVERNAME + ': ' + fj.[JobName] + ' steps have failed' FROM #FailedJobs fj WHERE fj.[FailedJobsID] = @CurrentFailedJobID GROUP BY fj.[JobName]); --Set the output as an HTML table to make it clear to read DECLARE @tableHTML NVARCHAR(MAX) ; SET @tableHTML = N'<table border="1">' + N'<tr>'+ N'<th>Job Name</th><th>Job Step</th><th>Run Time</th><th>Run By</th><th>Execution Context</th><th>Error Message</th>' + N'</tr>' + CAST ( ( SELECT td = fj.[JobName], '', td = fj.[StepName], '', td = fj.[RunDateTime], '', td = fj.[ExecutedBy], '', td = fj.[ExecutionContext], '', td = fj.[FailureMessage], '' FROM #FailedJobs fj --Groups all the jobs with the same job name together into one email WHERE fj.[FailedJobsID] = @CurrentFailedJobID ORDER BY fj.[RunDateTime] DESC FOR XML PATH('tr'), TYPE ) AS NVARCHAR(MAX) ) + N'</table>' ; EXEC msdb.dbo.sp_send_dbmail @recipients="[email protected]", @subject = @MailSubject, @body = @tableHTML, @body_format="HTML" ; --Delete the currently emailed job from the failed jobs list DELETE fj FROM #FailedJobs fj WHERE fj.[FailedJobsID] = @CurrentFailedJobID; END read more

Efficiently polling remote data sources


Data rarely resides in one place. Oftentimes, there is a need to collect data from many different data sources and combine them locally into meaningful reports, analytics, or tables. The process for accessing, collecting, validating, and using data from remote data sources requires the same level of design and architectural considerations as building data structures for a software application.

In this article, methods of accessing remote data will be introduced with the goal of presenting best practices and ways to optimize load processes. This will lead into a discussion of performance and how to avoid the latency often associated with loading data from remote locations. read more

Why choose Oracle? – Simple Talk


As an applications development professional, my career objectives are to do work that is fulfilling in the sense that it challenges my capabilities, keeps me on the cutting edge of technology, and pays me decently. I have established my career as an Oracle Applications developer over the last two decades, and I couldn’t see myself doing anything else. Having worked with a few other technologies over the years, I can confidently say Oracle is a cut above most, as far as fulfilling my career goals is concerned. The purpose of this paper was to inspire a rising generation of IT professionals by highlighting some of the application development roles that I enjoy and how they are supported by Oracle technologies. read more

Copie dados entre armazenamentos de dados do Azure usando o Azure Data Factory


No artigo anterior, Iniciando sua jornada com o Microsoft Azure Data Factory, discutimos o conceito principal do Azure Data Factory, descrevemos os componentes do Data Factory e mostramos como criar um novo Data Factory passo a passo.

Neste artigo, mostraremos como usar o Azure Data Factory para orquestrar a cópia de dados entre os armazenamentos de dados do Azure.

Visão geral da atividade de cópia

A atividade Copiar no Azure Data Factory é usada para copiar dados entre os diferentes armazenamentos de dados que estão localizados no local e na nuvem, para usar os dados copiados em outras tarefas de transformação ou análise ou copiar os dados transformados ou analisados ​​para o loja final a ser visualizada. read more

Monitor SQL Server Always On Availability groups using extended events



In this 33rd article of SQL Server Always On Availability Group series, we will use extended events to
monitor the availability group.

Introduction


Database professionals’ primary role is to do proactive monitoring for ensuring system availability. DBA must
investigate the problem root cause analysis in case any critical event or downtime occurs. You can use various
things for investigation purposes such as SQL Server logs, Windows & Cluster logs, and dynamic management views
output, profiler and extended events. read more