Всем привет,
выяснил, что если колоночный индекс отсортирован по нужному полю, то результат работы запроса сильно увеличивается. Хотелось бы узнать, как можно поддерживать сортировку в колоночном индексе?
Давайте пример. Делаем выборку из таблицы, где 15,5 миллионов записей:
SELECT count(*) as Quantity
FROM [tbl_test]
where (DATE1 between '20170401' and '20170430')
/*
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 2 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
(1 row(s) affected)
Table 'tbl_test'. Scan count 1, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 432, lob physical reads 0, lob read-ahead reads 727.
Table 'tbl_test'. Segment reads 6, segment skipped 2.
SQL Server Execution Times:
CPU time = 15 ms, elapsed time = 43 ms.
*/
Видно что CPU time = 15 ms. При этом он прочитал 6 сегментов и пропустил 2.
Чтобы отсортировать таблицу по дате надо создать обычный кластеризованный индекс, а затем колоночный.
create clustered index CCI_tbl_test_table
on dbo.tbl_test (DATE1)
with (DROP_EXISTING = ON);
create clustered columnstore index CCI_tbl_test_table
on dbo.tbl_test
with (MAXDOP = 1, DROP_EXISTING = ON);
Результат выборки:
SELECT count(*) as Quantity
FROM [tbl_test]
where (DATE1 between '20170401' and '20170430')
/*
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 2 ms, elapsed time = 2 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
(1 row(s) affected)
Table 'tbl_test'. Scan count 1, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 17, lob physical reads 0, lob read-ahead reads 27.
Table 'tbl_test'. Segment reads 1, segment skipped 7.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 4 ms.
*/
Видно, что CPU time = 0, и он пропустил 7 сегментов, а прочитал всего 1. Вот это меня и интересует.
Как можно поддерживать сортировку в колоночном индексе, чтобы при загрузке новых данных такое выполнение и дальше продолжалось?
Спасибо.