|
|
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
Друзья всем привет! Занимаюсь разработкой ПО для анализа и хранения данных от приборов ГЛОНАСС навигации. Сразу скажу, что с проектированием ДБ я раньше не сталкивался, и в этом деле являюсь абсолютным профаном. Однако, есть потребность в хранении и оперативном извлечении (по необходимости) большого количества строк. В сутки приходит порядка 3млн строк, которые нужно хранить в течении 90-366 дней (требование заказчика). На данный момент база вертится на MSSQL, все валится в одну таблицу, индексы создаются в момент записи строки. Однако данные которые хранятся более месяца - занимают очень больше время при выборке (что кстати блокирует базу и не дает записывать новые данные в любые таблицы). Каким образом можно ускорить выборку данных, учитывая что индексация проводится в соответствии с выборочными запросами. Поможет ли разбитие базы на несколько таблиц вместо одной, (например: каждый день новая таблица, примерным размеров в 3млн записей.. вместо одной таблицы в 300млн) а затем выборка с использованием UNION? Может быть переехать на другую СУБД, более приспособленную к большим объемам? PS Друзья, как я уже говорил выше - я только пытаюсь разобраться в этом деле, и если бы у меня был хороший запас по времени, то я обязательно бы почитал мануалы и ознакомился с горами литературы. Но в связи ограниченностью нашего бренного пребывания на земле - очень прошу обойтись без нравоучений и устроить настоящий обмен опытом, а не "браваду бывалого СУБДшника над неопытным новичком"! PSS Поиск на форуме ситуации копирующей мою - к положительным результатам не привели, ссылки на темы (если аналоги есть) приветствуются! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 19:44 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
SozinOFF, а может сразу сюда ? Оно явно быстрей и качественней получится. Тем более, что "и если бы у меня был хороший запас по времени...". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 19:52 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
Infernal V. Raven, Не думаю, что при таком количестве опыта у многих форумчан, стоит искать подрядчика, тем более, что поддерживать эту ДБ однозначно мне, а значит не помешало бы разобраться в проблеме и скрутить БД своими руками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 19:59 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
Бредятина, Если я верно понимаю - в статье речь идет о том, что база находится на разных машинах физически, отсюда запросы выполняются многими машинами параллельно, что если пренебречь скоростью работы сети - определенно является более продуктивным и быстрым решением... в моей же ситуации машина к несчастью всего одна, и та не "фонтан"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 20:09 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
SozinOFF, Значит не читайте... Используйте MUMPS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 20:16 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
SozinOFFБредятина, Если я верно понимаю - в статье речь идет о том, что база находится на разных машинах физически, отсюда запросы выполняются многими машинами параллельно, что если пренебречь скоростью работы сети - определенно является более продуктивным и быстрым решением... в моей же ситуации машина к несчастью всего одна , и та не "фонтан"... имхо ТС - вбросил вродеж тс - не овцебык..))) пужкай ишо ч-нить скажет тем виднее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 20:27 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
SozinOFFВ сутки приходит порядка 3млн строк То есть примерно 35 в секунду. SozinOFFКаким образом можно ускорить выборку данных, учитывая что индексация проводится в соответствии с выборочными запросами. 1) Перестать маяться глупостью с построением индексов на лету. Определить их один раз и навсегда. 2) Использовать партиционирование. 3) Включить версионность. Всё, этого хватит. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 20:28 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
SozinOFF учитывая что индексация проводится в соответствии с выборочными запросами.Эту сентенцию я не понял. SozinOFF устроить настоящий обмен опытомВываливайте сюда подробности: cкрипт на создание таблиц (чтобы имена полей и таблиц можно было копипастить), запросы на вставку данных, примеры запросов на выборку, регламент работы (пики, затишья) и т.д. SozinOFF что кстати блокирует базу и не дает записывать новые данные в любые таблицыКакие запросы в какие таблицы? SozinOFF Поможет ли разбитие базы на несколько таблиц вместо однойМожет и поможет. Какая у вас версия/редакция? SozinOFF очень прошу обойтись без нравоучений ... "браваду бывалого СУБДшника над неопытным новичком" А ради чего мы сюда ходим - то Терпите и обтекайте. Не можете обтекать - впитывайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 21:12 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
SozinOFFиндексация проводится в соответствии с выборочными запросами. а какие он типичные запросы, каков период выборки --текущий день --неделя --месяц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 21:32 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
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 (особенно за даты в далеком прошлом) - малые таблицы не доступны, да и база в целом не отвечает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 22:16 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
ПЕНСИОНЕРКА, Обычно запросы SELECT делаются в рамках 1го дня, и редко когда захватывают 2 дня и более. Отсюда я подумал, что если делить информацию по таблицам опираясь на дни, при запросе нужно будет лопатить не таблицу размером >300млн записей, а всего 3млн. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 22:19 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
Вряд ли на эту таблицу есть ссылки так что замените ей первичный ключ на SV_TIME + id Сделайте его кластерным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 22:21 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
Подразумевалось что SV_TIME - есть время события - то есть присутствует во всех запросах, хорошо подходит для секционирования и т.д. а id просто гарантировано добавляет уникальности. SozinOFF По поводу индексации - её я провел в соответствии с советами утилиты Managment StudioСписок индексов (c полями) в студию SozinOFF Вставляю стандартно командой INSERT, отправляю команды пачками (т.е. по 30-35 за обращение к СУБД)В смысле каком смысле пачка insert () values ... insert () values go или BULK INSERT ... Суть в том чтобы снизить накладные расходы на вставку (делать это пореже, вставлять больше) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 22:36 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
..... Но в связи ограниченностью нашего бренного пребывания на земле - ... (( ... По мимо таблицы History, есть ещё несколько таблиц в которых храниться от силы 10-20 тысяч строк... При выборки из таблицы History (особенно за даты в далеком прошлом) - малые таблицы не доступны, да и база в целом не отвечает... поясни ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 22:53 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 22:59 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
1001, Ну например я если сегодня сделаю выборку за 1 мая, от она будет делаться продолжительное время... >1мин. В момент обработки выборки другие таблицы не открываются, а если и открываются то с очень большим таймингом! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 23:01 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
авторСейчас исправлю на: CREATE UNIQUE INDEX [ID] ON [dbo].[History] ([ID] ASC, [SV_TIME] ASC) ON [PRIMARY] GO В том то и дело что надо Код: sql 1. Я предполагаю что SV_TIME суть время события и все запросы должны включать его, типа а что у нас произошло за последние сутки или самый лучший фильм с .. по .. и т.д. При этом id определяется из identity. И это исправление перетрясет всю таблицу поэтому не торопитесь. Еще лучше вообще переопределить первичный ключ, ибо лишний индекс на id нахрен не нужен. По другим индексам тоже надо смотреть запросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 23:20 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
SozinOFFВ зависимости от запроса - разные поля индексированны. То есть ты перед каждым запросом "select" посылаешь соответствующий "create index"?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 23:24 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Нене, все запросы индексы уже созданы, просто я их создавал на основании того, что советовал Managment Studio для увеличения производительности запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 23:50 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
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]. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2014, 00:03 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
ChA, По индексу ID - согласен. А по индексам указанным выше - такие индексы советует анализатор запроса в Mstudio, в этих индексах указанны те данные, которые используются в запросе SELECT. Без такой индексации выборка занимает около 12 минут, а при наличии индексации - 40 секунд (первый раз), а из кеша - моментально... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2014, 12:50 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
Мне кажется, если есть способ постоянно держать индексы по всей базе в кеше - то это шанс значительно ускорить работу ДБ! Останется решить задачу с чисткой базы, т.к. при нынешней скорости на очистку порядка 100млн записей из базы - не хватает ночи... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2014, 13:03 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
SozinOFFChA, По индексу ID - согласен. А по индексам указанным выше - такие индексы советует анализатор запроса в Mstudio, в этих индексах указанны те данные, которые используются в запросе SELECT. Без такой индексации выборка занимает около 12 минут, а при наличии индексации - 40 секунд (первый раз), а из кеша - моментально...Анализатор предлагает вам индексацию в условиях глубоко вакуума. Предложения его, как правило элементарны и не заслуживают особого доверия. Всё, что указано в условиях отбора в поля индекса он предлагает использовать как поля индекса, всё что возвращается, в include-поля. Это по большей части профанация. Индексы должны продумываться разработчиком и очень тщательно. Главная цель - минимизация обращений к диску. Поэтому очень важно продумать кластерный индекс, в котором подобное хранится рядом с подобным, в смысле типичных условий запросов на выборку данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2014, 13:09 |
|
||
|
Нужна помощь в проектировании ДБ
|
|||
|---|---|---|---|
|
#18+
SozinOFFМне кажется, если есть способ постоянно держать индексы по всей базе в кеше - то это шанс значительно ускорить работу ДБ! Останется решить задачу с чисткой базы, т.к. при нынешней скорости на очистку порядка 100млн записей из базы - не хватает ночи...И кстати, судя по условиям, Вам очень полезно использовать партицирование. Впрочем, об этом, по-моему, уже говорили выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2014, 13:11 |
|
||
|
|

start [/forum/topic.php?fid=32&startmsg=38730894&tid=1540817]: |
0ms |
get settings: |
13ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 241ms |
| total: | 410ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...