Хорошо, я провел несколько экспериментов. Я напишу результаты здесь, но сначала я хочу сказать, что исходя из того, что я видел и знаю, я уверен, что с использованием временных параметров в 2005 и 2008 годах точно эквивалентно использовать ОПТИМИЗАЦИЮ 2008 ДЛЯ НЕИЗВЕСТНО . По крайней мере, в контексте хранимых процедур.
Так вот что я нашел.
В вышеописанной процедуре я использую базу данных AdventureWorks. (Но я использую аналогичные методы и получаю похожие результаты для любой другой базы данных) Я запустил:
dbcc show_statistics ('Sales.SalesOrderDetail', IX_SalesOrderDetail_ProductID)
И я вижу статистику с 200 шагами в гистограмме. Глядя на его гистограмму, я вижу, что есть 66 различных строк диапазона (то есть 66 различных значений, которые не были включены в статистику как значения равенства). Добавьте 200 строк равенства (с каждого шага), и я получу оценку 266 различных значений для ProductId в Sales.SalesOrderDetail.
Имея 121317 строк в таблице, я могу оценить, что каждый ProductId имеет в среднем 456 строк. И когда я смотрю на план запроса для моей процедуры тестирования (в формате xml), я вижу что-то вроде:
...
<QueryPlan DegreeOfParallelism="1" >
<RelOp NodeId="0"
PhysicalOp="Index Seek"
LogicalOp="Index Seek"
EstimateRows="456.079"
TableCardinality="121317" />
...
<ParameterList>
<ColumnReference
Column="@newproductid"
ParameterRuntimeValue="(999)" />
</ParameterList>
</QueryPlan>
...
Итак, я знаю, откуда берется значение EstimateRows (с точностью до трех десятичных знаков), и обратите внимание, что атрибут ParameterCompiledValue отсутствует в плане запроса. Именно так выглядит план при использовании OPTIMIZE FOR UNKNOWN 2008 года