powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка данных из таблицы с миллиардами записей
45 сообщений из 45, показаны все 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
    Выборка данных из таблицы с миллиардами записей
        #39941851
    aleks222
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    kaktus1983
    Кластерный индекс еще делается, уже 12 часов...
    файл БД +60 GB
    Процесс активен и файл БД растет периодически, так что не висит...
    и это одна, не самая большая, таблица(

    Растет потому, что пишется новое, прежде чем удалить старое + двойная запись в журнал (старого и нового).

    ЗЫ. Только договоренность со шкафом может ускорить процесс.
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941852
    Гавриленко Сергей Алексеевич
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    aleks222,

    aleks222+ двойная запись в журнал (старого и нового).Старое-то для каких целей писать?
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941853
    invm
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    kaktus1983,

    Еще раз - явное указание индекса в запросе не может влиять на результат.
    Если влияет, то либо это уже другой запрос, либо индекс поврежден. Проверить можно выполнив checkdb или checktable.
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941856
    kaktus1983
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    aleks222,
    Файл лога кстати не растет, так и остался 2,5GB
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941862
    Фотография полудух
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    kaktus1983
    Кластерный индекс еще делается, уже 12 часов...

    вы бы себе отпилили тестовую БД на 10 лямов, например
    чтобы до старости то дожить, хотя бы
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941884
    Фотография alexeyvg
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    полудух
    kaktus1983
    Кластерный индекс еще делается, уже 12 часов...

    вы бы себе отпилили тестовую БД на 10 лямов, например
    чтобы до старости то дожить, хотя бы
    У ТС же нет пользователей, кроме него самого.
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941900
    SERG1257
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    kaktus1983Учитывая время построения индекса, а таблиц таких 20+, хочу спросить: что в моем случае будет правильней делать?Еще раз повторю
    Создать некластерный колумнстор по всем полям партицированным по TagIndex (индекс будет раз в 10 меньше кучи)
    Полагаю ваша куча почти отсортирована по дате, так что запросы указанные выше летать будут (лишнее будет отсекатся)

    Можете начать пока без секционирования (партицирования)
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941916
    kaktus1983
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    SERG1257
    Еще раз повторю
    Создать некластерный колумнстор по всем полям партицированным по TagIndex (индекс будет раз в 10 меньше кучи)
    Полагаю ваша куча почти отсортирована по дате, так что запросы указанные выше летать будут (лишнее будет отсекатся)
    Можете начать пока без секционирования (партицирования)

    Да, куча идет по дате по порядку, БД - это журнал, почти без удаления.
    Я пока только читаю о колумнсторе...
    Честно говоря, не понимаю что Вы имеете ввиду под "партицированным по TagIndex"
    Если не сложно, напишите по-подробней, какие поля надо перечислить в индексе.
    Код: sql
    1.
    2.
    3.
    4.
    5.
    6.
    CREATE NONCLUSTERED COLUMNSTORE INDEX [имя] ON [dbo].[Temperatures]
    (
    	[DateAndTime],  -- ??
    	[TagIndex],  -- ??
    	[Val]  -- ??
    )
    
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941927
    SERG1257
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    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. Как я понял это вам не важно.
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941928
    kaktus1983
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    SERG1257,
    Спасибо! Понятно и интересно описали суть.
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941929
    SERG1257
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Извиняюсь 'в лоб' не получится

    Код: sql
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    CREATE PARTITION FUNCTION F_TagIndex (int)  
        AS RANGE LEFT FOR VALUES (100,200,300,400,500,600,700,800,900,1000); 
    
    CREATE PARTITION SCHEME TagIndex AS PARTITION F_TagIndex all TO ([PRIMARY]) 
    
    Create nonClustered Columnstore Index CC_Temperatures on dbo.test_table (id,val,d_entry) on TagIndex(id)
    Msg 35316, Level 16, State 1, Line 6
    The statement failed because a columnstore index must be partition-aligned with the base table. Create the columnstore index using the same partition function and same (or equivalent) partition scheme as the base table. If the base table is not partitioned, create a nonpartitioned columnstore index.
    



    Надо будет сначала перестроить кучу для партицирования
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39941932
    kaktus1983
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    SERG1257,
    Эх, а я уже в уме представил быстрое и изящное решение))
    Буду пробовать. Спасибо!
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39942371
    kaktus1983
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    Попробовал разные варианты на разных таблицах. Индексы:
    Код: sql
    1.
    create index [имя] on [dbo].[Temperatures] (TagIndex, DateAndTime) include (Val);
    

    Код: sql
    1.
    create clustered index [имя] on [dbo].[Temperatures] (TagIndex, DateAndTime);
    

    работают примерно одинаково.
    CREATE занимает примерно 8 часов на таблицу с 500 000 000 записей (на внешний HDD по USB).
    NONCLUSTERED с include быстрее, но не существенно.

    Для таблицы с 1 500 000 000 записей решил попробовать COLUMNSTORE.
    SERG1257
    Еще раз повторю
    Создать некластерный колумнстор по всем полям партицированным по TagIndex (индекс будет раз в 10 меньше кучи)
    Полагаю ваша куча почти отсортирована по дате, так что запросы указанные выше летать будут (лишнее будет отсекатся)
    Можете начать пока без секционирования (партицирования)

    Да, все таблицы-кучи были записаны параллельно, в хронологическом порядке.
    Решил начать с простого, без секционирования
    SERG1257
    kaktus1983какие поля надо перечислить в индексе
    Все.
    Создал
    Код: sql
    1.
    CREATE NONCLUSTERED COLUMNSTORE INDEX [имя] ON [dbo].[Temperatures] (TagIndex, DateAndTime, Val);
    

    Эффекта нет, как будто нет индекса вообще.
    • ? Видимо я что-то не понимаю и делаю не так...?
    • ? Важно ли, при создании COLUMNSTORE, что в таблице Temperatures есть еще несколько не нужных мне столбцов?
    • ? Стоит ли пробовать кластерный COLUMNSTORE?
    • ? Возможно нужны дополнительные (не колумнсторе) индексы?
    p.s. CREATE NONCLUSTERED COLUMNSTORE выполнилось гораздо быстрее, чем я ожидал (до часа).
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39942388
    SERG1257
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    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 выполнилось гораздо быстрее, чем я ожидал (до часа).
    Ради того все и затевалось. Размер индекса должен быть тоже очень маленкий (по сравнению с кучей). Он должен быстро и умно читатся.
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39942411
    kaktus1983
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    SERG1257, спасибо большое за ответы!
    Даю план в студию. Вдруг чего упустил, продублирую: сама таблица
    Код: sql
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    CREATE TABLE [dbo].[Temperatures_FloatTable](
    	[DateAndTime] [datetime2](7) NULL,
    	[Millitm] [smallint] NULL,
    	[TagIndex] [smallint] NULL,
    	[Val] [float] NULL,
    	[Status] [nvarchar](1) NULL,
    	[Marker] [nvarchar](1) NULL
    ) ON [PRIMARY]
    GO
    

    Размер 60GB, записей 1.5млрд. Индексов нет вообще, создаю
    Код: sql
    1.
    CREATE NONCLUSTERED COLUMNSTORE INDEX [Temperatures_FloatTable_CSI_TagDT] ON [dbo].[Temperatures_FloatTable] (TagIndex, DateAndTime, Val);
    

    только по трем нужным мне столбцам.
    Код: sql
    1.
    with (index = [Temperatures_FloatTable_CSI_TagDT]
    

    ничего не меняет
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39942412
    SERG1257
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    А почему план в студии от другого запроса?
    Две с половиной минуты неприемлимо? Сколько времени занимает группировка (запрос без *)
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39942415
    Фотография a_voronin
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    kaktus1983,

    Колумнстор партиционированный по полю фильтрации (дате) должен неплохо себя показать. Вообще таблицу надо отгонять в хранилище данных (в stage) и там заниматься такого рода анализом. И вообще такого рода данные рекомендую отогнать в вертику. Бесплано до 1 TB
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39942498
    Владислав Колосов
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    kaktus1983,

    Секционируйте кучу по дате, если выбираете относительно небольшие диапазоны.
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39942527
    kaktus1983
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    SERG1257
    А почему план в студии от другого запроса?
    Две с половиной минуты неприемлимо? Сколько времени занимает группировка (запрос без *)
    План именно от запроса на скрине... специально и его заскринил.
    Две с половиной минуты - это для очень упрощенного варианта запроса: выборка top(10) и только за 5 секунд.
    Для стандартного avg(Val) и время примерно за час - я отменил после 10 минут, а с индексом
    Код: sql
    1.
    create index [имя] on [dbo].[Temperatures] (TagIndex, DateAndTime) include (Val);
    

    выполняется до секунды.
    В конечном итоге мне надо сформировать матрицу данных 12000 х 444, каждая ячейка которой - результат запроса avg(Val) за диапазон времени примерно час. Тут каждая милисекунда будет важна))
    ...
    Рейтинг: 0 / 0
    Выборка данных из таблицы с миллиардами записей
        #39942529
    kaktus1983
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    Владислав Колосов, a_voronin, спасибо!
    В целом задачу решил, SP отработала, 12000 х 444 значений просчитала за 4 часа.
    Всем спасибо за помощь и идеи!
    aleks222, SERG1257, вам отдельная благодарность))
    ...
    Рейтинг: 0 / 0
    45 сообщений из 45, показаны все 2 страниц
    Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка данных из таблицы с миллиардами записей
    Целевая тема:
    Создать новую тему:
    Автор:
    Закрыть
    Цитировать
    Найденые пользователи ...
    Разблокировать пользователей ...
    Читали форум (0):
    Пользователи онлайн (0):
    x
    x
    Закрыть


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