Фильтр секционированного представления не работает правильно
У меня есть следующий вид раздела: vwSalesOutH. Он состоит из нескольких таблиц с именем "SalesOutH" в разных базах данных.
Когда я использую следующий запрос, он работает нормально, поиск по одной таблице vwSalesOutH:
select vwSalesOutH.*
from vwSalesOutH
inner join DatesImport on vwSalesOutH.DBTypeId=DatesImport.DBTypeId and
vwSalesOutH.CustId=DatesImport.CustId
where vwSalesOutH.DBTypeId=2 and
vwSalesOutH.Date>='2017-01-01 00:00:00' and
vwSalesOutH.Date<='2017-01-25 00:00:00';
Статистика IO:
(6179 row(s) affected)
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOutH'. Scan count 1, logical reads 452, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'DatesImport'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Когда я использую следующий запрос, в котором в блоке "где" используются те же даты, у меня возникает проблема - поиск по всем таблицам в представлении раздела:
select vwSalesOutH.*
from vwSalesOutH
inner join DatesImport on vwSalesOutH.DBTypeId=DatesImport.DBTypeId and
vwSalesOutH.CustId=DatesImport.CustId
where vwSalesOutH.DBTypeId=2 and
vwSalesOutH.Date>=DatesImport.Fact_Start and
vwSalesOutH.Date<=DatesImport.Fact_End;
Статистика IO:
(6179 row(s) affected)
Table 'DatesImport'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOutH'. Scan count 5, logical reads 452, physical reads 0, read-ahead reads 43, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOutH'. Scan count 5, logical reads 584, physical reads 0, read-ahead reads 1, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOutH'. Scan count 5, logical reads 55717, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOutH'. Scan count 5, logical reads 12752, physical reads 0, read-ahead reads 3, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOutH'. Scan count 5, logical reads 11834, physical reads 0, read-ahead reads 8, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOutH'. Scan count 5, logical reads 11097, physical reads 0, read-ahead reads 10, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOutH'. Scan count 5, logical reads 51, physical reads 0, read-ahead reads 13, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Можете ли вы дать мне советы, чтобы исправить второй запрос?
1 ответ
Я столкнулся с той же проблемой, проблема, как представляется, заключается в том, что, если значение разделения не предоставляется как константа (не объединено, не переменная), то оптимизатор не может определить используемый раздел и вместо этого сканирует все таблицы
Даже при использовании Option (Recompile) фильтрация по объединенным столбцам не приводит к поиску по одной таблице.
Использование переменной с Option (перекомпиляция) приводит к поиску по одной таблице.