Click here to monitor SSC
SQLServerCentral is supported by Red Gate Software Ltd.
 
Log in  ::  Register  ::  Not logged in
 
 
 
        
Home       Members    Calendar    Who's On


Add to briefcase

How to get index fragmentation of a database with query ? Expand / Collapse
Author
Message
Posted Wednesday, October 31, 2012 11:56 PM
Valued Member

Valued MemberValued MemberValued MemberValued MemberValued MemberValued MemberValued MemberValued Member

Group: General Forum Members
Last Login: Friday, May 10, 2013 3:11 AM
Points: 56, Visits: 150
Hi

I have a database having 260+ tables and many indexes and states.
Is there any way to get index fragmentation having more then 30% fragmentation through query.

so i can concentrate directly on that only and re-organize index.

its urgent. pls.

thanks for your time.
Post #1379635
Posted Thursday, November 01, 2012 12:21 AM
SSC Journeyman

SSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC Journeyman

Group: General Forum Members
Last Login: Friday, March 01, 2013 6:16 AM
Points: 81, Visits: 286
Try this one
select a.*,b.AverageFragmentation from 
(
SELECT
tbl.name AS [Table_Name],
tbl.object_id,
i.name AS [Name],
i.index_id,
CAST(CASE i.index_id WHEN 1 THEN 1 ELSE 0 END AS bit) AS [IsClustered],
CAST(case when i.type=3 then 1 else 0 end AS bit) AS [IsXmlIndex],
CAST(case when i.type=4 then 1 else 0 end AS bit) AS [IsSpatialIndex]
FROM
sys.tables AS tbl
INNER JOIN sys.indexes AS i ON (i.index_id > 0 and i.is_hypothetical = 0) AND (i.object_id=tbl.object_id)
)a
inner join
(
SELECT
tbl.object_id,
i.index_id,
fi.avg_fragmentation_in_percent AS [AverageFragmentation]
FROM
sys.tables AS tbl
INNER JOIN sys.indexes AS i ON (i.index_id > 0 and i.is_hypothetical = 0) AND (i.object_id=tbl.object_id)
INNER JOIN sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') AS fi ON fi.object_id=CAST(i.object_id AS int) AND fi.index_id=CAST(i.index_id AS int)
)b
on a.object_id=b.object_id and a.index_id=b.index_id

Post #1379639
Posted Thursday, November 01, 2012 2:00 AM
Valued Member

Valued MemberValued MemberValued MemberValued MemberValued MemberValued MemberValued MemberValued Member

Group: General Forum Members
Last Login: Friday, May 10, 2013 3:11 AM
Points: 56, Visits: 150
thanks for yr query.

i execute query i got :

spt_values 1451152215 spt_valuesclust 1 1 0 0 50
spt_values 1451152215 ix2_spt_values_nu_nc 2 0 0 0 80

its only 2 rows and spt_values is not my table. i have many indexes those not come here. how can i get details of all those indexes ?


  Post Attachments 
Qr1.JPG (3 views, 13.08 KB)
Post #1379657
Posted Thursday, November 01, 2012 2:01 AM


Old Hand

Old HandOld HandOld HandOld HandOld HandOld HandOld HandOld Hand

Group: General Forum Members
Last Login: Yesterday @ 11:21 PM
Points: 323, Visits: 961
your running it on master database ...


select your database then run Query


-----------------------------------------------------------------------------
संकेत कोकणे
Post #1379659
Posted Thursday, November 01, 2012 2:08 AM
Valued Member

Valued MemberValued MemberValued MemberValued MemberValued MemberValued MemberValued MemberValued Member

Group: General Forum Members
Last Login: Friday, May 10, 2013 3:11 AM
Points: 56, Visits: 150
there is no 'sys.dm_db_index_physical_stats' sp in my database. its in master only.
i have passed DB_ID of my local database.

is there any other way to run it in my database ?
Post #1379662
Posted Thursday, November 01, 2012 2:14 AM


Old Hand

Old HandOld HandOld HandOld HandOld HandOld HandOld HandOld Hand

Group: General Forum Members
Last Login: Yesterday @ 11:21 PM
Points: 323, Visits: 961
the scriptprovided by BriPan works perfect for me .
do not provide any dbid in script. just add one step


use 'YourDatabaseName'
go

select a.*,b.AverageFragmentation from
(
SELECT
tbl.name AS [Table_Name],
tbl.object_id,
i.name AS [Name],
i.index_id,
CAST(CASE i.index_id WHEN 1 THEN 1 ELSE 0 END AS bit) AS [IsClustered],
CAST(case when i.type=3 then 1 else 0 end AS bit) AS [IsXmlIndex],
CAST(case when i.type=4 then 1 else 0 end AS bit) AS [IsSpatialIndex]
FROM
sys.tables AS tbl
INNER JOIN sys.indexes AS i ON (i.index_id > 0 and i.is_hypothetical = 0) AND (i.object_id=tbl.object_id)
)a
inner join
(
SELECT
tbl.object_id,
i.index_id,
fi.avg_fragmentation_in_percent AS [AverageFragmentation]
FROM
sys.tables AS tbl
INNER JOIN sys.indexes AS i ON (i.index_id > 0 and i.is_hypothetical = 0) AND (i.object_id=tbl.object_id)
INNER JOIN sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') AS fi ON fi.object_id=CAST(i.object_id AS int) AND fi.index_id=CAST(i.index_id AS int)
)b
on a.object_id=b.object_id and a.index_id=b.index_id



-----------------------------------------------------------------------------
संकेत कोकणे
Post #1379665
Posted Thursday, November 01, 2012 2:32 AM
Valued Member

Valued MemberValued MemberValued MemberValued MemberValued MemberValued MemberValued MemberValued Member

Group: General Forum Members
Last Login: Friday, May 10, 2013 3:11 AM
Points: 56, Visits: 150
sorry yaar but need little more help.

i just copied and pasted your script in my query window and changed my database name with 'YourDatabaseName'

i got following error :

Msg 102, Level 15, State 1, Line 25
Incorrect syntax near '('.

it was coming yesterday too, when i googled i found that sys.dm_db_index_physical_stats sp is in master database only.
Post #1379669
Posted Thursday, November 01, 2012 2:49 AM


SSCertifiable

SSCertifiableSSCertifiableSSCertifiableSSCertifiableSSCertifiableSSCertifiableSSCertifiableSSCertifiableSSCertifiable

Group: General Forum Members
Last Login: Friday, April 12, 2013 3:51 AM
Points: 5,075, Visits: 4,831
sys.dm_db_index_physical_stats is not an SP its a DMV and depending what DB_ID() you pass in for the first parameter it will look through that DB for index fragmentation.

Take a look in my signature for the link to Ola's maintenance scripts and get a copy of the index and statistics maintenance script, no point reinventing the wheel when this script does everything you need and more.





Want an answer fast? Try here
How to post data/code for the best help - Jeff Moden
Need a string splitter, try this - Jeff Moden
How to post performance problems - Gail Shaw
CrossTabs-Part1 & Part2 - Jeff Moden
SQL Server Backup, Integrity Check, and Index and Statistics Maintenance - Ola Hallengren
Managing Transaction Logs - Gail Shaw
Troubleshooting SQL Server: A Guide for the Accidental DBA - Jonathan Kehayias and Ted Krueger

Post #1379675
Posted Thursday, November 01, 2012 2:56 AM
SSC Journeyman

SSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC JourneymanSSC Journeyman

Group: General Forum Members
Last Login: Friday, March 01, 2013 6:16 AM
Points: 81, Visits: 286
sys.dm_db_index_physical_stats can be used in all DB

just right click on YourDatabase then select New Query
in that query window run query which i have posted.


Just write DBname with USE you will not get error.

use Login --(Login is my Database Name)

Post #1379677
Posted Friday, November 02, 2012 11:27 PM
Valued Member

Valued MemberValued MemberValued MemberValued MemberValued MemberValued MemberValued MemberValued Member

Group: General Forum Members
Last Login: Friday, May 10, 2013 3:11 AM
Points: 56, Visits: 150
its great.
thanks a lot
Post #1380663
« Prev Topic | Next Topic »

Add to briefcase

Permissions Expand / Collapse