powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нужна помощь в проектировании ДБ
25 сообщений из 27, страница 1 из 2
Нужна помощь в проектировании ДБ
    #38730894
SozinOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья всем привет!
Занимаюсь разработкой ПО для анализа и хранения данных от приборов ГЛОНАСС навигации.
Сразу скажу, что с проектированием ДБ я раньше не сталкивался, и в этом деле являюсь абсолютным профаном.
Однако, есть потребность в хранении и оперативном извлечении (по необходимости) большого количества строк.
В сутки приходит порядка 3млн строк, которые нужно хранить в течении 90-366 дней (требование заказчика).

На данный момент база вертится на MSSQL, все валится в одну таблицу, индексы создаются в момент записи строки.
Однако данные которые хранятся более месяца - занимают очень больше время при выборке (что кстати блокирует базу и не дает записывать новые данные в любые таблицы).
Каким образом можно ускорить выборку данных, учитывая что индексация проводится в соответствии с выборочными запросами.
Поможет ли разбитие базы на несколько таблиц вместо одной, (например: каждый день новая таблица, примерным размеров в 3млн записей.. вместо одной таблицы в 300млн) а затем выборка с использованием UNION?
Может быть переехать на другую СУБД, более приспособленную к большим объемам?

PS
Друзья, как я уже говорил выше - я только пытаюсь разобраться в этом деле, и если бы у меня был хороший запас по времени, то я обязательно бы почитал мануалы и ознакомился с горами литературы. Но в связи ограниченностью нашего бренного пребывания на земле - очень прошу обойтись без нравоучений и устроить настоящий обмен опытом, а не "браваду бывалого СУБДшника над неопытным новичком"!

PSS
Поиск на форуме ситуации копирующей мою - к положительным результатам не привели, ссылки на темы (если аналоги есть) приветствуются!
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730905
Фотография Infernal V. Raven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SozinOFF,

а может сразу сюда ? Оно явно быстрей и качественней получится. Тем более, что "и если бы у меня был хороший запас по времени...".
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730912
SozinOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Infernal V. Raven,

Не думаю, что при таком количестве опыта у многих форумчан, стоит искать подрядчика, тем более, что поддерживать эту ДБ однозначно мне, а значит не помешало бы разобраться в проблеме и скрутить БД своими руками.
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730918
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730925
SozinOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бредятина,

Если я верно понимаю - в статье речь идет о том, что база находится на разных машинах физически, отсюда запросы выполняются многими машинами параллельно, что если пренебречь скоростью работы сети - определенно является более продуктивным и быстрым решением... в моей же ситуации машина к несчастью всего одна, и та не "фонтан"...
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730931
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SozinOFF,
Значит не читайте... Используйте MUMPS.
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730939
1001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SozinOFFБредятина,

Если я верно понимаю - в статье речь идет о том, что база находится на разных машинах физически,
отсюда запросы выполняются многими машинами параллельно, что если пренебречь скоростью работы сети -
определенно является более продуктивным и быстрым решением...
в моей же ситуации машина к несчастью всего одна , и та не "фонтан"... имхо
ТС - вбросил

вродеж тс - не овцебык..)))

пужкай ишо ч-нить скажет
тем виднее
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730940
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SozinOFFВ сутки приходит порядка 3млн строк
То есть примерно 35 в секунду.

SozinOFFКаким образом можно ускорить выборку данных, учитывая что индексация
проводится в соответствии с выборочными запросами.
1) Перестать маяться глупостью с построением индексов на лету. Определить их один раз и
навсегда.
2) Использовать партиционирование.
3) Включить версионность.

Всё, этого хватит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730961
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SozinOFF учитывая что индексация проводится в соответствии с выборочными запросами.Эту сентенцию я не понял.

SozinOFF устроить настоящий обмен опытомВываливайте сюда подробности:
cкрипт на создание таблиц (чтобы имена полей и таблиц можно было копипастить), запросы на вставку данных, примеры запросов на выборку, регламент работы (пики, затишья) и т.д.

SozinOFF что кстати блокирует базу и не дает записывать новые данные в любые таблицыКакие запросы в какие таблицы?

SozinOFF Поможет ли разбитие базы на несколько таблиц вместо однойМожет и поможет. Какая у вас версия/редакция?

SozinOFF очень прошу обойтись без нравоучений ... "браваду бывалого СУБДшника над неопытным новичком" А ради чего мы сюда ходим - то
Терпите и обтекайте. Не можете обтекать - впитывайте.
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730966
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SozinOFFиндексация проводится в соответствии с выборочными запросами.

а какие он типичные запросы, каков период выборки
--текущий день
--неделя
--месяц
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730980
SozinOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257,

К сожалению, переписки на форумах я опыта не шибко имею, поэтому за отсутствие цитирования и другие мелочи - извеняйте)))

СУБД MSSQL 11.0.2100.60 (win2008, x64)
Создание таблицы

CREATE TABLE [dbo].[History] (
[ID] int NOT NULL ,
[AT_NUM] bigint NULL ,
[AT_TIME] int NULL ,
[SV_TIME] int NULL ,
[AT_SPEED] int NULL ,
[AT_VECTOR] int NULL ,
[AT_POSITION] int NULL ,
[AT_ONFINAL] int NULL ,
[AT_ONROUTE] int NULL ,
[ROUTE_ID] int NULL ,
[LASTSTATETIME] int NULL ,
[ONSTATEBY] int NULL ,
[AT_COORD_X] float NULL ,
[AT_COORD_Y] float NULL ,
[AT_ONFIANL_WAS] int NULL ,
[AT_ONROUTE_WAS] int NULL ,
[AT_STOP_ID] int NULL ,
PRIMARY KEY ([ID])
)
GO

Вставляю стандартно командой INSERT, отправляю команды пачками (т.е. по 30-35 за обращение к СУБД) - раз в секунду.

INSERT INTO History(AT_NUM,AT_TIME,SV_TIME,AT_SPEED,AT_VECTOR,AT_POSITION,AT_ONFINAL,AT_ONROUTE,ROUTE_ID,LASTSTATETIME,ONSTATEBY,AT_COORD_X,AT_COORD_Y,AT_ONFINAL_WAS,AT_ONROUTE_WAS,AT_STOP_ID) VALUES(...)

Поля в History заполняются все, за исключением поля AT_STOP_ID - оно по необходимости.

По поводу индексации - её я провел в соответствии с советами утилиты Managment Studio - при стандартных выборках, например:

SELECT * FROM History WHERE (SV_TIME >= Начальное время отчета в UNIX_TIME AND SV_TIME <= Конечное время отчета в UNIX_TIME) AND (AT_COORD_X != 0.0) AND (AT_COORD_Y != 0.0) AND (ROUTE_ID = ИД Маршрута) AND (AT_ONFINAL_WAS = 1) AND (AT_ONFINAL = 0)


Пик запросов SELECT совпадает с пиком запросов INSERT и приходится на время с 7:00 до 23:00 часов дня, после 0:00 запросы SELECT отсутствуют, а INSERT падает раз в 5-8.

По мимо таблицы History, есть ещё несколько таблиц в которых храниться от силы 10-20 тысяч строк... При выборки из таблицы History (особенно за даты в далеком прошлом) - малые таблицы не доступны, да и база в целом не отвечает...
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730981
SozinOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА,

Обычно запросы SELECT делаются в рамках 1го дня, и редко когда захватывают 2 дня и более.
Отсюда я подумал, что если делить информацию по таблицам опираясь на дни, при запросе нужно будет лопатить не таблицу размером >300млн записей, а всего 3млн.
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730982
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вряд ли на эту таблицу есть ссылки так что замените ей первичный ключ на SV_TIME + id
Сделайте его кластерным.
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730989
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подразумевалось что SV_TIME - есть время события - то есть присутствует во всех запросах, хорошо подходит для секционирования и т.д.
а id просто гарантировано добавляет уникальности.

SozinOFF По поводу индексации - её я провел в соответствии с советами утилиты Managment StudioСписок индексов (c полями) в студию

SozinOFF Вставляю стандартно командой INSERT, отправляю команды пачками (т.е. по 30-35 за обращение к СУБД)В смысле каком смысле пачка

insert () values
...
insert () values
go

или

BULK INSERT ...

Суть в том чтобы снизить накладные расходы на вставку (делать это пореже, вставлять больше)
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38730999
1001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
..... Но в связи ограниченностью нашего бренного пребывания на земле - ...

((


...
По мимо таблицы History, есть ещё несколько таблиц в которых храниться от силы 10-20 тысяч строк...
При выборки из таблицы History (особенно за даты в далеком прошлом) - малые таблицы не доступны,
да и база в целом не отвечает...


поясни
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38731003
SozinOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257,

по такому типу:
insert () values
...
insert () values
go


Индексы:

CREATE UNIQUE INDEX [ID] ON [dbo].[History]
([ID] ASC)
ON [PRIMARY]
GO

CREATE INDEX [SELECT_FINAL] ON [dbo].[History]
([AT_ONFINAL] ASC, [ROUTE_ID] ASC, [AT_ONFINAL_WAS] ASC, [SV_TIME] ASC, [AT_COORD_X] ASC, [AT_COORD_Y] ASC)
INCLUDE ([ID], [AT_NUM], [AT_TIME], [AT_SPEED], [AT_VECTOR], [AT_POSITION], [AT_ONROUTE], [LASTSTATETIME], [ONSTATEBY], [AT_ONROUTE_WAS], [AT_STOP_ID])
ON [PRIMARY]
GO

CREATE INDEX [SELECT_CAR] ON [dbo].[History]
([AT_NUM] ASC, [ROUTE_ID] ASC, [SV_TIME] ASC, [AT_COORD_X] ASC, [AT_COORD_Y] ASC)
INCLUDE ([ID], [AT_TIME], [AT_SPEED], [AT_VECTOR], [AT_POSITION], [AT_ONFINAL], [AT_ONROUTE], [LASTSTATETIME], [ONSTATEBY], [AT_ONFINAL_WAS], [AT_ONROUTE_WAS], [AT_STOP_ID])
ON [PRIMARY]
GO

CREATE INDEX [SELECT_ROUND] ON [dbo].[History]
([ROUTE_ID] ASC, [SV_TIME] ASC, [AT_COORD_X] ASC, [AT_COORD_Y] ASC)
INCLUDE ([ID], [AT_NUM], [AT_TIME], [AT_SPEED], [AT_VECTOR], [AT_POSITION], [AT_ONFINAL], [AT_ONROUTE], [LASTSTATETIME], [ONSTATEBY], [AT_ONFINAL_WAS], [AT_ONROUTE_WAS], [AT_STOP_ID])
ON [PRIMARY]
GO

В зависимости от запроса - разные поля индексированны.


Сейчас исправлю на:
CREATE UNIQUE INDEX [ID] ON [dbo].[History]
([ID] ASC, [SV_TIME] ASC)
ON [PRIMARY]
GO
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38731005
SozinOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1001,

Ну например я если сегодня сделаю выборку за 1 мая, от она будет делаться продолжительное время... >1мин.
В момент обработки выборки другие таблицы не открываются, а если и открываются то с очень большим таймингом!
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38731013
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСейчас исправлю на:
CREATE UNIQUE INDEX [ID] ON [dbo].[History]
([ID] ASC, [SV_TIME] ASC)
ON [PRIMARY]
GO В том то и дело что надо
Код: sql
1.
CREATE unique clustered INDEX PK_history  ON [dbo].[History] (SV_TIME, ID)



Я предполагаю что SV_TIME суть время события и все запросы должны включать его, типа а что у нас произошло за последние сутки или самый лучший фильм с .. по .. и т.д.
При этом id определяется из identity.

И это исправление перетрясет всю таблицу поэтому не торопитесь.
Еще лучше вообще переопределить первичный ключ, ибо лишний индекс на id нахрен не нужен.

По другим индексам тоже надо смотреть запросы.
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38731018
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SozinOFFВ зависимости от запроса - разные поля индексированны.
То есть ты перед каждым запросом "select" посылаешь соответствующий "create index"?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38731023
SozinOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Нене, все запросы индексы уже созданы, просто я их создавал на основании того, что советовал Managment Studio для увеличения производительности запроса
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38731028
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SozinOFFИндексы:

CREATE UNIQUE INDEX [ID] ON [dbo].[History]
([ID] ASC)
ON [PRIMARY]
GO

CREATE INDEX [SELECT_FINAL] ON [dbo].[History]
([AT_ONFINAL] ASC, [ROUTE_ID] ASC, [AT_ONFINAL_WAS] ASC, [SV_TIME] ASC, [AT_COORD_X] ASC, [AT_COORD_Y] ASC)
INCLUDE ([ID], [AT_NUM], [AT_TIME], [AT_SPEED], [AT_VECTOR], [AT_POSITION], [AT_ONROUTE], [LASTSTATETIME], [ONSTATEBY], [AT_ONROUTE_WAS], [AT_STOP_ID])
ON [PRIMARY]
GO

CREATE INDEX [SELECT_CAR] ON [dbo].[History]
([AT_NUM] ASC, [ROUTE_ID] ASC, [SV_TIME] ASC, [AT_COORD_X] ASC, [AT_COORD_Y] ASC)
INCLUDE ([ID], [AT_TIME], [AT_SPEED], [AT_VECTOR], [AT_POSITION], [AT_ONFINAL], [AT_ONROUTE], [LASTSTATETIME], [ONSTATEBY], [AT_ONFINAL_WAS], [AT_ONROUTE_WAS], [AT_STOP_ID])
ON [PRIMARY]
GO

CREATE INDEX [SELECT_ROUND] ON [dbo].[History]
([ROUTE_ID] ASC, [SV_TIME] ASC, [AT_COORD_X] ASC, [AT_COORD_Y] ASC)
INCLUDE ([ID], [AT_NUM], [AT_TIME], [AT_SPEED], [AT_VECTOR], [AT_POSITION], [AT_ONFINAL], [AT_ONROUTE], [LASTSTATETIME], [ONSTATEBY], [AT_ONFINAL_WAS], [AT_ONROUTE_WAS], [AT_STOP_ID])
ON [PRIMARY]
GOЭто вы в каждый индекс включаете почти все поля из таблицы ? Пользы от таких индексов немного, они, скорее вредят, чем помогают.
SozinOFFCREATE UNIQUE INDEX [ID] ON [dbo].[History]([ID] ASC, [SV_TIME] ASC) ON [PRIMARY]GOАбсолютно бессмысленный индекс, если ID - уникальный идентификатор. Пользы в нём от [SV_TIME] - нулевая. Перестановка полей имеет смысл, если индекс будет кластерным. И основная выборка данных обязательно включает в себя условия по полю [SV_TIME].
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38731487
SozinOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ChA,

По индексу ID - согласен.
А по индексам указанным выше - такие индексы советует анализатор запроса в Mstudio, в этих индексах указанны те данные, которые используются в запросе SELECT. Без такой индексации выборка занимает около 12 минут, а при наличии индексации - 40 секунд (первый раз), а из кеша - моментально...
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38731503
SozinOFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне кажется, если есть способ постоянно держать индексы по всей базе в кеше - то это шанс значительно ускорить работу ДБ!
Останется решить задачу с чисткой базы, т.к. при нынешней скорости на очистку порядка 100млн записей из базы - не хватает ночи...
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38731518
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SozinOFFChA,
По индексу ID - согласен.
А по индексам указанным выше - такие индексы советует анализатор запроса в Mstudio, в этих индексах указанны те данные, которые используются в запросе SELECT. Без такой индексации выборка занимает около 12 минут, а при наличии индексации - 40 секунд (первый раз), а из кеша - моментально...Анализатор предлагает вам индексацию в условиях глубоко вакуума. Предложения его, как правило элементарны и не заслуживают особого доверия. Всё, что указано в условиях отбора в поля индекса он предлагает использовать как поля индекса, всё что возвращается, в include-поля. Это по большей части профанация. Индексы должны продумываться разработчиком и очень тщательно. Главная цель - минимизация обращений к диску. Поэтому очень важно продумать кластерный индекс, в котором подобное хранится рядом с подобным, в смысле типичных условий запросов на выборку данных.
...
Рейтинг: 0 / 0
Нужна помощь в проектировании ДБ
    #38731521
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SozinOFFМне кажется, если есть способ постоянно держать индексы по всей базе в кеше - то это шанс значительно ускорить работу ДБ!
Останется решить задачу с чисткой базы, т.к. при нынешней скорости на очистку порядка 100млн записей из базы - не хватает ночи...И кстати, судя по условиям, Вам очень полезно использовать партицирование. Впрочем, об этом, по-моему, уже говорили выше.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нужна помощь в проектировании ДБ
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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