marzo 2008 - Posts

MVP Global Summit 2008
31 marzo 08 12.36 | abenedetti | with no comments

Tra un paio di settimane avrà inizio il Summit 2008 degli MVP a Seattle (e così si torna un'altra volta dall'altra parte dell'oceano) ed anche quest'anno, capitanati dal nostro ALead, noi italiani saremo ben numerosi.

Ecco come Virtual Earth (grazie a SQL Server 2008, of course :-)) visualizza i partecipanti provenienti da tutto il mondo:

image

E dall'Italia:

image

Filed under: , ,
[RS 2008] Reporting Services senza IIS
31 marzo 08 12.16 | abenedetti | 1 comment(s)

Come forse alcuni di voi sapranno, la nuova versione dei Reporting Services, presente in SQL Server 2008, non necessita della presenza di IIS.

Ovvero significa che la nostra macchina che esporrà i servizi di reportistica potrà anche non avere installato IIS.

Provare per credere:

image

Ovvero:

  • IIS fermo
  • Report Manager che risponde tranquillamente

Anche se IIS non risulta necessario, è possibile comunque configurare indirizzo IP, porta TCP, URL, virtual directory ed anche, opzionalmente, un certificato SSL.

image

Tutto questo è possibile tramite il meccanismo chiamato "URL reservation", meccanismo tramite il quale la libreria HTTP.SYS (l'API di sistema necessaria per poter utilizzare servizi web senza IIS) abilita gli utenti all'utilizzo di uno specifico indirizzo.

Il setup dell'instanza, di default, riserva degli URL ben precisi, in riepilogo:

Questa caratteristica, ovvero la possibilità di chiamare servizi web senza IIS, non è, in realtà, una novità nella sua interezza.
SQL Server 2008, infatti, sfrutta lo stesso meccanismo che già la versione precedente (SQL Server 2005) sfruttava per esporre all'esterno stored procedure e/o funzioni alla stregua di Web Services.

Per chi volesse approfondire l'argomento segnalo due link relativi ad articoli presenti su MSDN:

[RS] Reporting, grafici e "show data label"
28 marzo 08 01.00 | abenedetti | with no comments

La funzione principale di un report è quella di presentare dati, e fin qui non ci piove.

Certamente meglio li si presenta, meglio è!

Per farlo ci sono tanti piccoli dettagli, uno di questi è, a mio parere, la  necessità di mostrare, all'interno di un grafico, anche il valore del dato che si sta rappresentando.

Per ottenere un risultato simile a questo:

image

Per poter visualizzare il valore all'interno del grafico è sufficiente selezionare la proprietà "Show Data Labels" sul grafico.

image

Nel momento in cui volessi anche modificare il layout del font mi è sufficiente selezionare le voci del mio grafico e andare su "Series Label Properties".

image

Filed under: ,
[RS] Il footer che preferisco
28 marzo 08 10.10 | abenedetti | with no comments

Quando costruisco dei report cerco sempre di inserire all'interno del footer informazioni utili alla comprensione dello stesso.

Questo è quello che preferisco:

image

Ovvero tre textbox contenenti informazioni (grazie all'utilizzo di alcune variabili globali) sulla data (e l'utente che ha eseguito il report), il tempo di esecuzione ed il numero di pagina visualizzata.

Ovvero:

  • data di esecuzione

= "Data esecuzione: " & Globals!ExecutionTime.ToLongDateString & " : " & Globals!ExecutionTime.ToLongTimeString + " | Utente: " & User!UserID

  • tempo di esecuzione
="Tempo di esecuzione: " +
IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).TotalSeconds < 1, "0 sec",
(
IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours & " hh, ", "") +
IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes & " mm, ", "") +
IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds & " ss", ""))
)
  • numero di pagina

= "Pag. " & Globals!PageNumber & " di " & Globals!TotalPages

Technet spotlight, British Airways & Security
26 marzo 08 12.30 | abenedetti | with no comments

Sul volo di ritorno da Seattle (un'ottima Pasqua per aria, su un ottimo Boeing 747 British Airways) ho avuto una piacevole sorpresa nel trovare, a disposizione della film library personale, un video di Microsoft Technet.

Per essere precisi il video "Network Security: The ancient art of defence" di John Craddock, uno dei guru internazionali per quanto riguarda la security, della serie Technet Spotlight (per chi volesse vedersi il filmato questo è il link).

Adesso devo scrivere una mail a SteveB perchè la prossima volta possa trovare un video dell'amico Raf! :-)

Filed under: , ,
[SQL 2008] Insert & Minimal Logging
25 marzo 08 11.59 | abenedetti | 1 comment(s)

Un nuovo comportamento, ancora poco pubblicizzato, ma a mio parere molto interessante, riguarda la possibilità di utilizzare una INSERT INTO ... SELECT ... con un logging minimo, così come posso avere utilizzando strumenti di caricamento massivo come la BULK INSERT o il comando BCP.

 

Un esempio rapido... Scenario: voglio inserire in una nuova (vuota) tabella 100.000 righe provenienti da un'altra tabella.

Ovvero: insert into copydata select a, b from data;

Utilizzo SQL Server 2005 e SQL Server 2008 per vedere le differenze di comportamento.

Alcune note:

  • il database deve essere in recovery model SIMPLE
  • devo utilizzare l'hint di tabella TABLOCK sulla tabella di destinazione
  • non posso avere indici clustered sulla tabella di destinazione

Per conoscere il numero di righe loggate nel Transaction Log utilizzeremo la funzione *non documentata* fn_dblog, semplicemente facendo un SELECT COUNT(*) ...

Questo il codice:

create table copydata(a int not null, b char(200) not null);
go

checkpoint;
go

select COUNT(*) n from ::fn_dblog(null, null);

insert into copydata with(tablock)
  select a, b from data;

select COUNT(*) n from ::fn_dblog(null, null);
go

I risultati:

  • SQL 2005
    • numero di log records 120.015
    • tempo di esecuzione: 15 secondi
  • SQL 2008
    • numero di log records 4.801
    • tempo di esecuzione: 5 secondi

image

image 

Non male, no?

[SQL 2008] System Resource Database
22 marzo 08 12.13 | abenedetti | 1 comment(s)

Ok, mi piace mettere il naso dentro SQL Server e questo si sapeva... ;-)

Ora che la nuova versione sta per uscire mi è venuta voglia di (ri)mettere la mani dentro il database di sistema "nascosto" System Resource (per chi non ne conoscesse l'esistenza consiglio di leggere questo mio post di qualche tempo fa).

L'idea è: voglio vedere se e quali differenze ci sono tra il db di SQL Server 2005 SP2 e quello che è attualmente nella CTP 6 di SQL Server 2008 (attenzione: parliamo di CTP non di RTM, quindi le cose potrebbero (potranno?) cambiare in futuro).

  1. primo step: fermo i servizi dell'istanza SQL 2005 e SQL 2008 e copio i file, rinominandoli a piacere, in una mia dir di lavoro
  2. faccio ripartire l'istanza 2008 (la 2005 non mi serve) e collego i db appena copiati con un'istruzione simile a:

USE [master]
GO
CREATE DATABASE [myMSSQLSystemResource2005] ON
( FILENAME = N'C:\myFolder\mssqlsystemresource_SQL2005.mdf' ),
( FILENAME = N'C:\myFolder\mssqlsystemresource_SQL2005.ldf' )
    FOR ATTACH
GO

CREATE DATABASE [myMSSQLSystemResource2008] ON
( FILENAME = N'C:\myFolder\mssqlsystemresource_SQL2008.mdf' ),
( FILENAME = N'C:\myFolder\mssqlsystemresource_SQL2008.ldf' )
    FOR ATTACH
GO

Due prime considerazioni:

1) nella versione 2008 il db ha cambiato la sua location. Non si trova più nella cartella DATA, quella di default per i database, ma si trova nella cartella BINN.

Perchè questa scelta?

Perchè è a tutti gli effetti questo db viene considerato come un contenitore di binari, alla stregua di una DLL (infatti non è possibile vederlo, salvarlo, navigarlo, ...)

image

2) le dimensioni, ovvero lo storage occupato dalle due versioni è notevolmente diverso (in effetti, qualcosa di nuovo ce lo aspettavamo no? Fosse altro per gestire tutte le nuove caratteristiche, Change Data Capture in primis)

image

Ora che ho a disposizione i due database, liberamente accessibili dal Management Studio,

image

voglio, per prima cosa, contare gli oggetti presenti all'interno:

select count(*) from myMSSQLSystemResource2005.INFORMATION_SCHEMA.ROUTINES
select count(*) from myMSSQLSystemResource2008.INFORMATION_SCHEMA.ROUTINES

  • SQL Server 2005: 2.180
  • SQL Server 2008: 2.411

A questo punto creo due db che possano contenere una semplice tabella dove poter inserire, per ogni oggetto, tipo,  schema, nome e script.

use master
go

create database system2005
go
create database system2008
go

use system2005
create table tableDifference
(
_type varchar(100),
_schema varchar(100),
_name varchar(100),
_definition varchar(max)
)
go

use system2008
create table tableDifference
(
_type varchar(100),
_schema varchar(100),
_name varchar(100),
_definition varchar(max)
)
go

Quindi popolo le tabelle con i dati provenienti dalla vista di sistema INFORMATION_SCHEMA.ROUTINES:

-- Inserisco le informazioni di SQL 2008
-- (2.411 righe)
use system2008
go
insert tableDifference
select routine_type, specific_schema, specific_name, routine_definition
from myMSSQLSystemResource2008.INFORMATION_SCHEMA.ROUTINES

-- Inserisco le informazioni di SQL 2005
-- (2.180 righe)
use system2005
go
insert tableDifference
select routine_type, specific_schema, specific_name, routine_definition
from myMSSQLSystemResource2005.INFORMATION_SCHEMA.ROUTINES

image

A questo punto posso utilizzare un qualsiasi strumento di data compare per fare un raffronto tra le due tabelle dei due database (2005 e 2008) ed analizzare / mettere il naso nei nuovi oggetti e, soprattutto, vedere e capire che cosa è stato modificato rispetto alla versione precedente.

Ad esempio, per la stored procedure di sistema sp_who2:

image

Una nota di colore: comincio a vedere, qua e là, commenti degli sviluppatori anche divertenti... :-)

[SQL 2008] Upgrading
21 marzo 08 08.00 | abenedetti | with no comments

La giornata odierna è tutta dedicata a strategie e considerazioni di upgrade.

Il concetto da cui si parte è lo stesso che utilizziamo da sempre:

  1. upgrade in place
  2. upgrade advisor
  3. application compatibility testing
  4. post upgrade optimization

Si parte quindi da operazioni a bassa complessità (e bassa importanza strategica) verso alta complessità (ed alta importanza strategica).

 

Considerazioni di upgrade:

  • da quali versioni:
    • 2000 SP4
    • 2005 SP2
  • componenti:
    • db engine
    • RS
    • AS
    • dts / SSIS
  • edizioni
    • express
    • workgroup
    • personal
    • standard
    • developer
    • enterprise
  • piattaforme
    • 32 bit
    • 64 bit
  • linguaggi
    • all :-)
Filed under: , ,
[SQL 2008] Upgrade Resource / Benefit Comparison
21 marzo 08 07.09 | abenedetti | with no comments

Un sunto, molto rapido, delle novità di SQL Server 2008, con particolare attenzione ai benefici che le nostre applicazioni potranno ottenere.

(*) richiede la versione Enterprise

  • Minor Changes
    • data / backup compression (*)
    • transparent data encryption (*)
    • resource governor (*)
    • filtered index / filtered statistics
    • query optimizer / storage engine enhancements (*)
    • enhancement SQL Serve audit(*)
    • SSRS / SSAS scalability improvements(*)
  • Moderate application operational / deployment changes
    • policy based management (DMF)
    • performance data collection
    • enhanced date and time support
    • T-SQL enhancements
    • sparse columnsupport
    • service broker enhancements
    • SSIS / SSRS / SSAS enhancements(*)
  • Significant application, operational or deployment changes
    • spatial support
    • HierarchyID Support
    • Change Data Capture (CDC)(*), Change Traking
    • LINQ support
    • Entity Framework support
    • ADO.Net Data Services Support

In ottica upgrade la parte di Minor Changes, termine che non significa "piccoli cambiamenti" ma "nessuna modifica richiesta per ottenere questi benefici", è immediatamente disponibile, in maniera assolutamente trasparente alle nostre applicazioni.

Ovvero: nessun costo / modifiche di implementazione! :-)

SQL Server 2008 Discussion Panel Questions
21 marzo 08 08.19 | abenedetti | 2 comment(s)

La giornata (la penultima) si chiude con un interessante Ask The Experts.

Erano con noi:

Quentin Clark – General Manager of SQL Server Engine
            Quentin will address questions about the SQL Server Database Engine
Gert Drapers -  Group Manager, Database Tools
            Gert will address questions about Visual Studio support for database developers
Ram Ramanathan – Senior Product Manager, SQL Marketing
            Ram will address marketing, licensing and launch related questions
S Muralidhar – Principal Architect, SQL DP Runtime
            Murali will address Microsoft Sync Framework and SQL CE related questions
Thierry D'Hers – Principal Group Program Manager, SQL Reporting Services
            Thierry will address BI related questions (SSAS, SSRS, SSIS)          
Rebecca Laszlo, PRINCIPAL PROGRAM MANAGER
            Rebecca will address upgrade and application compatibility related questions

Devo dire che le persone che avevamo di fronte erano tutte di altissimo livello.

image

Non posso scrivere molto, come al solito molte cose sono sotto NDA, ma alcune si:

  • upgrade advisor:
    • continuerà ad essere distribuito come download separato
    • lavorerà allo stesso modo della versione precedente (2005)
    • l'analisi ed il processo sarà identico alla versione precedente
  • la feature che ha richiesto più lavoro ed attenzione ("the most expensive") sono i nuovi data type date e time
  • i reporting services sono stati quasi praticamente riscritti
    • riscritti tutti i render
    • eliminata la necessità di IIS grazie al SQL OS inserito direttamente nei RS
    • nuove data region (tablix, chart, gauge)
[OT] Per il Presidente
21 marzo 08 08.11 | abenedetti | 1 comment(s)

image

Senza parole... :-)

Filed under: ,
[SQL 2008] A pranzo con un Lead ...
21 marzo 08 08.10 | abenedetti | with no comments

Oggi ho avuto il piacere di pranzare, sempre nel Building 35, con Cesar Galindo-Legaria, Development Lead per SQL Server (e finalmente si parla un pò di spagnolo :-)).
Domande, curiosita', e poi dritti al secondo piano dove dirige il suo team di Engine Optimization.

image

A: Da quanti anni lavori in Microsoft e di cosa ti occupi?
C: Sono in Microsoft da 12 anni, dal 1996 ed ho sempre lavorato nel team di Data Optimization.
Quando sono arrivato ero all'interno del team di Access poi, dopo solo sei mesi, e' nata la specifica divisione per SQL Server

A: Quante persone lavorano per SQL Server?
C: In totale, ovvero contando tutte le divisioni (database engine, analysis services, reporting, ...) circa mille persone.
Nel mio gruppo, Data Optimization, lavorano dieci persone.

A: Pane e C++?
C: Si, C++. Algoritmi, algoritmi, algoritmi

A: Tutto il giorno?
C: Si, scriviamo e testiamo sofisticati e complessi algoritmi.
E' divertente ma anche complesso, un po' come scrivere compilatori per linguaggi di programmazione

A: Qual e' la cosa piu' difficile del tuo lavoro?
C: Puo' sembrare strano ma e' trovare la giusta misura, il giusto compromesso tra le richieste che arrivano ed il loro uso. Si tratta di trovare un giusto equilibrio tra costi e benefici, tra l'importanza del problema e quanto le persone (i dev, i dba) useranno la soluzione

A: Mi dai la tua TOP 5 relativa alle nuove caratteristiche e funzionalita' di SQL Server 2008?
C: compression ("Is the big one!"), star join optimization per datawarehouse, spatial data type, extension to plain fixing e to plain forcing.

Saliti al secono piano ho avuto il piacere di conoscere e scambiare due parole con il responsabile delle statistiche Peter Zabback ed il responsabile del cost estimation Campbell Fraser ("main focus on Costing/Cardinality Estimation and Statistics") ovvero colui che decide (fa decidere) quale strada deve prendere l'engine per risolvere le nostre query!

 

Con Campbell abbiamo fatto una bella chiaccherata, di cui rilancio un piccolo riassunto:

Il costo stimato deriva da un modello matematico applicato alla query in esame.
Questo modello considera:
- gli algoritmi utilizzati da ogni operatore presente all'interno del piano di esecuzione
- il numero di righe che sara' elaborato da ogni operatore
- la distribuzione dei dati interessati (statistiche) per ogni operatore
- il numero di processori sulla macchina (processori utilizzabili)
- la memoria (ram) a disposizione

 image

Il costo stimato non potra' comunque essere mai "di parola", ovvero reale.
Fornisce un mezzo per poter confrontare (fare una stima) dei tempi di esecuzione  su diversi piani di esecuzione.
L'ottimizzatore, quindi, sceglie semplicemente il piano che ha questa stima piu' bassa rispetto agli altri.

Filed under: , ,
[SQL 2008] Ancora classifiche... ovvero: SELECT TOP 5 FROM FEATURES
21 marzo 08 08.01 | abenedetti | with no comments

Qualche settimana fa ho lanciato, come avevo gia' fatto per l'uscita di SQL Server 2005, la mia TOP 5 relativa alle nuove caratteristiche e funzionalita' di SQL Server 2008.

Ho esteso il gioco anche qui, a Redmond, con alcuni amici. Ecco che cosa hanno risposto...

Itzik Ben-Gan | Solid Quality Mentors

- grouping set
- date & time datatype
- merge statement
- filtered index
- table valued parameter

Greg Low | Solid Quality Mentors

- spatial datatype
- data compression
- backup compression
- resource governor
- merge statement

Eladio Rincon | Solid Quality Mentors

- data compression
- data encryption
- resource governor
- change data capture
- merge statement

Herbert Albert | Solid Quality Mentors

- data compression
- resource governor
- extended events
- full data auditing
- change data capture

Zach Skyles Owens | Technical Evangelist @ Microsoft Corporation

- spatial data type
- filestream data type
- resource governor
- data management framework
- change data capture

Lubor Kollar | Group Program Manager for Microsoft's SQL Server development team @ Microsoft Corporation

- data compression
- backup compression
- merge statement
- insert into with minimal logging
- sparse column

Simon Sabin | SQL Skills

- merge statement
- spatial data type
- filestream data type
- improvement fulltext
- improvement pipeline integration services

Filed under: ,
Reporting services e XML data source
21 marzo 08 07.51 | abenedetti | with no comments

Stimolato da un post sul forum UGISS, cerco di mettere ordine e tirare le fila circa la possibilita' di utilizzare file XML come data source dei nostri report.

In realta' parliamo solo di file XML come sorgente dati, non di come poter utilizzare XML uscente da un metodo remoto di un web service.

Supponiamo di avere un file xml come il seguente:

<?xml version="1.0"?>
<vendite>
    <categoria id="1" name="cat01">
        <cliente id="1" name="luca">
            <qta>12</qta>
        </cliente>
    </categoria>
    <categoria id="1" name="cat02">
        <cliente id="2" name="marco">
            <qta>1</qta>
        </cliente>
        <cliente id="3" name="giovanni">
            <qta>7</qta>
        </cliente>
    </categoria>
</vendite>

Supponiamo anche di averlo raggiungibile su un URL definito, ad esempio:

http://localhost:8081/OnlineShopping/vendite.xml

Vediamo i passi necessari e sufficienti per poter creare un dataset con i dati del nostro file.
Ci e' sufficiente definire la nostra sorgente dati con le seguenti caratteristiche:

- tipo XML
- data source: http://localhost:8081/OnlineShopping/vendite.xml

image

A questo punto definiamo la nostra query come: vendite / categoria / cliente

image

Alcune considerazioni:
- l'estensione XML ritorna data type stringa (in questo caso non posso utilizzare schema)
- non posso utilizzare sintassi XPath

Proprio per il motivo di cui sopra non saremmo in grado, immediatamente, di eseguire dei totali sui nostri dati (la voce di menu "total', infatti non e' disponibile).
Per farlo dobbiamo necessariamente, in maniera esplicita, utilizzare funzioni di conversione per trasformare le nostre stringhe, ad esempio, in formato numerico.
image

A questo punto possiamo aggregare i dati secondo le nostre necessita' e saremo comunque noi, a mano, che andremo ad inserire, ad esempio nel footer di una tabella, la corretta funzione di aggregazione che vogliamo utilizzare (ad esempio la SUM).

Filed under: , ,
[SQL 2008] Indici Unique con diversi valori nulli
20 marzo 08 07.53 | abenedetti | with no comments

Una delle limitazioni degli indici unique è sempre stata quella di poter accettare un solo valore NULL. Limitazione che, ad esempio, non è presente nei database Oracle.

Ovvero, ipotizzando di creare un vincolo unique su una colonna "codice fiscale", viene consentito un solo record in tabella che abbia il "codice fiscale" valorizzato a NULL.

In queste sere, complici ore e piccole diverse pinte di Alaskan Ale, le chiaccherate e le discussioni su SQL Server con gli amici di Solid si sprecano.

Proprio durante una di queste sere Itzik (e chi altro?) salta fuori con la domanda: "Come faccio, in SQL Server 2008, ad avere vincoli unique che possano accettare più valori null?"

Prima risposta: "Non puoi...".

Poi, dopo un altro paio di giri di birra, la risposta è stata semplice: filtered index!

O meglio: unique filtered index :-)

 

Vediamo un esempio:

use tempdb
go

/* creo una tabella per test */
create table anagrafica
(
idRecord int primary key identity(1,1),
cognome varchar(15),
nome varchar(15),
tesseraSanitaria varchar(10)
)
go

/* creo un indice univoco sulla tessera sanitaria,
filtrato per valori non nulli */
create unique index idxTesseraSanitaria
on anagrafica (tesseraSanitaria)
where tesseraSanitaria is not null
go

image

/* insert dati di prova - il secondo ed il terzo hanno tessera sanitaria nulla! */
insert anagrafica values ('paolo','rossi','abc123abc')
insert anagrafica values ('paolino','paperino', NULL)
insert anagrafica values ('topo','gigio', NULL)

/* vedo la tabella */
select * from anagrafica

image

/* Provo a fare un inserimento con una tessera sanitaria già presente */
insert anagrafica values ('ken','shiro','abc123abc')

image

/* Pulizia */
drop table anagrafica
go

Filed under: , ,
More Posts Next page »

This Blog

Syndication