Я обнаружил, что MSDN говорит, что "у табличных переменных нет статистики"
https://msdn.microsoft.com/en-us/library/dd535534(v=sql.100).aspx
Также в следующей статье говорится, что SQL Server не поддерживает статистику для табличной переменной даже в SQL 2014
"временные таблицы легко превосходят переменные таблиц, потому что их способность получать статистику значительно улучшает оптимизацию запросов. Это остается верным с улучшениями в SQL Server 2014".
https://www.brentozar.com/archive/2014/04/table-variables-good-temp-tables-sql-2014/
Затем я провожу тестирование с SQL Server 2014 и нахожу статистику для табличной переменной, поэтому в SQL 2014 теперь у табличной переменной есть статистика, верно?
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)" из приведенного выше сценария, мы все равно сможем увидеть две статистические записи в выходных данных на SQL-сервере, даже в SQL2012.