patternsqlMinor
Is sys.stats_columns incorrect?
Viewed 0 times
stats_columnsincorrectsys
Problem
Let's say I have a table
The
The histogram also shows the statistics in the same order:
However,
Books Online says
Is this a bug in
I've verified this behaviour occurs on current builds of SQL Server 2005, 2008, 2008 R2, 2012, and 2014.
Foo with columns ID1, ID2 and a composite primary key defined over ID2, ID1. (I'm currently working with a System Center product that has several tables defined this way with the primary key columns listed in the opposite order they appear in the table definition.)CREATE TABLE dbo.Foo(
ID1 int NOT NULL,
ID2 int NOT NULL,
CONSTRAINT [PK_Foo] PRIMARY KEY CLUSTERED (ID2, ID1)
);
GO
-- Add a row and update stats so that histogram isn't empty
INSERT INTO Foo (ID1, ID2) VALUES (1,2);
UPDATE STATISTICS dbo.Foo;The
key_ordinal column in sys.index_columns shows the index columns in the same order they were declared in the composite primary key:SELECT t.name, i.name, c.column_id, c.name, ic.index_column_id, ic.key_ordinal
FROM sys.tables AS t
JOIN sys.indexes AS i
ON t.[object_id] = i.[object_id]
JOIN sys.index_columns AS ic
ON ic.[object_id] = i.[object_id]
AND ic.index_id = i.index_id
JOIN sys.columns AS c
ON ic.column_id = c.column_id
AND ic.[object_id] = c.[object_id]
WHERE t.name = 'Foo';The histogram also shows the statistics in the same order:
DBCC SHOW_STATISTICS ('Foo',PK_Foo);However,
sys.stats_columns shows the columns listed in the inverse order (ID1, ID2).SELECT s.name, sc.stats_column_id, c.name
FROM sys.stats AS s
JOIN sys.stats_columns AS sc
ON s.stats_id = sc.stats_id
AND s.[object_id] = sc.[object_id]
JOIN sys.columns AS c
ON c.[object_id] = s.[object_id]
AND c.column_id = sc.column_id
JOIN sys.objects AS o
ON o.[object_id] = c.[object_id]
WHERE o.name = 'Foo'
AND s.name = 'PK_Foo';Books Online says
stats_column_id is a "1-based ordinal within set of stats columns," so I was expecting the value 1 to point to the first column in the statistics object.Is this a bug in
sys.stats_columns or a misunderstanding on my part?I've verified this behaviour occurs on current builds of SQL Server 2005, 2008, 2008 R2, 2012, and 2014.
sys.stats_columns seems to reflecSolution
This seems to be a long standing error:
swasheck - March 5, 2015 posted:
https://connect.microsoft.com/SQLServer/feedback/details/1163126
MSDN notes that sys.stats_columns.stats_column_id is "1-based ordinal
within set of stats columns." However, it seems to actually reflect
table definition order. Altering index order is not reflected in
sys.stats_columns.
Hannah Vernon and James Lupolt seem to agree based on their comments/encouragement.
swasheck - March 5, 2015 posted:
https://connect.microsoft.com/SQLServer/feedback/details/1163126
MSDN notes that sys.stats_columns.stats_column_id is "1-based ordinal
within set of stats columns." However, it seems to actually reflect
table definition order. Altering index order is not reflected in
sys.stats_columns.
Hannah Vernon and James Lupolt seem to agree based on their comments/encouragement.
Context
StackExchange Database Administrators Q#94533, answer score: 5
Revisions (0)
No revisions yet.