BI experience

7 juin 2017
par maryam khiali
0 Commentaires

Femme ingénieure

En me baladant sur le net, je suis tombée sur ce site que j’ai trouvé génial : femme-ingenieure.fr.
Quand j’étais en école d’ingénieur, j’aurai vraiment aimé avoir accès à ce genre de site. Nous étions 15 filles sur une promotion de 300 personnes…
Il est vrai qu’être une femme dans le milieu du numérique n’est pas toujours facile à bien des égards que ce soit en milieu scolaire ou même en milieu profesionnel.
En parcourant ce site, j’ai constaté que les esprits changent et ça fait du bien!
Bonne lecture!

6 juin 2017
par maryam khiali
0 Commentaires

Reportservertempdb grossit de manière significative

N’ayant pas de serveurs surdimensionnés à ma disposition, le moindre gigaoctet est précieux.
En monitorant les serveurs j’ai pu constater que la table « Segment » de la base « Reportservertempdb » avait pris un volume de plus de 50Go.

En creusant le sujet, j’ai pu lire sur les forums que cette taille qui augmente pouvait avoir 4 causes:
- Cause 1 : le nombre de snapshot stockés par rapport
- Cause 2 : des rapports qui mettent plus de 10 minutes à s’exécuter
- Cause 3 : la non exécution de la procédure de clean up toutes les 10 minutes.
- Cause 4 : une base qui existe depuis longtemps qui n’a jamais été cleanée

- Solution 1 :
Etape 1 : Aller sur le « report manager », allez dans « Site Settings », et cocher « Limit the copies of report history to : 10  » au lieu du paramètre par défaut.
Etape 2 :Ensuite faire du ménage sur votre plateforme de rapport s’il y en a besoin en supprimant des snapshots non utilisés.

- Solution 2 :
Revoir ces rapports qui prennent trop de temps. Aller sur la base « Reportservertempdb » et exécuter la requête suivante pour les identifier :
 »
select Name, exe.UserName, exe.TimeStart, exe.TimeEnd, DATEDIFF(second,exe.TimeStart, exe.TimeEnd) as DureeEnSeconde
from [ReportServer].[dbo].[ExecutionLogStorage] exe,
[ReportServer].[dbo].[Catalog] cat
where cat.ItemID = exe.ReportID
ORDER BY DATEDIFF(second,exe.TimeStart, exe.TimeEnd) desc »

- Solution 3 :
Aller dans le fichier de Log de votre instance SSRS et regarder s’il y a un message d’erreur concernant la tâche CleanBatch

- Solution 4 :
Possibilité 1 : Vous pouvez choisi cette première possibilité peu extrême et faire ces étapes :
Etape 1 : éteindre le service report serveur
Etape 2 : exécuter un TRUNCATE des tables
Etape 3 : faire un shrink des fichiers de base de données
Etape 4 : redémarrer le service report serveur

Possibilité 2 : ou exécuter ce script pour un nettoyage en douceur :
 »
begin transaction

declare @cleanedSnapshots table (SnapshotDataId uniqueidentifier) ;
declare @cleanedChunks table (ChunkId uniqueidentifier) ;
declare @cleanedSegments table (ChunkId uniqueidentifier, SegmentId uniqueidentifier) ;
declare @deleteCount int ;

insert into @cleanedSnapshots
select distinct SnapshotDataId
from SegmentedChunk
where SnapshotDataId not in (select SnapshotDataID from SnapshotData)

– clean up chunks
set @deleteCount = 1 ;
while (@deleteCount > 0)
begin
delete top(20) SC
output deleted.ChunkId into @cleanedChunks(ChunkId)
from SegmentedChunk SC with (readpast)
join @cleanedSnapshots cs on SC.SnapshotDataId = cs.SnapshotDataId ;
set @deleteCount = @@ROWCOUNT ;
end ;

– clean up unused mappings
set @deleteCount = 1 ;
while (@deleteCount > 0)
begin
delete top(20) CSM
output deleted.ChunkId, deleted.SegmentId into @cleanedSegments (ChunkId, SegmentId)
from ChunkSegmentMapping CSM with (readpast)
join @cleanedChunks cc ON CSM.ChunkId = cc.ChunkId
where not exists (
select 1 from SegmentedChunk SC
where SC.ChunkId = cc.ChunkId )
and not exists (
select 1 from [ReportServerTempDB].dbo.SegmentedChunk TSC
where TSC.ChunkId = cc.ChunkId ) ;
set @deleteCount = @@ROWCOUNT ;
end ;

– clean up segments
set @deleteCount = 1
while (@deleteCount > 0)
begin
delete top(20) S
from Segment S with (readpast)
join @cleanedSegments cs on S.SegmentId = cs.SegmentId
where not exists (
select 1 from ChunkSegmentMapping csm
where csm.SegmentId = cs.SegmentId ) ;
set @deleteCount = @@ROWCOUNT ;
end

commit
 »

Possibilité 3 :ou encore exécuter :
DBCC CLEANTABLE (ReportServerTempDB,’dbo.Segment’, 0)
WITH NO_INFOMSGS;

Et vous? Avez vous déjà rencontré ce problème?

8 août 2016
par maryam khiali
0 Commentaires

SQL server Index et statistiques

Je voudrai faire cet article pour revenir sur des concepts basiques mais important.

Une base de données est constituée notamment de tables. Ces tables sont constituées notamment de colonnes, d’index et de statistiques. Jusqu’ici rien de nouveau…

L’une des choses qu’il faut étudier pour faire en sorte que votre base de données soit optimisée est l’exploitation de ces index et statistiques.

Rappel :

Les index :

  • Les index permettent sur une ou plusieurs colonnes de faire un trie sur les données (comme dans un annuaire). Le parcours des données n’en sera que plus facile pour le SGBD.
  • Lors de la création d’une PRIMARY KEY, un index est automatiquement créé : un index cluster. Il est unique pour chaque table.
  • D’autres index pourront être créés : des index « non-cluster »
  • Un index aura forcément une statistique associée.
  • Lors d’une requête si une fonction est appliquée sur le champ possédant un index, ce dernier ne sera pas utilisé (exemple : substring, YEAR(), etc.) pareil pour l’opérateur LIKE.
  • De plus, pour un index sur plusieurs colonnes, si dans une requête, l’ensemble de ces colonnes n’est pas appelé alors cet index ne sera pas utilisé

Les statistiques :

  • Les statistiques permettent d’avoir le nombre d’occurrences de chaque valeur d’une colonne. Elles représentent la distribution des valeurs.
  • SQL server se base sur ces statistiques pour évaluer le coût du plan d’exécution. En effet, lors de l’exécution d’une requête si le nombre de lignes avec le critère demandé est beaucoup plus petit que le nombre de lignes total de la table alors SQL server utilisera l’index sinon il parcourra toute la table. Le nombre de lignes avec le critère demandé correspondant au nombre d’occurrences  défini par les statistiques.
  • Lors de la création d’un index, une statistique est automatiquement créée
  • Des statistiques peuvent être créées sur des champs ne possédant pas d’index.
  • Les statistiques peuvent être créées automatiquement par SQL server grâce à l’option AUTO UPDATE STATISTICS

Evaluez votre base de données : les index de vos tables ainsi que les statistiques avec la date de leurs dernières mises à jour :
SELECT
SCHEMA_NAME([sObj].[schema_id]) AS [SchemaName]
, [sObj].[name] AS [ObjectName]
, CASE
WHEN [sObj].[type] = ‘U’ THEN ‘Table’
WHEN [sObj].[type] = ‘V’ THEN ‘View’
END AS [ObjectType]
, [sIdx].[index_id] AS [IndexID] — 0: Heap; 1: Clustered Idx; > 1: Nonclustered Idx;
, ISNULL([sIdx].[name], ‘N/A’) AS [IndexName]
, CASE
WHEN [sIdx].[type] = 0 THEN ‘Heap’
WHEN [sIdx].[type] = 1 THEN ‘Clustered’
WHEN [sIdx].[type] = 2 THEN ‘Nonclustered’
WHEN [sIdx].[type] = 3 THEN ‘XML’
WHEN [sIdx].[type] = 4 THEN ‘Spatial’
WHEN [sIdx].[type] = 5 THEN ‘Reserved for future use’
WHEN [sIdx].[type] = 6 THEN ‘Nonclustered columnstore index’
END AS [IndexType]
, [sCol].[name] AS [ColumnName]
, CASE
WHEN [sIdxCol].[is_included_column] = 0×1 THEN ‘Yes’
WHEN [sIdxCol].[is_included_column] = 0×0 THEN ‘No’
WHEN [sIdxCol].[is_included_column] IS NULL THEN ‘N/A’
END AS [IsIncludedColumn]
, [sIdxCol].[key_ordinal] AS [KeyOrdinal]
, [sObj].create_date
, [sObj].modify_date
,PhysicalStats.page_count as [Page_Count],
CONVERT(decimal(18,2), PhysicalStats.page_count * 8 / 1024.0) AS [Total Size (MB)],
CONVERT(decimal(18,2), PhysicalStats.avg_fragmentation_in_percent) AS [Frag %],
ParititionStats.row_count AS [Row Count],
CASE WHEN ParititionStats.row_count =0 THEN 0 ELSE CONVERT(decimal(18,2), (PhysicalStats.page_count * 8.0 * 1024)
/ ParititionStats.row_count)END AS [Index Size/Row (Bytes)]
, STATS_DATE([sIdx].object_id, [sIdx].index_id) as derniereDateMAJStatistique
FROM
[sys].[indexes] AS [sIdx]
INNER JOIN [sys].[objects] AS [sObj]ON [sIdx].[object_id] = [sObj].[object_id]
LEFT JOIN [sys].[index_columns] AS [sIdxCol]ON [sIdx].[object_id] = [sIdxCol].[object_id] AND [sIdx].[index_id] = [sIdxCol].[index_id]
LEFT JOIN [sys].[columns] AS [sCol]ON [sIdxCol].[object_id] = [sCol].[object_id] AND [sIdxCol].[column_id] = [sCol].[column_id]
LEFT JOIN sys.dm_db_index_physical_stats (DB_ID(),NULL,NULL,NULL,NULL) AS PhysicalStats ON
PhysicalStats.index_id = [sIdx].Index_id and PhysicalStats.object_id = [sIdx].object_id
LEFT JOIN sys.dm_db_partition_stats ParititionStats ON ParititionStats.index_id = [sIdx].index_id
and ParititionStats.object_id = [sIdx].object_id
WHERE
[sObj].[type] = ‘U’
ORDER BY [sObj].modify_date, [sObj].create_date , SCHEMA_NAME([sObj].[schema_id]), ColumnName

Cette requête  permet d’avoir une vision des indexs et de leurs statistiques  :

  • la taille de l’index
  • Le nombre de pages utilisé par cet index
  • La fragmentation de l’index
  • au regard du nombre de lignes total présent dans la table
  • La dernière mise à jour de la statistique qui lui est associée
  • repérer les tables sans index : table avec un type d’index ‘HEAP’

Pour des index et statistiques à jour, il ne faut pas oublier de mettre en place un plan de maintenance avec les deux étapes de :

  • Rebuild des index
  • Update des statistiques

Avez vous des requêtes d’analyses à nous faire partager?

 

30 mars 2016
par maryam khiali
1 Commentaire

Cube SSAS dynamique

Quand on peut rendre nos développements dynamiques, il ne faut pas hésiter.

Le but est d’avoir des cubes avec une volumétrie (une profondeur) constante.

On peut obtenir cela en :

    • faisant appelle à des vues au niveau de la DSV qui auront un filtre temps en fonction de la GETDATE()
    • en mettant des partitions filtrées en fonction aussi de la GETDATE() (voir ce post)
    • Même démarche pour la dimension temps
    • et pour les slices? Et bien non, elles ne peuvent pas être rendues dynamiques.(voir MSDN). Même dans la version SQL server 2014…Peut être que se sera possible un jour mais en attendant si votre cube est dynamique, vous ne pourrez pas utiliser les slices avec une variable…
    • Petit bonus, voici ce petit lien qui explique vraiment bien l’intérêt de cette propriété.

Avez vous d’autres astuces pour rendre nos cubes autonomes et performants?

20 janvier 2015
par maryam khiali
1 Commentaire

La plateforme Microsoft

On m’a transmis un document avec ces 3 représentations ci-dessous. J’ai trouvé qu’elles étaient vraiment intéressantes car elle synthétise les outils mis en place par Microsoft et sa vision de la BI.

1er slide : Vision où le service informatique est garant de la BI dans l’entreprise

2eme slide : Vision d’une plateforme où les métiers sont garants de la BI dans l’entreprise

3eme slide : Vision d’une plateforme de collaboration entre le service informatique et les métiers. Les deux sont garants de la BI dans l’entreprise

Qu’en pensez vous? Dans quel cas êtes-vous? N’hésitez pas à partager votre expérience!