Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
Коллеги приветствую! Помогите советом. Имеется большая таблица (до миллиарда записей не дотягивает, но плюс-минус поллаптя где то так), которая содержит последовательности записей в разрезе неких ID: ID, N (по порядку), Дата, + доп. критерии. Типичной является задача: Найти строки с максимальной N в разрезе ID, соответствующие определенным критериям. Например: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. Как это можно ускорить? Какие индексы имеет смысл построить? Какая конструкция запроса будет оптимальна в таком случае (тот, который показан - иллюстрация, какие выборки обычно требуются). Типичное количество partition by GRP, ID ~ 10-100 записей, общее количество записей, как я сказал - сильно за 100 миллионов. Таблица секционирована по GRP, но секций не много, в пределах сотни. Имеется возможность строить любые индексы, в т.ч. колоночные. Можно строить индексы под конкретные запросы (т.к. обновление производится в отсоединенных секциях, большое количество индексов не влияет на скорость обновления, из таблицы только читают). Как тут можно ускориться? Концептуально, т.с. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 11:34 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
uaggster, Вы же должны понимать, что при запросе isAсtive = 1 SQL не будет использовать никакой индекс, если у вас 100 лямов записей и грубо говоря 50 это isActive = 0 и 50 isActive = 1, SQL в любом случае будет делать скан, более того вы выбираете * (пропишите нормально столбцы, не звездочкой), т.е. если вым нужны все столбы покрывающий индекс вы тоже не сделаете. Если бы у вас таблица была широкая, а нужно было вам всего несколько столбцов можно было создать индекс для них, один фиг это был бы скан, но гораздо меньшего кол-ва страниц, у нас к примеру таких индексов много. У вас единственное место где можно немного оптимизировать это order by, но это оптимизация будет настолько ничтожной по сравнению со сканом всей таблицы, что разницы вы не заметите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 12:43 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
aleksrovuaggster, Вы же должны понимать, что при запросе isAсtive = 1 SQL не будет использовать никакой индекс, если у вас 100 лямов записей и грубо говоря 50 это isActive = 0 и 50 isActive = 1, SQL в любом случае будет делать скан, более того вы выбираете * (пропишите нормально столбцы, не звездочкой), т.е. если вым нужны все столбы покрывающий индекс вы тоже не сделаете. Если бы у вас таблица была широкая, а нужно было вам всего несколько столбцов можно было создать индекс для них, один фиг это был бы скан, но гораздо меньшего кол-ва страниц, у нас к примеру таких индексов много. У вас единственное место где можно немного оптимизировать это order by, но это оптимизация будет настолько ничтожной по сравнению со сканом всей таблицы, что разницы вы не заметите. Таблица, на самом деле - широкая, сотни три полей. И битовых критериев - больше трёх (с десяток - точно). Теоретически, комбинация нескольких критериев дает довольно большую селективность, но всё равно в такой выборке, в типичном случае, вылазит в пределах миллиона записей. Выборки используются потом для построения каких-то агрегатов, т.е. это такое окно, что-ли. Проблема в том, что комбинаций этих критериев, в общем, чертова куча используется. Но, опять же, теоретически, я готов проанализировать, какие комбинации использовать, и построить что-то типа (DTA, isAсtive, isInvalid, isOverlapped, ...), ну, хотя бы некоторые запросы. Но неужели это единственный вариант? (и будет ли толк вообще). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 12:55 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
aleksrovuaggster, Вы же должны понимать, что при запросе isAсtive = 1 SQL не будет использовать никакой индекс, если у вас 100 лямов записей и грубо говоря 50 это isActive = 0 и 50 isActive = 1, SQL в любом случае будет делать скан, более того вы выбираете * (пропишите нормально столбцы, не звездочкой), т.е. если вым нужны все столбы покрывающий индекс вы тоже не сделаете. Если бы у вас таблица была широкая, а нужно было вам всего несколько столбцов можно было создать индекс для них, один фиг это был бы скан, но гораздо меньшего кол-ва страниц, у нас к примеру таких индексов много. У вас единственное место где можно немного оптимизировать это order by, но это оптимизация будет настолько ничтожной по сравнению со сканом всей таблицы, что разницы вы не заметите. Есть выход! Фильтрованный индекс, точнее - два. Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 12:57 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
uaggster, у вас секциоирование по какому-то полю, а выборка совсем по другим, на выхде обход всех секций, и допустим фильтрованый индекс на DTA isAсtive = 1 c INCLUDE нужных вам полей, летать эта штука всё равно не будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 12:59 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
uaggsteraleksrovuaggster, Вы же должны понимать, что при запросе isAсtive = 1 SQL не будет использовать никакой индекс, если у вас 100 лямов записей и грубо говоря 50 это isActive = 0 и 50 isActive = 1, SQL в любом случае будет делать скан, более того вы выбираете * (пропишите нормально столбцы, не звездочкой), т.е. если вым нужны все столбы покрывающий индекс вы тоже не сделаете. Если бы у вас таблица была широкая, а нужно было вам всего несколько столбцов можно было создать индекс для них, один фиг это был бы скан, но гораздо меньшего кол-ва страниц, у нас к примеру таких индексов много. У вас единственное место где можно немного оптимизировать это order by, но это оптимизация будет настолько ничтожной по сравнению со сканом всей таблицы, что разницы вы не заметите. Таблица, на самом деле - широкая, сотни три полей. И битовых критериев - больше трёх (с десяток - точно). Теоретически, комбинация нескольких критериев дает довольно большую селективность, но всё равно в такой выборке, в типичном случае, вылазит в пределах миллиона записей. Выборки используются потом для построения каких-то агрегатов, т.е. это такое окно, что-ли. Проблема в том, что комбинаций этих критериев, в общем, чертова куча используется. Но, опять же, теоретически, я готов проанализировать, какие комбинации использовать, и построить что-то типа (DTA, isAсtive, isInvalid, isOverlapped, ...), ну, хотя бы некоторые запросы. Но неужели это единственный вариант? (и будет ли толк вообще). 1. Можно вычисляемое поле забабахать и фсе биты туды сложить. 2. Теоретически сервер умеет делать index intersection. Т.е. два фильтрованных индекса на каждое битовое поле имеют право на существование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 13:01 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
aleks222, По сути нужно будет создвть с десяток фильтрованных индексов с include как я понимаю всей таблицы, как было сказано это все ровно не взлетит, да и по месту, по сути копия таблицы будет, хотя читать 1\10 таблицы конечно быстрее будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 13:07 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
авторВы же должны понимать, что при запросе isAсtive = 1 SQL не будет использовать никакой индекс wat? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 13:59 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
авторWhere DTA between '20180101' and '20180103' and isAсtive = 1 очевидно индекс по DTA. Возможно фильтрованный индекс по DTA и isAсtive = 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 14:00 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
TaPaKuaggster, у вас секциоирование по какому-то полю, а выборка совсем по другим, на выхде обход всех секций, и допустим фильтрованый индекс на DTA isAсtive = 1 c INCLUDE нужных вам полей, летать эта штука всё равно не будет Да секционирование, тут, в общем, не причем. Табличка порезана на секции по числу подразделений = числу кусков из которых она состыковывается. Это витрина. Так для загрузки удобнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 14:01 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
uaggsterTaPaKuaggster, у вас секциоирование по какому-то полю, а выборка совсем по другим, на выхде обход всех секций, и допустим фильтрованый индекс на DTA isAсtive = 1 c INCLUDE нужных вам полей, летать эта штука всё равно не будет Да секционирование, тут, в общем, не причем. Табличка порезана на секции по числу подразделений = числу кусков из которых она состыковывается. Это витрина. Так для загрузки удобнее. как это не при чём? посмотрите в план вам понравится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 14:03 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Отказ от TIES убирает лишнюю сортировку. Покрывающий индекс создаете под свои нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 14:07 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
Раз уж у вас данные секционированные, то есть вариант использовать predicate pushdown: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. это как вариант. Если данных очень много, то, возможно, секционированный колумнстор. Либо добавить фильтрованный некластерный колумнсторный индекс, чтобы батч режим мог применяться (от SQL Server 2016) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 14:18 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
uaggster Вам нужна транзакционность? Писатель один или много? Если нет, то не уйти ли вам от RDBMS (по крайней мере, в части хранения и фильтрации)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 15:02 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
.Евгенийuaggster Вам нужна транзакционность? Писатель один или много? Если нет, то не уйти ли вам от RDBMS (по крайней мере, в части хранения и фильтрации)? какой-то набор слов не относящйся к ТС никак ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 15:04 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
TaPaK.Евгенийпропущено... Вам нужна транзакционность? Писатель один или много? Если нет, то не уйти ли вам от RDBMS (по крайней мере, в части хранения и фильтрации)? какой-то набор слов не относящйся к ТС никак Создается DLL с Dictionary и двумя функциями CLR (запись нового элемента и поиск по фильтру). Вам все равно непонятно, как это относится к ТС? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 15:33 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
aleksrovaleks222, По сути нужно будет создвть с десяток фильтрованных индексов с include как я понимаю всей таблицы, как было сказано это все ровно не взлетит, да и по месту, по сути копия таблицы будет, хотя читать 1\10 таблицы конечно быстрее будет. Include, в данном случае, НЕ НУЖНО. После Index Intersection будет Lookup кластерного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 15:36 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
.ЕвгенийTaPaKпропущено... какой-то набор слов не относящйся к ТС никак Создается DLL с Dictionary и двумя функциями CLR (запись нового элемента и поиск по фильтру). Вам все равно непонятно, как это относится к ТС? это даже не смешно, хотя нет - смешно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 15:38 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
uaggster, авторКак тут можно ускориться? Считайте агрегаты заранее, больше никак. Так кубы работают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 18:25 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
Владислав Колосовuaggster, авторКак тут можно ускориться? Считайте агрегаты заранее, больше никак. Так кубы работают. К сожалению, не получится. Это витрина данных, которая оперативно обновляется. Некоторые куски - несколько раз в час, некоторые - несколько раз в сутки. Заливка ведется в отсоединенные секции, сама таблица доступна непрерывно, но только на чтение. Сервер 2016 sp1, к сожалению - стандарт, хотя, в принципе, начиная с sp1 - всё нужное есть. Сейчас на таблица представляет из себя rowstore, на котором куча выровненных по секциям некластерных индексов, и один секционированный же некластерный колумнстор. Проблемой является то, что по таблице считают не только (и не столько) агрегаты, а чаще ищут конкретные записи (фильтруют). Куб, как я понимаю, так оперативно пересчитывать не получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 21:34 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
uaggsterКак это можно ускорить? Какие индексы имеет смысл построить? Какая конструкция запроса будет оптимальна в таком случае (тот, который показан - иллюстрация, какие выборки обычно требуются).А фильтр по датам показан типичный? То есть фильтр по датам достаточно селективный, может, просто кластерного индекса по датам будет достаточно? И, может, обновляются данные инкрементно по датам? А то, если концептуально, может, секционировать лучше по датам, в том числе рассмотреть вариант с присоединением секций? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2018, 21:54 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
uaggster, авторЭто витрина данных, которая оперативно обновляется Почему не получится? У всех получается, а у Вас - нет :) Для перерасчета агрегатов используется Change Tracking. Куб именно так и перерасчитывается по расписанию. Там всё не перезаливается каждый раз. А фильтры разве выбирают миллионы записей? Фильтры имеют смысл при высокой селективности. Если операторы у вас сливают эксели-миллионники, то что-то идёт не так. Значит у них нет подходящих инструментов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2018, 12:05 |
|
||
|
Помогите ускорить выборки из последовательного списка
|
|||
|---|---|---|---|
|
#18+
Владислав Колосовuaggster, авторЭто витрина данных, которая оперативно обновляется Почему не получится? У всех получается, а у Вас - нет :) Для перерасчета агрегатов используется Change Tracking . Куб именно так и перерасчитывается по расписанию. Там всё не перезаливается каждый раз. А фильтры разве выбирают миллионы записей? Фильтры имеют смысл при высокой селективности. Если операторы у вас сливают эксели-миллионники, то что-то идёт не так. Значит у них нет подходящих инструментов. А вот, кстати, вопрос. А как в этом случае Change Tracking сработает? Я ж меняю секцию целиком. Т.е. создаю из скрипта таблицу, аналогичную секции, заливаю туда данные, а потом делаю свитч партишн. Понятно, что фактически измененных записей там дай бог, если 1%, но это же другие записи! (Я не знаю, ROWID другой и всё такое). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2018, 08:08 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39617528&tid=1690051]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 321ms |

| 0 / 0 |
