E era muito pior no SQL Server 2000…

28/08/2009 15:04

Depois de ficar um dia inteiro trabalhando num pacote do SSIS, resolvi dar um zoom to fit no Visual Studio pra ter uma idéia geral do Control Flow do processo e me deparei com isso:

SSIS

O detalhe é que não está aparecendo na imagem os processos de Data Flow nem variáveis e scripts. Se fosse no SQL Server 2000 a coisa estaria muito mais complexa de ser analisada, porque o ambiente de desenvolvimento era a console de administração do SQL Server 2000 (o velho Enterprise Manager) .

Estou pensando em refatorar o processo em pacotes menores e criar um pacote maior para chamar os demais, mas o fato é que desde a versão 2005 do SQL Server desenvolver dentro do Visual Studio é uma tarefa muito melhor, sem contar o fato de que a solução está integrada ao Source Control do Team System.

Como eu gosto do SQL Server… e mais ainda do Visual Studio!

SQL Server



SQL Server 2008 - Série de posts chega ao fim

10/04/2009 23:55

SQLServer2008

Durante os meses de fevereiro e março apresentei aqui no Reverb uma série de posts sobre o SQL Server 2008, tratei sobre algumas novidades significativas, em especial para os desenvolvedores. Para quem não acompanhou a série desde o início, segue um atalho para todos os posts:

SQL Server 2008 (parte 1) - Programmability Enhancements
SQL Server 2008 (parte 2) - Programmability Enhancements
SQL Server 2008 (parte 3) - Security Enhancements
SQL Server 2008 (parte 4) - Datetime Data Type Enhancements
SQL Server 2008 (parte 5) - Hierarchyid Data Type
SQL Server 2008 (parte 6) - Table-Valued Parameters
SQL Server 2008 (parte 7) - Filtered Indexes
SQL Server 2008 (parte 8) - Sparce Columns
SQL Server 2008 (parte 9) - Compound Operators
SQL Server 2008 (parte 10) - Report Builder 2.0

Obviamente, as novidades desse magnífico produto não se resumem a lista acima, sendo esta apenas uma introdução aos novos conceitos e recursos. Uma excelente fonte de informações é o Books Online do SQL Server 2008, disponível para download aqui, ou através da instalação do produto. Espero que essa série tenha sido útil para você, muito provavelmente escreverei outros posts relacionados ao SQL Server, já que frequentemente o utilizo.

Abraços!

SQL Server



SQL Server 2008 (parte 10) – Report Builder 2.0

30/03/2009 21:19

Desde a versão 2005 o SQL Server disponibiliza uma ferramenta muito útil para criação de relatórios para o Reporting Services, chamada Report Builder. Com o SQL Server 2008 foi lançada a versão 2.0, incluindo diversas melhorias gráficas e maior facilidade no uso, contudo ainda é uma ferramenta direcionada a usuários avançados. O Report Builder 2.0 pode ser baixado a partir desse link.

Abaixo coloquei alguns screenshots do Report Builder 2.0. De fato, a criação de relatórios é bem simples, o Report Designer tem o layout semelhante ao Office 2007.

ReportBuilder2_01

Os gráficos criados podem ser publicados diretamente no Reporting Services Server, ou salvos localmente para consultas futuras. Abaixo um exemplo de relatório matricial.

ReportBuilder2_02

A nova versão suporta diversos tipos de gráficos, incluindo o Gauge.

ReportBuilder2_03

Até o próximo post!

SQL Server



SQL Server 2008 (parte 9) – Compound Operators

26/03/2009 23:19

Essa é uma melhoria do T-SQL, operadores compostos servem para executar uma operação sobre um dado valor, por exemplo:

DECLARE @Medida FLOAT = 27;
SET @x1 *= 0.567;
SELECT @Medida AS Fator;

No exemplo acima a variável @Medida recebe inicialmente o valor 27, na linha 2 é utilizado o operador composto *= que realizar uma operação de multiplicação do valor original da variável pelo número 0.567. Esse é um recurso presente em inúmeras linguagens de programação, no T-SQL temos as seguintes opções:

  • += (adiciona no valor original)
  • -= (subtrai do valor original)
  • *= (multiplica no valor original)
  • /= (divide do valor original)
  • %= (modulo do valor original)
  • &= (operação de bitwise “AND” sobre o valor original)
  • ^= (operação de bitwise exclusivo “OR” sobre o valor original)
  • |= (operação de bitwise “OR” sobre o valor original)

Até o próximo post.

SQL Server



SQL Server 2008 (parte 8) – Sparce Columns

23/03/2009 08:15

Em alguns casos o armazenamento dos dados deve ser cuidadosamente pensado para otimização, algum requisito específico de consulta pode ser menos importante que o espaço utilizado. Nesse sentido o SQL Server 2008 oferece um novo tipo de coluna chamada Sparce Column.

Para criar uma Sparce Column, utilize a palavra reservada SPARSE, conforme código a seguir:

CREATE TABLE Colaborador
(
	ColaboradorId int PRIMARY KEY,
	Nome varchar(80) NOT NULL,
	Titulo varchar(20) SPARSE NULL,
	TipoColaborador smallint SPARSE NULL
) ;
GO

Algumas considerações importantes sobre Sparce Columns:

  • Uma coluna do tipo Sparce Column deve ser definida como NULL;
  • Não pode ser dos tipos: text, ntext, image, timestamp, user-defined data type, geometry, ou geography; ou possuir um atributo FILESTREAM;
  • Não deve conter um valor default ou rule;
  • Uma coluna calculada não pode ser declarada com Sparse Column;
  • Não pode fazer parte de um índice;

Pelo fato das colunas do tipo Sparse aumentarem a sobrecarga de consulta para valores não nulos você deve considerar sua utilização quando o espaço ganho for de 20% a 40%, pelo menos. Um boa opção é a utilização em conjunto com Filtered Indexes, pois é possível indexar apenas linhas que contenham valores preenchidos criando um índice menor.

Até o próximo post da série.

SQL Server



SQL Server 2008 (parte 7) – Filtered Indexes

20/03/2009 23:52

Dando continuidade a série sobre as novidades do SQL Server 2008 veremos hoje o que são Filtered Indexes.


FILTERED INDEXES

A idéia é simples: índices criados com critério de filtro, ou seja, com uma cláusula WHERE, que usados corretamente podem conferir um ganho de performance interessante. Usar corretamente significa planejar a criação de um índice levando em consideração o tipo de consulta que será realizado, frequência de utilização, como os novos registros serão inseridos, e por aí vai.

Vamos ver como podemos criar filtered indexes criando primeiramente a seguinte tabela:

CREATE TABLE [dbo].[Colaborador]
(
   [ColaboradorId] [int] IDENTITY(1,1) NOT NULL,
   [Nome] [varchar](50) NOT NULL,
   [Email] [varchar](50) NULL,
   [Bonus] [int] NOT NULL,
   [TipoColaborador] [int] NULL,
   CONSTRAINT [PK_Colaborador] PRIMARY KEY CLUSTERED 
   (
      [ColaboradorId] ASC
   )
   WITH 
   (
      PAD_INDEX = OFF, 
      STATISTICS_NORECOMPUTE = OFF, 
      IGNORE_DUP_KEY = OFF, 
      ALLOW_ROW_LOCKS = ON, 
      ALLOW_PAGE_LOCKS = ON
   ) ON [PRIMARY]
) ON [PRIMARY]
GO

Criaremos agora um índice com filtro, da seguinte forma:

CREATE NONCLUSTERED INDEX TipoColabIndex 
ON dbo.Colaborador(TipoColaborador)
WHERE TipoColaborador = 1;
GO

O código acima criará um índice para a tabela Colaborador levando em consideração um filtro pela coluna TipoColaborador com o valor igual a 1. Desta forma, o optimizer do SQL Server poderá usar o índice quando necessário. Até o próximo post.

SQL Server



SQL Server 2008 (parte 6) – Table-Valued Parameters

18/03/2009 23:09

Em meu último post da série sobre as novidades do SQL Server 2008 o tema foi o Hierarchyid, hoje falarei sobre outro recurso de desenvolvimento introduzido na nova versão do SQL Server: Table-Valued Parameters.


TABLE-VALUED PARAMETERS

Basicamente, table-value parameter é um novo tipo que pode ser definido com a estrutura de uma tabela para ser usado como parâmetro em stored procedures ou dentro de rotinas, permitindo o transporte de várias linhas (rows) de dados.

Para criar um table-value parameter utilize o código abaixo adaptando as colunas de acordo com sua necessidade.

CREATE TYPE ColaboradorTableType AS TABLE 
( 
    Nome VARCHAR(50),
    Bonus INT 
);

Através da janela Object Explorer do Microsoft SQL Server Management Studio é possível checar o tipo criado no caminho ilustrado abaixo.

 tablavalue

Uma vez definido e criado, podemos usá-lo conforme o exemplo a seguir:

CREATE PROCEDURE spInsereColaborador
(
    @Colaboradores ColaboradorTableType READONLY
)
AS 
BEGIN    
    SET NOCOUNT ON
    INSERT INTO Colaborador (Nome, Bonus, DataCriacao)
    SELECT Nome, Bonus, GETDATE()
    FROM  @Colaboradores;
END   
GO

DECLARE @ColabTT AS ColaboradorTableType;

INSERT INTO @ColabTT (Nome, Bonus)
    SELECT Recurso, BonusConcedido
    FROM 
    Carga;

EXEC spInsereColaborador @ColabTT;
GO

No código acima foi criado uma stored procedure que recebe o parâmetro @Colaboradores definido como sendo do tipo ColaboradorTableType (linha 1 a 11) que pode ser usado da mesma maneira que faríamos com uma tabela. Na segunda parte do código criamos uma variável, também do tipo ColaboradorTableType chamada @ColabTT que recebe o resultado da consulta de uma tabela qualquer (linhas 14 a 21).

Na linha 3, junto com a declaração do parâmetro está a palavra reservada READONLY, obrigatória neste caso, já que parâmetros do tipo table-valued não podem realizar operações DML (insert, update e delete) no corpo da stored procedure. Em contrapartida, table-valued  parameters reduzem round trips para o servidor e podem oferecer um modelo mais simples de programação.

Até o próximo post!

SQL Server



SQL Server 2008 (parte 5) - Hierarchyid Data Type

18/02/2009 23:53

No último post da série sobre as novidades do SQL Server 2008 abordei os aprimoramentos para os data types de data e hora. Hoje veremos o novo tipo Hierarchyid e sua aplicação.


HIERARCHYID

O novo data type Hierarchyid permite armazenamento estruturado como uma hierarquia de relacionamento entre os dados.

Existem duas formas de pensar sobre o armazenamento da sua hierarquia, conforme as ilustrações a seguir:

hierarchyidProfundidade

Profundidade

Na chamada indexação por profundidade linhas são armazenadas em uma subárvore próximas umas das outras. Um bom exemplo para imaginarmos esse cenário é a relação entre gerentes e funcionários de uma empresa onde o armazenamento será próximo já que os funcionários se reportarão diretamente a algum gerente, da mesma forma que os gerentes a um diretor e assim por diante.

 

hierarchyidAmplitude

Amplitude

Neste tipo de estratégia as linhas de cada nível da hierarquia são armazenadas juntas, revendo o exemplo acima os funcionários que se reportam para um mesmo gerente são armazenados próximos uns dos outros.

 

 

 

Vejamos agora um exemplo com uma tabela simples para ilustrar os conceitos apresentados. A seguir temos o código para criação do exemplo:

CREATE TABLE Equipe
   (
    Lider hierarchyid,
    ReportaPara as Lider.GetLevel(), 
    ColaboradorId int UNIQUE NOT NULL,
    NomeColaborador nvarchar(50) NOT NULL
   ) ;
GO

Vamos inserir alguns registros utilizando o código descrito a seguir:

INSERT Equipe (Lider, ColaboradorId, NomeColaborador)
VALUES (hierarchyid::GetRoot(), 1, 'Lider A');
GO

INSERT Equipe (Lider, ColaboradorId, NomeColaborador)
VALUES (hierarchyid::GetRoot().GetDescendant(null, null), 2, 'Desenv A1');
GO

INSERT Equipe (Lider, ColaboradorId, NomeColaborador)
VALUES (hierarchyid::GetRoot().GetDescendant(null, null), 3, 'Desenv A2');
GO

INSERT Equipe (Lider, ColaboradorId, NomeColaborador)
VALUES (hierarchyid::GetRoot().GetDescendant(null, null), 4, 'Desenv A3');
GO

A sintaxe hierarchyid::GetRoot().GetDescendant(null, null) informa ao SQL Server que queremos obter o descendente derivado de Root, no caso, como temos apenas um registro inserido no Root (linhas 1 e 2 do código acima) as linhas serão relacionadas a esse registro.

Se quiséssemos inserir outro elemento derivado de Root, bastaria utilizar o seguinte código:

INSERT Equipe (Lider, ColaboradorId, NomeColaborador)
VALUES (hierarchyid::GetRoot(), 100, 'Lider B');
GO

Agora utilizaremos outra abordagem para inserimos alguns registros com outro nível de hierarquia.

DECLARE @Lider hierarchyid, @lc hierarchyid

SELECT @Lider = Lider
FROM Equipe
WHERE colaboradorId = 2

INSERT Equipe (Lider, ColaboradorId, NomeColaborador)
VALUES (@Lider.GetDescendant(@lc, NULL), 101, 'Desenv A11');

INSERT Equipe (Lider, ColaboradorId, NomeColaborador)
VALUES (@Lider.GetDescendant(@lc, NULL), 102, 'Desenv A12');
GO

Para visualizarmos o resultados vamos executar a query a seguir:

SELECT Lider.ToString(), * FROM Equipe

Repare que utilizei o método ToString() para fazer a conversão do tipo hierárquico para uma notação mais legível. Para visualizarmos todos os lideres do primeiro nível podemos utilizar a seguinte query:

SELECT Lider.ToString() AS OLider, *
FROM Equipe
WHERE Lider = hierarchyid::GetRoot() ;
GO

A query a seguir retorna todos as linhas derivadas do colaborador com o Id 2: 

DECLARE @Colaborador hierarchyid

SELECT @Colaborador = Lider
FROM Equipe
WHERE ColaboradorId = 2;

SELECT Lider.ToString() AS Colaborador, *
FROM Equipe
WHERE Lider.GetAncestor(1) = @Colaborador

Como vimos o novo data type Hierarchiyd permite um armazenamento inteligente e semântico para dados estruturados hierarquicamente, as aplicações são inúmeras. Espero que tenham gostado. Até o próximo post.

SQL Server