powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка данных из таблицы с миллиардами записей
25 сообщений из 45, страница 1 из 2
Выборка данных из таблицы с миллиардами записей
    #39941698
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64)

В БД имеем таблицы следующего вида, с индексами:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE [dbo].[Temperatures](
	[DateAndTime] [datetime2](7) NULL,
	[TagIndex] [smallint] NULL,
	[Val] [float] NULL
) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [TemperaturesIndex] ON [dbo].[Temperatures]
(
	[DateAndTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]


Данные в таблицах имеют вид:

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.
declare @from datetime2 = '2020-03-02 00:00:00.0000000';
declare @till datetime2 = '2020-03-02 01:00:00.0000000';
SELECT avg([Val])
  FROM [dbo].[Temperatures]
  WHERE ([TagIndex] = 198) 
    AND ([DateAndTime] >= @from)
    AND ([DateAndTime] < @till)


работает крайне медленно, причем по разному (может и минуту, а может и час-два по аналогичной выборке).

Просьба посоветовать, как ускорить такие запросы. Возможно перестроить или создать дополнительные индексы...

Попутно, подскажите:

1. Важен ли порядок условий в WHERE ([TagIndex] или диапазон [DateAndTime] первым)?
2. Насколько влияет то, что БД приаттачена на внешнем носителе HDD, подключенном по USB? В базу понятно ничего не пишется, только 1 подключение из студии для выполнения запросов.

Спасибо)
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941701
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, страдалец, если у тя ВСЕГДА интервал кратен часу, то индексированное представление спасет.

ЗЫ.
"1." Порядок в where - пофиг. Вот порядок в кластерном индексе - это ваше ФСЕ. Плохой у тя кластерный индекс.
"2." Сильно влияет, страдалец. Весьма.
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941703
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Плохой у тя кластерный индекс.

у автора вообще куча с некластерным индексом сверху
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941704
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
База не моя, работаю с тем что есть и как есть
индекс только один NONCLUSTERED
интервал не всегда кратен часу
Вопрос как раз в том, может надо создать доп индекс или т.п.
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941705
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msLex
aleks222
Плохой у тя кластерный индекс.

у автора вообще куча с некластерным индексом сверху

Как вот с такой кучей работать правильно?
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941710
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
Ну, страдалец, если у тя ВСЕГДА интервал кратен часу, то индексированное представление спасет.

Как вариант, я рассматривал строго почасово.
Если Вам не сложно, напишите как выглядеть будет такое View
сам не могу сообразить
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941711
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983

Вопрос как раз в том, может надо создать доп индекс или т.п.


Код: sql
1.
create index [доп индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime) include (Val);



Только, страдалец, это копия таблицы.
Нафига это тебе нужно?
Может с хозяином таблицы договориться?
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941714
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222

Может с хозяином таблицы договориться?

Не получится, хозяин - контроллер в шкафу, он ничего менять не захочет, а хозяин шкафа так и тем более.
Мне надо произвести разовый анализ данных (технологических показателей работы агрегата за период времени)
Эти запросы нужны только мне, как промежуточный этап для подготовки данных
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941716
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983 Вопрос как раз в том, может надо создать доп индекс или т.п.
https://docs.microsoft.com/en-us/sql/relational-databases/indexes/columnstore-indexes-overview?view=sql-server-2017
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941721
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983
Обычно диапазон времени примерно час. За это время в таблице порядка миллиона записей.
Тогда для начала попробуйте тупо
Код: sql
1.
2.
3.
4.
5.
SELECT avg([Val])
  FROM [dbo].[Temperatures] with (index = [TemperaturesIndex])
  WHERE ([TagIndex] = 198) 
    AND ([DateAndTime] >= @from)
    AND ([DateAndTime] < @till)
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941722
ROLpogo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983,
Если данные из базы читаются только в режиме оффлайн, то при заливке данных индекс будет только мешать. Индекс понадобится для чтения данных, вот тогда его и создавайте.
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941724
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ROLpogo,
Спасибо, я так и делаю
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941765
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,
добавка
Код: sql
1.
 with (index = [TemperaturesIndex])

приводит к тому, что запрос выполняется мгновенно, но результат NULL
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941766
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257,
Спасибо, почитаю, не знал про такой функционал
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941767
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222

Код: sql
1.
create index [доп индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime) include (Val);


дает результат, спасибо !
Индекс на одну таблицу (не самую большую, 600 млн записей) делался 2,5 часа и + 15GB в БД
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941769
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983
aleks222

Код: sql
1.
create index [доп индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime) include (Val);


дает результат, спасибо !
Индекс на одну таблицу (не самую большую, 600 млн записей) делался 2,5 часа и + 15GB в БД


Договорись со шкафом и сделай кластерный индекс

Код: sql
1.
create clustered index [кл.индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime);



Шкафу будет пофиг, а тебе приятно.

ЗЫ. Ну а если не договоришься
Код: sql
1.
2.
DROP INDEX [TemperaturesIndex];
create clustered index [кл.индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime);
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941771
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,
полностью согласен!
еще раз спасибо)
...
Рейтинг: 0 / 0
Выборка данных из таблицы с миллиардами записей
    #39941828
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
Код: sql
1.
2.
3.

DROP INDEX [TemperaturesIndex];
create clustered index [кл.индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime) 
  • Вариант для 1,2 миллиарда записей выполняется уже 9 часов. Посмотрим чем закончится. Учитывая время построения индекса, а таблиц таких 20+, хочу спросить: что в моем случае будет правильней делать?
    • Код: sql
      1.
      2.
    • create index [доп индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime) include (Val);
  • Код: sql
    1.
    2.
  • create clustered index [кл.индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime)
  • или возможно даже просто
  • Код: sql
    1.
    2.
  • create index [индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime)
  • хватит?
  • Код: sql
    1.
    2.
  • DROP INDEX [TemperaturesIndex];
  • Спасибо)
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941833
    aleks222
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    kaktus1983
    aleks222
    Код: sql
    1.
    2.
    3.
    
    DROP INDEX [TemperaturesIndex];
    create clustered index [кл.индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime) 
    
  • Вариант для 1,2 миллиарда записей выполняется уже 9 часов. Посмотрим чем закончится. Учитывая время построения индекса, а таблиц таких 20+, хочу спросить: что в моем случае будет правильней делать?
    • Код: sql
      1.
      2.
    • Так быстрее create index [доп индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime) include (Val);
  • Код: sql
    1.
    2.
  • Так место больше экономится create clustered index [кл.индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime)
  • или возможно даже просто
  • Код: sql
    1.
    2.
  • Это не пойдет create index [индекс] on [dbo].[Temperatures] (TagIndex, DateAndTime)
  • хватит?
  • Код: sql
    1.
    2.
  • Место сэкономишь DROP INDEX [TemperaturesIndex];
  • Спасибо) Как-то так. Эффективнее всего уломать шкаф.
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941836
    kaktus1983
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    aleks222

    Как-то так.
    Эффективнее всего уломать шкаф.

    Так все же, какой из этих индексов более рационально делать?
    Плюсы и минусы кластерного и с include можете показать?
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941841
    invm
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    kaktus1983
    invm,
    добавка
    Код: sql
    1.
     with (index = [TemperaturesIndex])
    


    приводит к тому, что запрос выполняется мгновенно, но результат NULL
    Чудес не бывает.
    Либо неправильно написан запрос, либо неверны критерии отбора, либо индекс битый.
    kaktus1983
    Так все же, какой из этих индексов более рационально делать?
    Кластерный. Место сэкономите.
    А с точки зрения решаемой задачи, кластерный и некластерный с include одинаковы.
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941842
    kaktus1983
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    invm
    Чудес не бывает.
    Либо неправильно написан запрос, либо неверны критерии отбора, либо индекс битый.
    в запросе сложно сделать ошибку, насчет битости индекса - не знаю.
    invm
    Кластерный. Место сэкономите.
    А с точки зрения решаемой задачи, кластерный и некластерный с include одинаковы.
    Понял, спасибо.
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941847
    invm
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    kaktus1983
    в запросе сложно сделать ошибку
    Это вам так кажется.
    Например, '2020-03-02 00:00:00.0000000', в зависимости от языка сеанса, может быть как 2-м марта, так и 3-м февраля.
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941848
    kaktus1983
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    invm,
    я ж к рабочему запросу только добавляю
    Код: sql
    1.
    with (index = [TemperaturesIndex])
    

    и все - и вместо результата вижу одну строку с NULL
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941849
    kaktus1983
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    Кластерный индекс еще делается, уже 12 часов...
    файл БД +60 GB
    Процесс активен и файл БД растет периодически, так что не висит...
    и это одна, не самая большая, таблица(
    ...
    Рейтинг: 0 / 0
    25 сообщений из 45, страница 1 из 2
    Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка данных из таблицы с миллиардами записей
    Целевая тема:
    Создать новую тему:
    Автор:
    Закрыть
    Цитировать
    Найденые пользователи ...
    Разблокировать пользователей ...
    Читали форум (0):
    Пользователи онлайн (0):
    x
    x
    Закрыть


    Просмотр
    0 / 0
    Close
    Debug Console [Select Text]