سلام
با توجه به کوئری شما سیاست پیشنهادی من اسکن تنها یک پارتیشن است و آن اولین پارتیشنی است که مقداری بزرگتر از @Date دارد.
کاری که می تونید بکنید این هست که پس از پارتیشن بندی جدول بر اساس StartDate بیایید مقدار @Date رو چک کنید و ببینید این مقدار در کدوم پارتیشن قرار داره. فرضاً اگر در پارتیشن 5 قرار دارد (یعنی این اولین پارتیشنی است که مقادیری بزرگتر از @Dtate دارد و بنابراین مطمئن هستیم که پارتیشن های بعدی هم این شرط را ارضاء می کنند و نیازی نیست روی آنها هم کوئری اجرا شود) شما کافیست تعداد رکورد های 5 پارتیشن بعدی رو بدست بیاری و جمع کنی چون 5 پارتیشن بعدی (6 تا 10) هم شامل جواب هستند و نیازی به اجرای کوئری روی اونها نیست.
بدست آوردن رکوردهای هر پارتیشن:
http://weblogs.sqlteam.com/dang/arch...ow-Counts.aspx
--paritioned table and index details
SELECT
OBJECT_NAME(p.object_id) AS ObjectName,
i.name AS IndexName,
p.index_id AS IndexID,
ds.name AS PartitionScheme,
p.partition_number AS PartitionNumber,
fg.name AS FileGroupName,
prv_left.value AS LowerBoundaryValue,
prv_right.value AS UpperBoundaryValue,
CASE pf.boundary_value_on_right
WHEN 1 THEN 'RIGHT'
ELSE 'LEFT' END AS Range,
p.rows AS Rows
FROM sys.partitions AS p
JOIN sys.indexes AS i
ON i.object_id = p.object_id
AND i.index_id = p.index_id
JOIN sys.data_spaces AS ds
ON ds.data_space_id = i.data_space_id
JOIN sys.partition_schemes AS ps
ON ps.data_space_id = ds.data_space_id
JOIN sys.partition_functions AS pf
ON pf.function_id = ps.function_id
JOIN sys.destination_data_spaces AS dds2
ON dds2.partition_scheme_id = ps.data_space_id
AND dds2.destination_id = p.partition_number
JOIN sys.filegroups AS fg
ON fg.data_space_id = dds2.data_space_id
LEFT JOIN sys.partition_range_values AS prv_left
ON ps.function_id = prv_left.function_id
AND prv_left.boundary_id = p.partition_number - 1
LEFT JOIN sys.partition_range_values AS prv_right
ON ps.function_id = prv_right.function_id
AND prv_right.boundary_id = p.partition_number
WHERE
OBJECTPROPERTY(p.object_id, 'ISMSShipped') = 0
UNION ALL
--non-partitioned table/indexes
SELECT
OBJECT_NAME(p.object_id) AS ObjectName,
i.name AS IndexName,
p.index_id AS IndexID,
NULL AS PartitionScheme,
p.partition_number AS PartitionNumber,
fg.name AS FileGroupName,
NULL AS LowerBoundaryValue,
NULL AS UpperBoundaryValue,
NULL AS Boundary,
p.rows AS Rows
FROM sys.partitions AS p
JOIN sys.indexes AS i
ON i.object_id = p.object_id
AND i.index_id = p.index_id
JOIN sys.data_spaces AS ds
ON ds.data_space_id = i.data_space_id
JOIN sys.filegroups AS fg
ON fg.data_space_id = i.data_space_id
WHERE
OBJECTPROPERTY(p.object_id, 'ISMSShipped') = 0
ORDER BY
ObjectName,
IndexID,
PartitionNumber;
لینکی برای پیدا کردن پارتیشنی که رکورد مربوطه در آن قرار دارد:
http://sqlity.net/en/2483/partition-boundaries/
بعد از اینکه مقدار پارتیشن رو بدست آوردی باید ببینی مقداری بزرگتر از @Date در اون هست یا نه اگه بود کوئری باید روی این پارتیشن بخوره وگرنه این کوئری در پارتیشن بعدی باید اجرا بشه. بعد از اون می تونی براحتی پارتیشن های بعدی تا آخرین پارتیشن رو با کوئری بالا تعداد رکورد هاش رو بدست بیاری و با مقدار بدست اومده جمع کنی.
امیدوارم منظورم رو متوجه شده باشی.