maggio 2009 - Posts

Riflessioni a caldo. Il database.
29 maggio 09 11.03 | abenedetti | with no comments

<venaPolemica_e_personale>

No Signori, il database NON è una scatola che deve essere solo in grado di proteggerci il c##o (“le spalle”) quando cade la corrente.

</venaPolemica_e_personale>

Indici duplicati. Qualche considerazione
27 maggio 09 02.22 | abenedetti | 6 comment(s)

Parto da una considerazione che si trasforma in domanda:

Perchè SQL Server permette la creazione di un indice che è perfettamente identico (tipo, colonne indicizzate, colonne incluse) ad un indice già presente?

Mi aspetterei almeno un warning, invece nulla.

La seconda domanda:

Può avere senso avere due indici perfettamente identici? Forse in casi estremi di disponibilità di una delle due strutture mentre l’altra viene ricostruita?

Non so, francamente non vedo il senso nel 99% degli scenari e degli utilizzi.

Fatto sta che avere due (o più) indici identici non porta alcun beneficio, anzi.

Ho un overead inutile in fase di INSERT / UPDATE / DELETE, ho storage occupato inutilmente, le operazioni di backup / restore sono più lunghe, …

 

Detto questo, qual è il rischio in cui si può incorrere quando un progetto viene sviluppato da più persone, ovvero quando un database viene modellato da più mani?

Proprio questo: creare un indice che esiste già! :-(

E SQL Server non fa nulla per venirci in aiuto o, almeno, non fa nulla in automatico.

Quindi, armato di TSQL, viste di sistema, FOR XML (per mettere su una stessa riga informazioni diverse), … potrei verificare la presenza di indici identici in questo modo:

;WITH tIndex AS 
(
SELECT
   
object_id AS id ,
   
index_id AS indid ,
   
type, 
   
name ,
   
(
       
SELECT
           
colid as colPosition
       
FROM sys.sysindexkeys
       
WHERE id = I.object_id AND indid = I.index_id
           
AND keyno > 0
       
FOR XML PATH  
   
) AS cols ,
   
(
       
SELECT includedCol FROM
       
(
           
SELECT
               
CASE keyno WHEN 0 THEN colid ELSE NULL END AS includedCol
           
FROM sys.sysindexkeys
           
WHERE id = I.object_id AND indid = I.index_id
       
) T0
       
order by includedCol
       
FOR XML PATH
   
) AS inc
FROM sys.indexes AS I 
)
SELECT
   
object_schema_name ( T1.id ) + '.' + object_name ( T1.id ) as tableName,
   
T1.name AS indexName,
   
T2.name AS duplicateIndex,
   
S.used_page_count * 8 indexSizeKB
FROM tIndex AS T1
JOIN tIndex AS T2 ON 
   
T1.type = T2.type AND
   
T1.id = T2.id AND 
   
T1.indid < T2.indid AND
   
T1.cols = T2.cols AND
   
T1.inc = T2.inc
JOIN sys.dm_db_partition_stats  AS S ON
   
S.[object_id] = T2.id AND S.index_id = T2.indId
ORDER BY object_schema_name ( T1.id ) + '.' + object_name ( T1.id ), T1.name
go

Provo a farne una verifica:

use tempdb
go

/* creo una tabella di esempio */
IF OBJECT_ID('dbo.anagrafica', 'U') IS NOT NULL
 
drop table dbo.anagrafica
go

create table anagrafica
(
idRecord smallint identity(1,1),
nome varchar(35),
cognome varchar(35),
cf char(16),
codice char(6)
)
go


/* credo tre indici, il primo cluster, gli altri due identici */
create clustered index idxAna1 on anagrafica (cf)
create nonclustered index idxAna2 on anagrafica (cf)
create nonclustered index idxAna3 on anagrafica (cf)
go

/* credo tre indici identici (anche con INCLUDE) */
create index idxAnaIncluded1 on anagrafica (cf) include (codice)
create index idxAnaIncluded2 on anagrafica (cf) include (codice)
create index idxAnaIncluded3 on anagrafica (cf) include (codice)
go

Questo il risultato:

image

Se lo provo sul database AdventureWorks (versione 2008)?

image

Che il db sia stato modellato da tante mani? :-)

DB Tuning Advisor… sarà il caldo?
21 maggio 09 04.29 | abenedetti | 1 comment(s)

Forse è il caldo, forse lo sto facendo lavorare troppo… ?!?!?

image

:-)

[SQL 2008] Filestream: verificare se è abilitato
18 maggio 09 06.17 | abenedetti | with no comments

Per utilizzare il FILESTREAM, funzionalità con cui mi diverto molto :-), è necessario per prima cosa abilitare il servizio.

Detto questo, una domanda: come posso, via T-SQL, verificare che sia abilitato?

Tramite la stored procedure sp_configure, ovvero se volessi “appoggiare” la configurazione in una mia tabella temporanea:

IF OBJECT_ID('[tempdb]..[#myTableConfig]') IS NOT NULL
DROP TABLE [dbo].[#myTableConfig] 

CREATE TABLE [dbo].[#myTableConfig] 
(
   
[name] nvarchar(70), 
    [minimum] int, 
   
[maximum] int, 
    [config_value] int, 
   
[run_value] int
) 

INSERT INTO [dbo].[#myTableConfig]
EXEC sp_configure 'filestream access level' 

SELECT * FROM [dbo].[#myTableConfig] 
Filestream & Alter Index Rebuild
11 maggio 09 12.35 | abenedetti | with no comments

La versione RTM di SQL Server 2008 aveva un fastidioso comportamento nel momento in cui si fosse lanciata in esecuzione un’istruzione di ALTER INDEX REBUILD su tabelle contenenti oggetti FILESTREAM.

La REBUILD, semplicemente, andava a copiare (senza che ce ne fosse realmente bisogno) anche i files memorizzati su disco, provocando un tempo di attesa proporzionale allo storage occupato.

 

La FIX (qui) è stata inclusa già nel primo Cumulative Update rilasciato a Dicembre 2008.

Ricordo, inoltre, che è già disponibile, dalla prima metà di Aprile, il SP1 qui.

Policy Management Framework e SP di sitema :-)
08 maggio 09 05.06 | abenedetti | with no comments

Non mi sono mai piaciute le stored procedure che iniziano per sp_

Con SQL Server 2008, con il Policy Management Framework, diventa molto facile creare delle policy che possano verificare regole definite a nostro piacimento.

Ad esempio fare in modo che le procedure create non abbiano il loro nome like ‘sp_%’, ovvero:

image

Attenzione a lasciare la condizione abilitata su tutti i database, quelli di sistema compresi.

Nel momento in cui vorrete creare un diagramma su un vostro db, potreste incorrere in questo:

image

image

:-)

[SSMS] Abilitare / disabilitare l’intellisense
06 maggio 09 01.55 | abenedetti | with no comments

Una delle novità presenti nella versione 2008 del Management Studio è, certamente, l’intellisense.

Ok, a qualcuno non piace :-)

Posso disabilitarlo entrando nelle opzioni dello strumento:

image

Recuperare le (la lista delle) colonne FILESTREAM
05 maggio 09 05.04 | abenedetti | with no comments

Oggi, parlando di SQL Server 2008 e FILESTREAM, mi è stato chiesto:

Come faccio a recuperare la lista delle colonne ( varbinary(max)) con l’attributo FILESTREAM?

La vista sys.columns ha l’attributo is_filestream che fa al caso nostro.

Mettendo opportunamente in join le viste di tabelle, schema e colonne si ottiene il risultato cercato:

use AdventureWorks 
go 

select 
   
s.name as schemaName, t.name as tableName, c.name as columnName
from sys.schemas as s
join sys.tables as t on s.schema_id = t.schema_id
join sys.columns as c on t.object_id = c.object_id
where c.is_filestream = 1
order by s.name, t.name, c.name

image

This Blog

Syndication