Como posso verificar o progresso/status quando submeto uma reorganização/reconstrução de índice alter?
nojetlag's questions
Eu tenho um banco de dados bastante grande que consiste basicamente em uma tabela, esta tabela é particionada por mês e todas as partições são compactadas com compactação de página. Após o carregamento inicial dos dados, houve operações de atualização (basicamente uma coluna foi definida de NULL para um valor tinyint). Depois disso, notei que no relatório de uso do disco mostrado nos arquivos, o espaço reservado cresceu muito em comparação com o espaço usado (81 GB x 24 GB). Isso obviamente resulta em uma grande perda de espaço em disco. Compactar a partição e reduzir o arquivo resulta em um índice clusterizado terrivelmente fragmentado para essa partição.
Qual seria a melhor prática para reduzir o uso de espaço em disco ao mínimo absoluto?
Eu tenho um banco de dados onde carrego arquivos em uma tabela de teste, dessa tabela de teste tenho 1-2 junções para resolver algumas chaves estrangeiras e depois insiro essas linhas na tabela final (que tem uma partição por mês). Eu tenho cerca de 3,4 bilhões de linhas para três meses de dados.
Qual é a maneira mais rápida de obter essas linhas do teste para a mesa final? Tarefa de fluxo de dados do SSIS (que usa uma exibição como origem e tem carregamento rápido ativo) ou um comando Insert INTO SELECT .... ? Eu tentei a tarefa de fluxo de dados e posso obter cerca de 1 bilhão de linhas em cerca de 5 horas (8 núcleos / 192 GB de RAM no servidor), o que parece muito lento para mim.
Eu tenho um dacpac que definiu o BlockOnPossibleDataLoss definido como falso, no entanto, a implantação é bloqueada quando eu a executo com sqlpackage.exe, informando "A coluna [a] está sendo descartada, pode ocorrer perda de dados".
No entanto, quando uso exatamente o mesmo perfil de implantação e publico no Visual Studio 2012, ele passa.
Qual é a melhor prática para a segurança do SQL Server? Usando grupos AD que recebem direitos em objetos de esquema ou devo adicionar os grupos AD a uma função de banco de dados que recebe direitos em objetos de esquema? Se a última for a melhor prática, qual é realmente o benefício de usar funções de banco de dados?
O SQL Management Studio permite criar scripts para todos os objetos db, mas até agora não consegui encontrar uma maneira de criar scripts corretamente em um esquema ou usuário. As permissões de um usuário em um esquema não são incluídas no script que é criado. Eu fiz algo errado ou a MSFT é um pouco desleixada?
Estou procurando as melhores práticas para lidar com trabalhos agendados do SQL Server Agent em grupos de disponibilidade do SQL Server 2012. Talvez eu tenha perdido alguma coisa, mas no estado atual sinto que o SQL Server Agent não está realmente integrado a esse ótimo recurso do SQL2012.
Como posso tornar um trabalho de agente SQL agendado ciente de uma alternância de nó? Por exemplo, eu tenho um trabalho em execução no nó primário que carrega dados a cada hora. Agora, se o primário ficar inativo, como posso ativar o trabalho no secundário que agora se torna primário?
Se eu agendar o trabalho sempre no secundário, ele falha porque o secundário é somente leitura.
Eu tenho uma função com valor de tabela
CREATE FUNCTION [dbo].[DateRange]
(
@StartDate date,
@EndDate date,
@Location varchar(25),
@Device varchar(25)
)
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM MyTable
WHERE Date < @EndDate AND
Date > @StartDate AND
Location = @Location AND
Device = @Device
);
Agora eu gostaria de dar ao usuário a opção de usar NULL como parâmetro de localização e/ou parâmetro de dispositivo para que ele receba todos os dados independentes da localização e do dispositivo de volta
Qual seria a maneira mais elegante e eficiente de fazer isso?
eu tenho uma mesa
CREATE TABLE [dbo].[Numbers]
(
[Date] [date] NULL,
[Time] [time](3) NULL,
[Value] [char](10) NULL
)
e a tabela tem > 10 bilhões de linhas, portanto é particionada por mês e tem um índice clusterizado em[Date], [Time] ASC
Agora eu uso uma função com valor de tabela que lê esses dados:
SELECT *
FROM [dbo].[QueryNumbers] ('2012-10-08','2012-10-08','07:00:00.000','08:00:00.000')
Isso me retorna cerca de 6.000 linhas em 1 segundo
No entanto, quando eu faço o mesmo assim:
declare
@StartDate date,
@EndDate date,
@StartTime time(3),
@EndTime time(3),
SET @StartDate = '2012-10-08';
SET @EndDate ='2012-10-08';
SET @StartTime ='07:00:00.000';
SET @EndTime = '08:00:00.000';
SELECT *
FROM [dbo].[QueryNumbers] (@StartDate,@EndDate,@StartTime,@EndTime)
A mesma consulta leva 3 minutos (o que é um desastre), brinquei um pouco com os parâmetros e parece que o parâmetro time aciona o comportamento diferente. Alguém tem uma dica para mim o que está acontecendo de errado aqui?
Tenho uma tabela que contém quatro anos de dados, onde para cada mês tenho uma partição baseada em um grupo de arquivos com dois arquivos. Inesperadamente, recebi mais oito anos de dados e preparei os arquivos de banco de dados e grupos de arquivos para esses anos.
O esquema atual abrange 200901 - 201512 e agora preciso adicionar 200001 - 200812. Qual é a melhor maneira de colocar isso online para a tabela particionada?
- Crie um novo esquema de partição e função de partição e altere o índice clusterizado para esse novo esquema de partição; ou
- Posso alterar de alguma forma o esquema de partição existente e a função de partição?
Estou perguntando porque a tabela atual tem 18 bilhões de linhas e quero fazer isso da maneira eficiente :)
Eu tenho um usuário [AD\dbusersgroup_limitedrights] que deveria ter em dois esquemas [ICD] e [XCD] dentro de um banco de dados apenas direitos SELECT e EXECUTE, porém para cada um dos usuários no [AD\dbusersgroup_limitedrights] eu criei um esquema com sua inicial corporativa
[DIS] [SUB] [TEC]
dentro desses esquemas, eles devem ter o direito de criar suas próprias tabelas, visualizações e procedimentos armazenados, baseados nos objetos dos esquemas [ICD] e [XCD].
Tornei o grupo agora proprietário do esquema [DIS],[SUB],[TEC] e nos outros dois esquemas concedi a eles o direito de SELECT e EXECUTE. Eu também criei o grupo db_role db_datareader para garantir que eles não obtenham direitos sobre outros esquemas criados posteriormente.
No entanto, embora sejam proprietários de seu próprio esquema, eles não podem criar objetos dentro dos esquemas. Presumo que isso se deva à função db db_datareader.
Portanto, para esse cenário, qual é a prática recomendada para conceder permissões limitadas em um banco de dados?
Eu tenho a escolha entre:
2 x X5687 (Processador Intel® Xeon® X5687 - QuadCore (12M Cache, 3,60 GHz, 6,40 GT/s Intel® QPI)
ou 2 x X5690 (Processador Intel® Xeon® X5690 - SixCore (12M Cache, 3,46 GHz, 6,40 GT/s Intel® QPI)
para um novo servidor de banco de dados (SQL 2008 R2 64 bits), minha preferência pessoal é X5690, existem razões que seriam contrárias a uma CPU SixCore versus uma CPU QuadCore?
Tenho várias exibições que são usadas para exportar dados do SQL-Server para arquivos .csv. Eles são todos executados por meio de pacotes SSIS. Nosso DBA decidiu definir o "Grau máximo de paralelismo" como 1 e me disse para usar MAXDOP onde acho que faz sentido.
Já vi muitas vezes que o MAXDOP realmente ajuda a extrair grandes quantidades de dados (especialmente quando resulta em uma varredura de tabela em todas as partições).
Perguntas
- Como posso usar MAXDOP em uma exibição?
- Existe uma maneira de contornar essa restrição?
De acordo com o BOL para SQL Server 2008 R2, o tipo de dados decimal requer os seguintes bytes de armazenamento:
Precision Storage bytes
1 - 9 => 5
10-19 => 9
20-28 => 13
29-38 => 17
No entanto, quando faço um datalength() em uma coluna formatada como decimal(19,5) e tem o valor de 10999,99999, recebo de volta 5 bytes? Que no meu entendimento é uma precisão de 10 e não de 9 e deve resultar em 9 bytes.
isso resulta em duas perguntas:
o tamanho da tabela com esta coluna não depende da definição da coluna, em vez disso, os valores verdadeiros dentro da coluna definem o tamanho da tabela?
por que as informações em BOL não correspondem ao que datalength () retorna?
Preciso criar 3 logins em uma instância do SQL Server 2005:
- DOMÍNIO\aaa
- DOMÍNIO\bbb
- DOMÍNIO\ccc
No entanto, dois deles (aaa e bbb) falham com o seguinte erro:
Msg 15401, Nível 16, Estado 1, Linha 5 Usuário do Windows NT ou grupo 'DOMAIN\aaa' não encontrado. Verifique o nome novamente.
Quando tento adicioná-los DOMAIN\AAA
e DOMAIN\BBB
funciona.
O que está causando esse estranho comportamento sensível a maiúsculas e minúsculas? E como posso adicionar todas as contas minúsculas?
Encontrei um artigo da KB da Microsoft para o erro 15401, mas nada explica esse comportamento.
Eu tenho vários pacotes de trabalho para cada um, configurei um trabalho no sql server agent. Às vezes eu deveria correr todos juntos. Qual é a melhor maneira de executá-los todos em uma determinada sequência? Estou um pouco surpreso que o sql server agent não seja capaz de incluir trabalhos como etapas de trabalho a serem executadas. eu tentei