How about viewing a transaction log file? Make sure you back up the source database.
USE db; GO
I also found great success in rebuilding indexes and defragmenting .
Tara Keezer published this, he proved that he helps us work with the database: Thanks Tara Kizer, if you read it!
-- required table IF OBJECT_ID('DefragmentIndexes') IS NULL CREATE TABLE DefragmentIndexes ( DatabaseName nvarchar(100) NOT NULL, SchemaName nvarchar(100) NOT NULL, TableName nvarchar(100) NOT NULL, IndexName nvarchar(100) NOT NULL, DefragmentDate datetime NOT NULL, PercentFragmented decimal(4, 2) NOT NULL, CONSTRAINT PK_DefragmentIndexes PRIMARY KEY CLUSTERED ( DatabaseName, SchemaName, TableName, IndexName, DefragmentDate ) ) GO IF OBJECT_ID(N'[dbo].[isp_ALTER_INDEX]') IS NOT NULL DROP PROC [dbo].[isp_ALTER_INDEX] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ------------------------------------------------------------------------------------------- -- OBJECT NAME : isp_ALTER_INDEX -- -- AUTHOR : Tara Kizer -- -- INPUTS : @dbName - name of the database -- @statsMode - LIMITED, SAMPLED or DETAILED -- @defragType - REORGANIZE (INDEXDEFRAG) or REBUILD (DBREINDEX) -- @minFragPercent - minimum fragmentation level -- @maxFragPercent - maximum fragmentation level -- @minRowCount - minimum row count -- @logHistory - whether or not to log what got defragmented -- @sortInTempdb - whether or not to sort the index in tempdb; -- recommended if your tempdb is optimized (see BOL for details) -- -- OUTPUTS : None -- -- DEPENDENCIES : DefragmentIndexes, sys.dm_db_index_physical_stats, sys.objects, sys.schemas, -- sys.indexes, sys.partitions, sys.indexes, sys.index_columns, INFORMATION_SCHEMA.COLUMNS -- -- DESCRIPTION : Defragments indexes ------------------------------------------------------------------------------------------- CREATE PROC [dbo].[isp_ALTER_INDEX] ( @dbName sysname, @statsMode varchar(8) = 'SAMPLED', @defragType varchar(10) = 'REORGANIZE', @minFragPercent int = 25, @maxFragPercent int = 100, @minRowCount int = 0, @logHistory bit = 0, @sortInTempdb bit = 0 ) AS SET NOCOUNT ON IF @statsMode NOT IN ('LIMITED', 'SAMPLED', 'DETAILED') BEGIN RAISERROR('@statsMode must be LIMITED, SAMPLED or DETAILED', 16, 1) RETURN END IF @defragType NOT IN ('REORGANIZE', 'REBUILD') BEGIN RAISERROR('@defragType must be REORGANIZE or REBUILD', 16, 1) RETURN END DECLARE @i int, @objectId int, @objectName sysname, @indexId int, @indexName sysname, @schemaName sysname, @partitionNumber int, @partitionCount int, @sql nvarchar(4000), @edition int, @parmDef nvarchar(500), @allocUnitType nvarchar(60), @indexType nvarchar(60), @online bit, @disabled bit, @dataType nvarchar(128), @charMaxLen int, @allowPageLocks bit, @lobData bit, @fragPercent float SELECT @edition = CONVERT(int, SERVERPROPERTY('EngineEdition')) SELECT IDENTITY(int, 1, 1) AS FragIndexId, [object_id] AS ObjectId, index_id AS IndexId, avg_fragmentation_in_percent AS FragPercent, record_count AS RecordCount, partition_number AS PartitionNumber, index_type_desc AS IndexType, alloc_unit_type_desc AS AllocUnitType INTO
The original post is here:
http://weblogs.sqlteam.com/tarad/archive/2009/08/31/DefragmentingRebuilding-Indexes-in-SQL-server-2005-and-2008.aspx
Besides index recovery and defragmentation, you can simply delete or get rid of data. If you have int / bigints as PK, this will allow you to reload PK with DBCC CHECKIDENT(tablename, value) .
You can use ALTER INDEX ALL ON MyTable REBUILD to rebuild indexes in your table.