SQL Фильтр таблицы разделов сервера по данным столбцов и разделам, имеющим строки больше единицы - PullRequest
1 голос
/ 06 апреля 2020

У меня есть SQL Разделенная таблица сервера, где я выбираю данные с количеством строк> 1, но у меня есть сценарий, в котором у меня есть столбец IsActive и я хочу получить активные разделы с числом строк> 1 и IsActive = true .

SELECT      
    C.partition_number
FROM          
    sys.partition_functions A
INNER JOIN    
    sys.partition_range_values B ON (B.function_id = A.function_id
                                     AND A.name = 'pf_Employee')
INNER JOIN     
    sys.partitions C ON (C.partition_number = B.boundary_id
                         AND OBJECT_NAME(C.object_id) = 'Employee'
                         AND C.index_id = 0)
WHERE        
    C.rows > 0;

Как добавить флаг IsActive вместе с C.rows > 0 в приведенном выше запросе?

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Если вам нужно решение, которое не требует сканирования таблицы, вы можете отслеживать статистику по разделам в индексированном представлении.

EG

create or alter view vActiveEmps
with schemabinding 
as
select $partition.pf_employee(id) partition_id,  
       sum(isnull(Active,0)) ActiveEmployees, 
       count_big(*) TotalEmployees
from dbo.employee
group by $partition.pf_employee(id)
go
create unique clustered index pk_vActiveEmps on vActiveEmps(partition_id)
go
select partition_id
from vActiveEmps 
where ActiveEmployees > 0
1 голос
/ 10 апреля 2020

Вот решение:

 SELECT      
    DISTINCT C.partition_number
FROM          
    sys.partition_functions A
INNER JOIN    
    sys.partition_range_values B ON (B.function_id = A.function_id
                                     AND A.name = 'pf_Employee')
INNER JOIN     
    sys.partitions C ON (C.partition_number = B.boundary_id
                         AND OBJECT_NAME(C.object_id) = 'Employee'
                         AND C.index_id = 0)
INNER JOIN DBO.Employee E ON 
$PARTITION.pf_Employee(EmployeeId) = c.partition_number 
WHERE C.rows > 0 AND E.IsActive = 1
...