【发布时间】:2017-03-16 02:43:34
【问题描述】:
我发现 MSDN 说“表变量没有统计信息”
https://msdn.microsoft.com/en-us/library/dd535534(v=sql.100).aspx
以下文章还说,即使在 SQL 2014 中,SQL Server 也不支持表变量的统计信息
“临时表很容易击败表变量,因为它们拥有统计信息的能力极大地改进了查询优化。SQL Server 2014 中的增强功能仍然如此。”
https://www.brentozar.com/archive/2014/04/table-variables-good-temp-tables-sql-2014/
然后我用 SQL Server 2014 做了一个测试,发现表变量的统计信息,所以在 SQL 2014 中,现在表变量有统计信息了,对吧?
USE tempdb;
DECLARE
@tb_table TABLE(
RowID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
,ProductName NVARCHAR(50) NOT NULL UNIQUE
,Indate DATETIME NOT NULL DEFAULT(GETDATE())
,index IX_Indate NONCLUSTERED (Indate)
);
DECLARE
@table_variable_id bigint
;
SELECT TOP 1 @table_variable_id = object_id
FROM tempdb.sys.all_objects AS A
WHERE parent_object_id = 0
ORDER BY create_date DESC
SELECT
statistics_name = st.name
,table_name = OBJECT_NAME(st.object_id)
,column_name = COL_NAME(stc.object_id, stc.column_id)
FROM tempdb.sys.stats AS st WITH(NOLOCK)
INNER JOIN tempdb.sys.stats_columns AS stc WITH(NOLOCK)
ON st.object_id = stc.object_id
AND st.stats_id = stc.stats_id
WHERE st.object_id = @table_variable_id
顺便说一句,如果我们从上面的脚本中删除“,index IX_Indate NONCLUSTERED (Indate)”行,即使在 SQL2012 中,我们仍然可以在 SQL Server 的输出中看到两条统计记录。
【问题讨论】:
-
我无法复制它。在我的测试中,
@table_variable_id是负数,sys.stats只有正数object_id。 -
您的 SQL Server 版本是 2014?如果我删除 ",index IX_Indate NONCLUSTERED (Indate) 行,该问题也可能发生在 SQL 2012 和 2014 中。
-
我使用的是 SQL Server 2014 Express。
SELECT @@VERSION返回“Microsoft SQL Server 2014 (SP1-CU7) (KB3162659) - 12.0.4459.0 (X64) 2016 年 5 月 27 日 15:33:17 版权所有 (c) Microsoft Corporation Express Edition (64-bit) on Windows NT 6.1 (内部版本 7601:Service Pack 1)“。你用的是什么版本? -
我的版本是 Microsoft SQL Server 2014 - 12.0.4100.1 (X64) Apr 20 2015 17:29:27 版权所有 (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.3
(内部版本 14393:)(管理程序)和 Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 2015 年 10 月 20 日 15:36:27 版权所有 (c) Windows NT 上的 Microsoft Corporation Enterprise Edition(64 位) 6.3 (内部版本 14393:)(管理程序) -
@VladimirBaranov - 您无法重现此问题的原因是因为最后一个查询需要在
tempdb的上下文中运行。这不是 EE 功能,也与后续版本中的不同基数猜测无关。或者与为表变量维护的行数有关。
标签: sql-server