|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
Приветствую! Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) В БД имеем таблицы следующего вида, с индексами: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Данные в таблицах имеют вид: DateAndTimeTagIndexVal2018-11-08 11:11:59.000000007.014465332031252018-11-08 11:11:59.000000016.806945800781252018-11-08 11:11:59.000000027.15197753906252018-11-08 11:11:59.000000037.075378417968752018-11-08 11:11:59.000000046.170684814453132018-11-08 11:11:59.000000056.462219238281252018-11-08 11:11:59.000000067.959045410156252018-11-08 11:11:59.000000077.969421386718752018-11-08 11:11:59.000000086.334503173828132018-11-08 11:11:59.000000097.04412841796875 В каждой такой таблице количество записей измеряется миллиардами. Частота записей времени - примерно 1 секунда. Количество TagIndex - до 100-1000 на таблицу. Т.е. в таблицу пишется до 1000 строк в секунду. Размер таблицы порядка 50GB, индекса 20GB Необходимо сделать множество выборок средних значений [Val] по заданному [TagIndex] и периоду времени. Обычно диапазон времени примерно час. За это время в таблице порядка миллиона записей. Запрос вида: Код: sql 1. 2. 3. 4. 5. 6. 7.
работает крайне медленно, причем по разному (может и минуту, а может и час-два по аналогичной выборке). Просьба посоветовать, как ускорить такие запросы. Возможно перестроить или создать дополнительные индексы... Попутно, подскажите: 1. Важен ли порядок условий в WHERE ([TagIndex] или диапазон [DateAndTime] первым)? 2. Насколько влияет то, что БД приаттачена на внешнем носителе HDD, подключенном по USB? В базу понятно ничего не пишется, только 1 подключение из студии для выполнения запросов. Спасибо) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 15:48 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
Ну, страдалец, если у тя ВСЕГДА интервал кратен часу, то индексированное представление спасет. ЗЫ. "1." Порядок в where - пофиг. Вот порядок в кластерном индексе - это ваше ФСЕ. Плохой у тя кластерный индекс. "2." Сильно влияет, страдалец. Весьма. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 15:54 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
aleks222 Плохой у тя кластерный индекс. у автора вообще куча с некластерным индексом сверху ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 15:56 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
База не моя, работаю с тем что есть и как есть индекс только один NONCLUSTERED интервал не всегда кратен часу Вопрос как раз в том, может надо создать доп индекс или т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 15:59 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
msLex aleks222 Плохой у тя кластерный индекс. у автора вообще куча с некластерным индексом сверху Как вот с такой кучей работать правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 16:01 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
aleks222 Ну, страдалец, если у тя ВСЕГДА интервал кратен часу, то индексированное представление спасет. Как вариант, я рассматривал строго почасово. Если Вам не сложно, напишите как выглядеть будет такое View сам не могу сообразить ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 16:08 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983 Вопрос как раз в том, может надо создать доп индекс или т.п. Код: sql 1.
Только, страдалец, это копия таблицы. Нафига это тебе нужно? Может с хозяином таблицы договориться? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 16:08 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
aleks222 Может с хозяином таблицы договориться? Не получится, хозяин - контроллер в шкафу, он ничего менять не захочет, а хозяин шкафа так и тем более. Мне надо произвести разовый анализ данных (технологических показателей работы агрегата за период времени) Эти запросы нужны только мне, как промежуточный этап для подготовки данных ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 16:14 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983 Вопрос как раз в том, может надо создать доп индекс или т.п. https://docs.microsoft.com/en-us/sql/relational-databases/indexes/columnstore-indexes-overview?view=sql-server-2017 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 16:16 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983 Обычно диапазон времени примерно час. За это время в таблице порядка миллиона записей. Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 16:45 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983, Если данные из базы читаются только в режиме оффлайн, то при заливке данных индекс будет только мешать. Индекс понадобится для чтения данных, вот тогда его и создавайте. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 16:48 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
ROLpogo, Спасибо, я так и делаю ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 16:55 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
invm, добавка Код: sql 1.
приводит к тому, что запрос выполняется мгновенно, но результат NULL ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 18:39 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
SERG1257, Спасибо, почитаю, не знал про такой функционал ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 18:40 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
aleks222 Код: sql 1.
Индекс на одну таблицу (не самую большую, 600 млн записей) делался 2,5 часа и + 15GB в БД ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 18:45 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983 aleks222 Код: sql 1.
Индекс на одну таблицу (не самую большую, 600 млн записей) делался 2,5 часа и + 15GB в БД Договорись со шкафом и сделай кластерный индекс Код: sql 1.
Шкафу будет пофиг, а тебе приятно. ЗЫ. Ну а если не договоришься Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 18:49 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
aleks222, полностью согласен! еще раз спасибо) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 19:03 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
aleks222 Код: sql 1. 2. 3.
Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 09:04 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983 aleks222 Код: sql 1. 2. 3.
Код: sql 1. 2.
Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 09:23 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
aleks222 Как-то так. Эффективнее всего уломать шкаф. Так все же, какой из этих индексов более рационально делать? Плюсы и минусы кластерного и с include можете показать? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 09:31 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983 invm, добавка Код: sql 1.
приводит к тому, что запрос выполняется мгновенно, но результат NULL Либо неправильно написан запрос, либо неверны критерии отбора, либо индекс битый. kaktus1983 Так все же, какой из этих индексов более рационально делать? А с точки зрения решаемой задачи, кластерный и некластерный с include одинаковы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 10:25 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
invm Чудес не бывает. Либо неправильно написан запрос, либо неверны критерии отбора, либо индекс битый. invm Кластерный. Место сэкономите. А с точки зрения решаемой задачи, кластерный и некластерный с include одинаковы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 10:34 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983 в запросе сложно сделать ошибку Например, '2020-03-02 00:00:00.0000000', в зависимости от языка сеанса, может быть как 2-м марта, так и 3-м февраля. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 11:14 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
invm, я ж к рабочему запросу только добавляю Код: sql 1.
и все - и вместо результата вижу одну строку с NULL ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 11:31 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
Кластерный индекс еще делается, уже 12 часов... файл БД +60 GB Процесс активен и файл БД растет периодически, так что не висит... и это одна, не самая большая, таблица( ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 11:35 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983 Кластерный индекс еще делается, уже 12 часов... файл БД +60 GB Процесс активен и файл БД растет периодически, так что не висит... и это одна, не самая большая, таблица( Растет потому, что пишется новое, прежде чем удалить старое + двойная запись в журнал (старого и нового). ЗЫ. Только договоренность со шкафом может ускорить процесс. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 11:49 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
aleks222, aleks222+ двойная запись в журнал (старого и нового).Старое-то для каких целей писать? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 11:52 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983, Еще раз - явное указание индекса в запросе не может влиять на результат. Если влияет, то либо это уже другой запрос, либо индекс поврежден. Проверить можно выполнив checkdb или checktable. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 11:53 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
aleks222, Файл лога кстати не растет, так и остался 2,5GB ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 12:20 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983 Кластерный индекс еще делается, уже 12 часов... вы бы себе отпилили тестовую БД на 10 лямов, например чтобы до старости то дожить, хотя бы ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 13:07 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
полудух kaktus1983 Кластерный индекс еще делается, уже 12 часов... вы бы себе отпилили тестовую БД на 10 лямов, например чтобы до старости то дожить, хотя бы ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 16:27 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983Учитывая время построения индекса, а таблиц таких 20+, хочу спросить: что в моем случае будет правильней делать?Еще раз повторю Создать некластерный колумнстор по всем полям партицированным по TagIndex (индекс будет раз в 10 меньше кучи) Полагаю ваша куча почти отсортирована по дате, так что запросы указанные выше летать будут (лишнее будет отсекатся) Можете начать пока без секционирования (партицирования) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 18:21 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
SERG1257 Еще раз повторю Создать некластерный колумнстор по всем полям партицированным по TagIndex (индекс будет раз в 10 меньше кучи) Полагаю ваша куча почти отсортирована по дате, так что запросы указанные выше летать будут (лишнее будет отсекатся) Можете начать пока без секционирования (партицирования) Да, куча идет по дате по порядку, БД - это журнал, почти без удаления. Я пока только читаю о колумнсторе... Честно говоря, не понимаю что Вы имеете ввиду под "партицированным по TagIndex" Если не сложно, напишите по-подробней, какие поля надо перечислить в индексе. Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 21:03 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983какие поля надо перечислить в индексеВсе. kaktus1983Я пока только читаю о колумнстореОно еще называется Real-Time Operational Analytics https://docs.microsoft.com/en-us/sql/relational-databases/indexes/get-started-with-columnstore-for-real-time-operational-analytics?view=sql-server-ver15 Суть колумнстора - все данные хранятся блоками (rowgroup) по миллиону записей. У каждого блока по каждому полю есть min/max то есть сервер заранее знает, что этот блок читать не надо если значения @from позже min или @till раньше max. Все данные в каждом поле для каждой rowgroup хорошо жмутся (степень сжатия легко достигает 10 и выше) kaktus1983"партицированным по TagIndex"Если разбить ваш индекс еще и на подгруппы с разными TagIndex, то список rowgroup для чтения сократится еще больше. (как именно разбивать партиции на TagIndex по одной, по две или по десять это надо мерять). Для начала можете этого не делать. Создайте колумнстор и погоняйте запросы. Партиции можно применить и для обычных индексов и кучи. Эта технология перпендикулярна колумнстору. Плюсы сразу - вам не надо будет перестраивать кластерный индекс удваивая требования по хранению. Добавить придется только сам колумнстор индекс (сжатый) и надеюсь это будет быстрее и дешевле. Далее запрос на чтение делается в т.н. Batch Mode. Что это такое я вам на пальцах не объясню. https://docs.microsoft.com/en-us/sql/relational-databases/indexes/columnstore-indexes-query-performance?view=sql-server-ver15 Минус - запись в колумнстор будет в один поток, ибо блокировки будут не на страницу, а на всю rowgroup. Как я понял это вам не важно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 23:12 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
SERG1257, Спасибо! Понятно и интересно описали суть. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 23:24 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
Извиняюсь 'в лоб' не получится Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Надо будет сначала перестроить кучу для партицирования ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2020, 23:29 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
SERG1257, Эх, а я уже в уме представил быстрое и изящное решение)) Буду пробовать. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2020, 00:28 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
Попробовал разные варианты на разных таблицах. Индексы: Код: sql 1.
Код: sql 1.
работают примерно одинаково. CREATE занимает примерно 8 часов на таблицу с 500 000 000 записей (на внешний HDD по USB). NONCLUSTERED с include быстрее, но не существенно. Для таблицы с 1 500 000 000 записей решил попробовать COLUMNSTORE. SERG1257 Еще раз повторю Создать некластерный колумнстор по всем полям партицированным по TagIndex (индекс будет раз в 10 меньше кучи) Полагаю ваша куча почти отсортирована по дате, так что запросы указанные выше летать будут (лишнее будет отсекатся) Можете начать пока без секционирования (партицирования) Да, все таблицы-кучи были записаны параллельно, в хронологическом порядке. Решил начать с простого, без секционирования SERG1257 kaktus1983какие поля надо перечислить в индексе Создал Код: sql 1.
Эффекта нет, как будто нет индекса вообще.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2020, 22:00 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983Эффекта нет, как будто нет индекса вообще. В смысле нет ускорения? План в студию >Видимо я что-то не понимаю и делаю не так...? Это должно быть именно так. План должен показать использование индекса. На крайняк можно заставить использовать индекс как советовал invm 22107040 Версия у вас непропатченая Накатите последний патч KB4535007 https://support.microsoft.com/en-ca/help/4535007/cumulative-update-19-for-sql-server-2017 Поможет или нет не знаю, но не повредит. >Важно ли, при создании COLUMNSTORE, что в таблице Temperatures есть еще несколько не нужных мне столбцов? Не важно. Но при создании COLUMNSTORE индекса добавляют все поля. >Стоит ли пробовать кластерный COLUMNSTORE? Не стоит. Создание кластерного индекса перетряхнет другой (обычный) индекс, это будет долго. >Возможно нужны дополнительные (не колумнсторе) индексы? Не нужны >p.s. CREATE NONCLUSTERED COLUMNSTORE выполнилось гораздо быстрее, чем я ожидал (до часа). Ради того все и затевалось. Размер индекса должен быть тоже очень маленкий (по сравнению с кучей). Он должен быстро и умно читатся. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2020, 23:46 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
SERG1257, спасибо большое за ответы! Даю план в студию. Вдруг чего упустил, продублирую: сама таблица Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Размер 60GB, записей 1.5млрд. Индексов нет вообще, создаю Код: sql 1.
только по трем нужным мне столбцам. Код: sql 1.
ничего не меняет ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2020, 06:54 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
А почему план в студии от другого запроса? Две с половиной минуты неприемлимо? Сколько времени занимает группировка (запрос без *) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2020, 07:12 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983, Колумнстор партиционированный по полю фильтрации (дате) должен неплохо себя показать. Вообще таблицу надо отгонять в хранилище данных (в stage) и там заниматься такого рода анализом. И вообще такого рода данные рекомендую отогнать в вертику. Бесплано до 1 TB ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2020, 08:00 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
kaktus1983, Секционируйте кучу по дате, если выбираете относительно небольшие диапазоны. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2020, 12:13 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
SERG1257 А почему план в студии от другого запроса? Две с половиной минуты неприемлимо? Сколько времени занимает группировка (запрос без *) Две с половиной минуты - это для очень упрощенного варианта запроса: выборка top(10) и только за 5 секунд. Для стандартного avg(Val) и время примерно за час - я отменил после 10 минут, а с индексом Код: sql 1.
выполняется до секунды. В конечном итоге мне надо сформировать матрицу данных 12000 х 444, каждая ячейка которой - результат запроса avg(Val) за диапазон времени примерно час. Тут каждая милисекунда будет важна)) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2020, 13:41 |
|
Выборка данных из таблицы с миллиардами записей
|
|||
---|---|---|---|
#18+
Владислав Колосов, a_voronin, спасибо! В целом задачу решил, SP отработала, 12000 х 444 значений просчитала за 4 часа. Всем спасибо за помощь и идеи! aleks222, SERG1257, вам отдельная благодарность)) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2020, 13:49 |
|
|
start [/forum/topic.php?all=1&fid=46&tid=1686279]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
73ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 174ms |
0 / 0 |