Используйте все номера месяцев в диапазоне дат для выбора из таблицы, разбитой по месяцам - PullRequest
0 голосов
/ 10 февраля 2011

У меня есть таблица, которая разбита по месяцам (partmonth int). Хранимая процедура, используемая для запроса таблицы, получает только диапазон дат. Мне нужно найти способ получить все номера месяцев в диапазоне дат и передать их в условие where в (1,2 ...) для секционированной таблицы. Я попытался создать временную таблицу с номерами месяцев и использовать оператор where in (выберите monthnumber from #tmp), но, похоже, он выполняет #tmp для каждой записи или сканирует все разделы. Я также пытался присоединить секционированную таблицу к таблице tmp, но, похоже, это сканирует также все разделы. Я предполагаю, что оптимизатору запросов нужны жесткие значения для partmonth, где.

запрос, чтобы получить все номера месяцев:

declare @months varchar(100)

select d.* into #tmp
from
(select distinct MonthNumber from [date] where [date] between '1/1/2010' and '4/1/2010') d

select @months = coalesce(@months + ', ', '')  + cast(monthnumber as varchar(2)) from #tmp
select @months
drop table #tmp

Теперь мне нужно иметь возможность использовать эти номера месяцев в операторе выбора, чтобы они вызывали правильные разделы для использования.

Что-то вроде следующего, которое не работает: выберите * из [транзакции] где partmonth in (@months)

1 Ответ

1 голос
/ 11 февраля 2011

Я обнаружил, что использование оператора выбора для "где в (...)" работает для фильтрации разделов таблицы. Сканирование таблицы, которое я видел, было связано с другими используемыми критериями, я получаю отсканированное изображение, даже если я передаю где в (10).

Я также обнаружил, что вы можете использовать функцию разделения для выбора раздела, но в моей среде и схеме это вызвало сканирование индекса и поиск индекса.

DECLARE @months TABLE (MonthNumber int)
insert into @months
select distinct MonthNumber from [date] where [date] between '10/1/2010' and '10/7/2010'

select * from [transaction] t
WHERE $Partition.TransactionPartitionFunction(t.partmonth) in (select monthnumber from @months) 

Фактический план выполнения пересчитывается с включенной статистикой xml. Без где в:

<RunTimePartitionSummary>
  <PartitionsAccessed PartitionCount="13">
    <PartitionRange Start="1" End="13" />
  </PartitionsAccessed>
</RunTimePartitionSummary>

Где в:

<RunTimePartitionSummary>
  <PartitionsAccessed PartitionCount="1">
    <PartitionRange Start="10" End="10" />
  </PartitionsAccessed>
</RunTimePartitionSummary>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...