临时表的统计信息

Mar*_*sky 6 sql-server statistics temporary-tables

快速而简单...为什么当我尝试检索临时表中某一列的统计信息时此 sp 失败?

CREATE PROCEDURE dbo.Demo
AS
BEGIN
SET NOCOUNT ON
-- Declare table variable
CREATE TABLE #temp_table (ID INT)
DECLARE @I INT = 0

-- Insert 10K rows
    WHILE @I < 100
    BEGIN
        INSERT INTO #temp_table VALUES (@I)

        SET @I=@I+1
    END

-- Display all rows and output execution plan (now the EstimateRow is just fine!)
SELECT * FROM #temp_table

-- Is the object there
SELECT OBJECT_ID('tempdb..#temp_table')

-- How about statistics
DBCC SHOW_STATISTICS ('tempdb..#temp_table', 'id')
END;
Run Code Online (Sandbox Code Playgroud)

我不明白,我收到一条消息说没有在列 id 上创建统计信息

Could not locate statistics 'id' in the system catalogs.
Run Code Online (Sandbox Code Playgroud)

话虽如此,我已经看到 Paul White 的一篇文章,其中使用了这种技术并且确实有效。

https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html

有任何想法吗?

Eri*_*ing 6

您需要显式创建一个名为的统计对象 id

CREATE PROCEDURE dbo.Demo
AS
BEGIN
SET NOCOUNT ON
-- Declare table variable
CREATE TABLE #temp_table (ID INT)
DECLARE @I INT = 0

CREATE STATISTICS id ON #temp_table (ID)

-- Insert 10K rows
    WHILE @I < 100
    BEGIN
        INSERT INTO #temp_table VALUES (@I)

        SET @I=@I+1
    END

-- Display all rows and output execution plan (now the EstimateRow is just fine!)
SELECT * FROM #temp_table

-- Is the object there
SELECT OBJECT_ID('tempdb..#temp_table')

-- How about statistics
DBCC SHOW_STATISTICS ('tempdb..#temp_table', 'id')
END;

EXEC dbo.Demo
Run Code Online (Sandbox Code Playgroud)

当留给自己的设备时,系统创建的统计对象具有奇怪的名称,例如 _WA_Sys_00000002_5F141958

请注意,当您创建统计信息时很重要 -CREATE STATISTICS如果您希望它显示任何内容,您需要在使用数据填充临时表后将命令移动到 ,或者可能更改您的查询以需要更新统计信息,例如SELECT * FROM #temp_table WHERE ID > 0.