quick question about all indexes for my DB

  • hello guys, i am trying to get a list of all my indexes in my databases,

    i followed this article http://databases.aspfaq.com/schema-tutorials/schema-how-do-i-list-all-the-indexes-in-a-database.html

    and got my list of all indexes, however i am getting some listed as :

    _dta_index_DS_distrib_V_8_772718351__K48_K1_3_12

    _dta_index_DS_Orders_6_1101611363__K1

    _dta_index_DS_Orders_6_1101611363__K1_2

    _dta_index_DS_Orders_8_1101611363__K1_2_21

    idx_sysarticlecolumns

    c1sysarticles

    unc1sysarticleupdates

    nc3syspublications

    and i don't find them in the indexes for the table, are these statistics?

  • Hi

    How exactly did you retrieve your index list?

    Using sp_helpindex or sys.sysindexes?

    You will find stats in sys.sysindexes but sp_helpindex returns only indexes.

  • I use a modification of sp_helpindex

    I found in this site:

    http://www.mssqltips.com/tipimages/1003_sp_helpindex3.txt

  • Did you run the Database Tuning Advisor against that system? That looks like artifacts from there. Statistics usually have look something like _WA_SYS_0000003_0425A276.

    "The credit belongs to the man who is actually in the arena, whose face is marred by dust and sweat and blood"
    - Theodore Roosevelt

    Author of:
    SQL Server Execution Plans
    SQL Server Query Performance Tuning

  • hello, i ran the script in the link I mentioned above:

    http://www.mssqltips.com/tipimages/1003_sp_helpindex3.txt

    -- Modified sp_helpindex SP to show all indexes for all tables

    -- this was modified to handle object owned by dbo and other users

    CREATE proc sp_helpindex3

    --@objname nvarchar(776)-- the table to check for indexes

    as

    -- PRELIM

    set nocount on

    declare @objname nvarchar(776),

    @objid int,-- the object id of the table

    @indid smallint,-- the index id of an index

    @groupid smallint, -- the filegroup id of an index

    @indname sysname,

    @groupname sysname,

    @status int,

    @keys nvarchar(2126),--Length (16*max_identifierLength)+(15*2)+(16*3)

    @dbnamesysname,

    @usrname sysname

    -- Check to see that the object names are local to the current database.

    select @dbname = parsename(@objname,3)

    if @dbname is not null and @dbname <> db_name()

    begin

    raiserror(15250,-1,-1)

    return (1)

    end

    -- create temp table

    create table #spindtab

    (

    usr_namesysname,

    table_namesysname,

    index_namesysnamecollate database_default,

    statsint,

    groupnamesysname collate database_default,

    index_keysnvarchar(2126)collate database_default -- see @keys above for length descr

    )

    -- OPEN CURSOR OVER TABLES (skip stats: bug shiloh_51196)

    declare ms_crs_tab cursor local static for

    select sysobjects.id, sysobjects.name, sysusers.name from sysobjects inner join sysusers on sysobjects.uid = sysusers.uid where type = 'U'

    open ms_crs_tab

    fetch ms_crs_tab into @objid, @objname, @usrname

    while @@fetch_status >= 0

    begin

    -- Check to see the the table exists and initialize @objid.

    /*

    select @objid = object_id(@objname)

    if @objid is NULL

    begin

    select @dbname=db_name()

    raiserror(15009,-1,-1,@objname,@dbname)

    return (1)

    end

    */

    -- OPEN CURSOR OVER INDEXES (skip stats: bug shiloh_51196)

    declare ms_crs_ind cursor local static for

    select indid, groupid, name, status from sysindexes

    where id = @objid and indid > 0 and indid < 255 and (status & 64)=0 order by indid

    open ms_crs_ind

    fetch ms_crs_ind into @indid, @groupid, @indname, @status

    -- IF NO INDEX, QUIT

    --if @@fetch_status < 0

    --begin

    --deallocate ms_crs_ind

    --raiserror(15472,-1,-1) --'Object does not have any indexes.'

    --return (0)

    --end

    -- Now check out each index, figure out its type and keys and

    --save the info in a temporary table that we'll print out at the end.

    while @@fetch_status >= 0

    begin

    -- First we'll figure out what the keys are.

    declare @i int, @thiskey nvarchar(131) -- 128+3

    select @keys = index_col(@usrname + '.' + @objname, @indid, 1), @i = 2

    if (indexkey_property(@objid, @indid, 1, 'isdescending') = 1)

    select @keys = @keys + '(-)'

    select @thiskey = index_col(@usrname + '.' + @objname, @indid, @i)

    if ((@thiskey is not null) and (indexkey_property(@objid, @indid, @i, 'isdescending') = 1))

    select @thiskey = @thiskey + '(-)'

    while (@thiskey is not null )

    begin

    select @keys = @keys + ', ' + @thiskey, @i = @i + 1

    select @thiskey = index_col(@usrname + '.' + @objname, @indid, @i)

    if ((@thiskey is not null) and (indexkey_property(@objid, @indid, @i, 'isdescending') = 1))

    select @thiskey = @thiskey + '(-)'

    end

    select @groupname = groupname from sysfilegroups where groupid = @groupid

    -- INSERT ROW FOR INDEX

    insert into #spindtab values (@usrname, @objname, @indname, @status, @groupname, @keys)

    -- Next index

    fetch ms_crs_ind into @indid, @groupid, @indname, @status

    end

    deallocate ms_crs_ind

    fetch ms_crs_tab into @objid, @objname, @usrname

    end

    deallocate ms_crs_tab

    -- SET UP SOME CONSTANT VALUES FOR OUTPUT QUERY

    declare @empty varchar(1) select @empty = ''

    declare @des1varchar(35),-- 35 matches spt_values

    @des2varchar(35),

    @des4varchar(35),

    @des32varchar(35),

    @des64varchar(35),

    @des2048varchar(35),

    @des4096varchar(35),

    @des8388608varchar(35),

    @des16777216varchar(35)

    select @des1 = name from master.dbo.spt_values where type = 'I' and number = 1

    select @des2 = name from master.dbo.spt_values where type = 'I' and number = 2

    select @des4 = name from master.dbo.spt_values where type = 'I' and number = 4

    select @des32 = name from master.dbo.spt_values where type = 'I' and number = 32

    select @des64 = name from master.dbo.spt_values where type = 'I' and number = 64

    select @des2048 = name from master.dbo.spt_values where type = 'I' and number = 2048

    select @des4096 = name from master.dbo.spt_values where type = 'I' and number = 4096

    select @des8388608 = name from master.dbo.spt_values where type = 'I' and number = 8388608

    select @des16777216 = name from master.dbo.spt_values where type = 'I' and number = 16777216

    -- DISPLAY THE RESULTS

    select

    'usr_name'=usr_name,

    'table_name'=table_name,

    'index_name' = index_name,

    'index_description' = convert(varchar(210), --bits 16 off, 1, 2, 16777216 on, located on group

    case when (stats & 16)<>0 then 'clustered' else 'nonclustered' end

    + case when (stats & 1)<>0 then ', '+@des1 else @empty end

    + case when (stats & 2)<>0 then ', '+@des2 else @empty end

    + case when (stats & 4)<>0 then ', '+@des4 else @empty end

    + case when (stats & 64)<>0 then ', '+@des64 else case when (stats & 32)<>0 then ', '+@des32 else @empty end end

    + case when (stats & 2048)<>0 then ', '+@des2048 else @empty end

    + case when (stats & 4096)<>0 then ', '+@des4096 else @empty end

    + case when (stats & 8388608)<>0 then ', '+@des8388608 else @empty end

    + case when (stats & 16777216)<>0 then ', '+@des16777216 else @empty end

    + ' located on ' + groupname),

    'index_keys' = index_keys

    from #spindtab

    order by table_name, index_name

    return (0) -- sp_helpindex

    GO

  • ok after doing some research i found out my indexes that start with _dta_index are "hypothetical indexes" meaning they are not real indexes only recommendations from the DTA, so should be deleted. am i correct?

    what about the other ones ?

    i.e:

    c1sysarticles

    unc1sysarticleupdates

    nc3syspublications

    uc1syspublications... this is a publisher DB, could that be it? i am making a comparison of all the indexes between my publisher and subscriber DB, so those indexes don't come out in my subscriber DB.

    Do i need them? where do those indexes come from?:ermm:

  • Yes, DTA creates those Indexes and statistics. But do not suggest how to remove those.

    You may follow the step here to clean those up:

    Thanks,

    Shoeb

Viewing 7 posts - 1 through 6 (of 6 total)

You must be logged in to reply to this topic. Login to reply