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
有任何想法吗?
您需要显式创建一个名为的统计对象 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
.
归档时间: |
|
查看次数: |
3720 次 |
最近记录: |