2010-07-27 5 views
2

Je suis actuellement confronté à des optimisations de performance/consommation de mémoire de notre application. Une des tâches à effectuer est de remplacer tous les blobs dans la table qui correspondent à des tableaux vides avec des valeurs nulles; Cela devrait réduire la taille de la base de données, la consommation de mémoire et accélérer la charge. Voici la définition de la table:Détérioration des performances de SQL Server

CREATE TABLE [dbo].[SampleTable](
    [id] [bigint] NOT NULL, 
    [creationTime] [datetime] NULL, 
    [binaryData] [image] NULL, 
    [isEvent] [bit] NULL, 
    [lastSavedTime] [datetime] NULL, 
CONSTRAINT [PK_SampleTable] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

Je mis à jour la table et remplacé les valeurs de champ d'image (BinaryData) avec des valeurs NULL, le cas échéant (données correspondant à vider les tableaux dans l'application). Maintenant, j'observe la détérioration des performances lors de l'exécution de trivial SELECT * FROM SampleTable.

À l'origine, ces champs qui avaient été mis à jour avaient une longueur = 512 octets, mais ils ne savaient pas si cela importait.

Des idées pour lesquelles la sélection de blobs contenant des valeurs NULL prend plus de temps que la sélection de vraies données binaires même si les données sont identiques pour des lignes différentes?

+0

Etes-vous sûr que vous comparez des pommes avec des pommes? Quelles sont les deux commandes SQL que vous avez utilisées? Les avez-vous dirigés depuis le même endroit/environnement? SSMS? –

+0

Désolé de ne pas être clair: je cours la même requête 'Select * from Table' dans les deux cas. J'ai vérifié la performance de deux manières différentes: 1. À partir de Management studio 2. Exécutez l'application qui s'est connectée à db et exécutez la requête et inspecté les résultats dans le profileur SQL. Les résultats étaient similaires dans les deux cas. – Daniel

+0

Qu'est-ce que type '[dbo]. [Image]'? Est-ce un type de données CLR personnalisé? –

Répondre

0

Permettez-moi de vous aider à reformuler ceci:

Vous avez un serveur sql faire un scan de table lors du test every.single.record. pour une valeur nulle d'un côté, par rapport à l'autre où vous avez un serveur SQL qui fait un vidage massif de tous les enregistrements ...

Si vos blobs sont relativement petits, alors il est assez évident que l'on serait plus rapide ..

1

Je ne connais pas la réponse à cette question. J'ai essayé le test suivant et j'ai obtenu un résultat que j'ai trouvé surprenant.

CREATE TABLE [dbo].[SampleTable](
    [id] [BIGINT] NOT NULL, 
    [creationTime] [DATETIME] NULL, 
    [binaryData] [IMAGE] NULL, 
    [isEvent] [BIT] NULL, 
    [lastSavedTime] [DATETIME] NULL, 
CONSTRAINT [PK_SampleTable] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
) 
) 

INSERT INTO [dbo].[SampleTable] 
SELECT 1, GETDATE(), 
0x1111, 
1, GETDATE() 

INSERT INTO [dbo].[SampleTable] 
SELECT 2, GETDATE(), 
0x2222, 
2, GETDATE() 

INSERT INTO [dbo].[SampleTable] 
SELECT 3, GETDATE(), 
NULL, 
3, GETDATE() 


UPDATE [dbo].[SampleTable] SET [binaryData] = NULL 
WHERE [id]=2 

En regardant cela dans SQL Internals Viewer je fus surpris de voir une différence entre la ligne I inséré comme NULL et celui que je mis à jour à NULL.

Il semble que même lorsque la valeur est mise à jour à NULL, elle ne définit pas simplement le bitmap NULL pour une raison quelconque et doit toujours suivre un pointeur vers une autre page LOB_DATA.

NULL Inséré

Inserted http://img809.imageshack.us/img809/9301/row3.png

Mise à jour à NULL

Updated http://img84.imageshack.us/img84/420/row2.png

Questions connexes