INF: Description of sysindexes and sp_spaceusedID: Q90758
|
The sysindexes system table records the number of pages allocated and used by each table, index, and text or image column in a database. The sp_spaceused system stored procedure reports this information to users. This article explains some of the data in sysindexes and how it is used by sp_spaceused to calculate the values it reports.
The sysindexes table will have 1 to 255 rows for each table in the database. All rows for a given table will have the table's object ID in their ID column. All sysindexes rows for a table can be found with the following query:
SELECT *
FROM sysindexes
WHERE id = object_id('table_name')
The sysindexes rows for a table fall into the following categories:
Every table without a clustered index has a row with name = table_name and indid = 0. In this row:
dpages = Number of data pages, excluding text and image columns.
reserved = Number of pages reserved for dpages and ALL indexes.
used = Number of pages used for dpages and ALL indexes.
rows = Number of rows in the dpages.
A table with a clustered index has no row with name = table_name. There is instead a row with name = clustered_index_name and indid = 1.
In this row:
dpages = Number of data pages, excluding text and image columns.
reserved = Number of pages reserved for the dpages and ALL indexes.
used = Number of pages used for dpages and ALL indexes.
rows = Number of rows in the dpages.
A table with at least one text or image column will have a row with name = table_name prefixed with "t" (as in ttable_name), and indid = 255. In this row:
reserved = Number of pages reserved for all text or image data in the
table (all columns).
used = Number of pages used for all text or image data in the table
(all columns).
dpages and rows will be 0.
Every nonclustered index has a row with name = index_name and indid between 2 and 250. The values in these rows for dpages, reserved, used, and rows are not used by sp_spaceused.
Note that the data returned by SELECT statements on sysindexes is in numbers of pages. The number of pages is multiplied by the pagesize from
spt_values to get the number of bytes in the pages, then divided by 1,024 to get the number of kilobytes, which is the value returned by
sp_spaceused. The pagesize in spt_values for SQL Server on OS/2 is
2,048, so multiplying the values in the sysindexes columns by two gives the numbers of kilobytes reported by sp_spaceused.
#rows=
SELECT rows
FROM sysindexes
WHERE indid < 2 and id = @id
#reserved=
SELECT sum(reserved)
FROM sysindexes
WHERE indid in (0, 1, 255) and id = @id
#data=
(SELECT sum(dpages) + (SELECT sum(used)
FROM sysindexes FROM sysindexes
WHERE indid < 2 and id = @id) WHERE indid = 255 and id = @id)
#index_size=
(SELECT sum(used)
FROM sysindexes
WHERE indid in (0, 1, 255) and id = @id) - #data
unused=
#reserved - (SELECT sum(used)
FROM sysindexes
WHERE indid in (0, 1, 255) and id = @id)
NOTE: To reduce system overhead, sysindexes is not updated until a checkpoint. If you need to get a current report, issue a CHECKPOINT
command before issuing sp_spaceused or selecting from sysindexes.
Additional query words: system tables stored procedures
Keywords : kbusage SSrvServer
Version : OS/2:4.2
Platform : OS/2
Issue type : kbinfo
Last Reviewed: May 21, 1999