Post rápido...
Gravando o treinamento on-demand de indexação eu me deparei com um possível bug do DBCC PAGE, onde ele formata incorretamente a saída de uma página do índice cluster, quando criamos um índice não-cluster filtrado na mesma tabela.
O Fabiano Amorim reproduziu e o Paul Randall também, então é um bug. O fato de não ser um comando documentado não sei se vai ganhar muita atenção no Connect, mas registrei uma entrada mesmo assim: https://connect.microsoft.com/SQLServer/feedback/details/776144/dbcc-page-incorrect-output-with-filtered-indexes.
Se quiser reproduzir o problema, o script está aqui:
USE tempdb
GO
SELECT @@version
IF OBJECT_ID('dbo.MyTable', 'U') IS NOT NULL
DROP TABLE dbo.MyTable
GO
CREATE TABLE dbo.MyTable (
ID INT IDENTITY NOT NULL PRIMARY KEY
, Name CHAR(100) NOT NULL DEFAULT ('DBCC PAGE')
, SomeDate DATETIME2 NOT NULL DEFAULT(SYSDATETIME())
)
GO
INSERT INTO dbo.MyTable DEFAULT VALUES
GO 30000
INSERT INTO dbo.MyTable ( Name, SomeDate )
SELECT Name, DATEADD(YY, -1, SomeDate)
FROM dbo.MyTable
GO
SELECT
OBJECT_NAME(object_id) AS ObjectName
, AU.*
, P.*
FROM SYS.system_internals_allocation_units AS AU
INNER JOIN SYS.Partitions AS P
ON AU.Container_id = P.Partition_id
WHERE Object_ID IN (object_id('MyTable'))
ORDER BY object_id, type
GO
DBCC TRACEON(3604)
DBCC PAGE(Tempdb, 1, 1383, 3)
GO
-- output ok
CREATE NONCLUSTERED INDEX idxNCL_MyTable_SomeDate
ON dbo.MyTable (SomeDate)
WHERE SomeDate > '2013-01-01'
go
-- Same root page for CL, as expected
SELECT
OBJECT_NAME(object_id) AS ObjectName
, AU.*
, P.*
FROM SYS.system_internals_allocation_units AS AU
INNER JOIN SYS.Partitions AS P
ON AU.Container_id = P.Partition_id
WHERE Object_ID IN (object_id('MyTable'))
ORDER BY object_id, type
GO
DBCC PAGE(Tempdb, 1, 1383, 3)
GO
-- output not ok
DROP INDEX MyTable.idxNCL_MyTable_SomeDate
-- output ok again
DBCC PAGE(Tempdb, 1, 1383, 3)
GO
Abraços,
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br
Nenhum comentário:
Postar um comentário