|
|
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Используемые средства Delphi, FibPlus, FB 1.5 Есть база в ней несколько таблиц, в которых сохраняется состояние параметров объекта в определенные моменты времени. Ежедневно в такие таблицы добавляется порядка 28 000 – 30 000 записей в каждую, т.е. за месяц каждая таблица увеличится на 900 000 записей, а за год на 10 000 000 записей. Причем 10 000 000 записей в год как я чувствую это не предел, при худшем раскладе таблицы в год будут увеличиваться на 30 000 000, но не больше. Заказчик хочет чтобы данные в таблицах сохранялись как минимум за 1 год. По этим таблицам в программе нужно так же делать выборки (например выбрать значения группы параметров на определенный момент, или выбрать значения какого то параметра за определенный период для определения динамики изменения параметра за этот период и возможно для прогнозирования его будущих изменений, а так же другие запросы). Все эти запросы будут выполнятся довольно таки часто по этому хотелось бы чтобы выборка выполнялась не долго. И вот возникла идея, а что если данные хранить не в одной большой таблице, а создавать отдельную таблицу для каждого месяца, т.е. тогда при запросе выбор будет происходить из одной сравнительно небольшой таблицы или из нескольких с объединением результатов с помощь Union. Потом так и удалять записи вроде проще т.е. по истечении какого-то периода будет просто удалятся таблица за целый месяц. Что плохо так это то, что запросы усложнятся в особенности с объединением результатов за несколько месяцев. А так же то, что необходимо проверять наличие таблиц за определенный месяц. Хотелось бы услышать мнения по поводу такого подхода, т.к. как я на FB только переезжаю, а до этого использовал BDE + Paradox, на котором такой подход реализовывал. Так же не ясно нужно ли после создания таблицы переподключаться к серверу, и как получить список созданных таблиц, а также относится ли создание и удаление таблицы к модификациям, число которых ограничивается 255. А также не ясно почему практически при любом действии (будь то вставка 1 записи, или выборка данных) сервер FB загружает процессор на 100%. Так же не ясно как в с помощью FibPlus выбирать много записей >200000 он ведь при этом их помещает в память и когда она заканчивается начинаются жуткие тормоза (логично было бы как- то этим процессом управлять т.е. при больших выборках данные складывать в файл на диске, а при маленьких помещать выбираемые данные в память). Сейчас чую народ скажет, что возвращать такие наборы данных это не правильно, значит база организованна не верно и руки кривые типа только с BDE переехал. Но вот есть архив значений параметров его ужать или усреднить нельзя (ну или по крайне мере я не знаю как) и заказчик захотел отчет за месяц распечатать, то тогда придется делать такую большую выборку. Ну а как в данном случае поступить ? Хотелось бы узнать типовые подходы для решения таких задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2004, 17:34 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Код: plaintext select rdb$relation_name from rdb$relations where (rdb$system_flag = 0) and (rdb$view_source is null) order by rdb$relation_name asc Этот запрос выдаёт весь список таблиц. Код: plaintext 1. В хранимой процедуре пишешь if (exists(select * from rdb$relations where (rdb$system_flag = 0) and (rdb$view_source is null) and (rdb$relation_name='Имя_проверяемой_Таблицы'))) then BEGIN /* делаешь то что тебе надо если таблица есть */ END Либо из програмы select * from rdb$relations where (rdb$system_flag = 0) and (rdb$view_source is null) and (rdb$relation_name='Имя_проверяемой_Таблицы') /* Если таблица существует, тогда будет возвращена одна запись */ ОСтальное не знаю, не сталкивался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2004, 22:57 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
To Demosphen спасибо вроде получилось. В общем то хотелось бы услышать мнения по поводу храненеия данных не в одной большой таблице, а в таблицах создаваемых ежемесячно. Не будет ли каких граблей и даст ли это какой нибудь ощутимый прирост скорости выборок, или такой подход создаст лишь лишние проблемы. На Paradox такой подход был не плох, а вот как он будет на FB ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 00:36 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Ну парадокс это парадокс, тоже когдато так делал. А в ИБ я так бы не стал делать если идет частое обращение к данным за прошлые периоды (притом если эти периоды нужно будет объеденять) , это может затормозить работу + лишний гемор с закрытием периода + гемор с наваротами при выборке нескольких периодов (это конечно ИМХО) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 08:09 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
не делай так. если железо более или менее вменяемое, пусть в одной таблице хранится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 08:38 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Точно-точно, несколько таблиц делать ненадо. При правильно постореных запросах и наличии нужных индексов тормозов небудет и при бОльших объемах. Единственные тормоза которые я вижу могут возникнуть при удалении предидущих периодов, IB/FB неочень хорошо относится к массовому удалению...\r \r А про правильно построеные запросы, вот такой пример:\r - таблица с 1001000 записей.\r - у 1000000 записей поле fld1=10\r - у 1000 записей поле fld1<10\r - есть индекс по полю fld1\r - запрос select count(*) from tbl1 where fld1<10 хорошенько повесит систему\r - запрос select count(*) from tbl1 where fld1<=9 отработает почти мгновенно\r \r тут говорили, что этот пример всем очевиден... неуверен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 11:18 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
To alex_k Железо скорей всего будет не лучше чем Celeron 1200, 128 ОЗУ, HDD 40 ГБ да еще эта машина будет загружена другими задачами, кроме сервера FB. Лучшего ожидать не приходится. Для одного проекта, который делался и тестировался под Win2000 на нормальной машине, заказчик подсунул 486SX с 8 МБ ОЗУ; HDD 200 МБ; видеокартой, которая не держала 800x600 и 256 цветов; и с win95 (благо при создании проекта я учитывал, что его могут запустить под 98, по этому проект заработал даже в таких условиях, правда градиентные заливки выглядели плохо). Так что ожидать хорошего железа не приходится. To Andrey_ Честно говоря, для меня это пока не очевидно ведь с математической точки зрения <10 и <=9 это одно и тоже. На счет удаления, думаю, его уместно будет делать раз в месяц, а после него делать b/r. Хотя в случае с месячными таблицами выполнялось бы просто удаление таблицы за месяц, и никакой бы сборки мусора бы не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 13:33 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
>начинающий ? Хм... Ну тогда следовало бы оценить насколько часто будут встречатся запросы к нескольким периодам. Если достаточно редко, то можно и разбить на таблици... Но я так ниразу не делал и хлопот не имел :) Кстати про винчестер. 40 ГБ для базы с таблицей в 30 000 000 записей это маловато. У меня таблица из одного integer и одного varchar(15) со 100 000 000 занимала 6 ГБ. А индекс по integer занимал ~1.5 ГБ. Поэтому даже если такая база и влезет на винт, то для backup-а места уже врядли хватит. А если еще и будут множественные обновления данных, то учитываю что IB/FB версионный сервер, могу предположить что и база не влезет. >ведь с математической точки зрения <10 и <=9 это одно и тоже угу, а с точки зрения IB/FB не очень :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 13:48 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
начинающий ? авторCeleron 1200, 128 ОЗУ, HDD 40 ГБ На такой технике лучше будет использоовать FB 1.5 под Linux. Меньше ресурсов потребуется для системы, ну и надежность повыше. Только вот с 40Гб мне тоже кажется проблемы возникнут скоро. Best regards, Dnico. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 14:10 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Линух, линух... Читал что чел пишет? "... машина будет загружена другими задачами, кроме сервера FB " И спорим на пиво, что задачи эти будут что-то типа MS OFFICE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 14:15 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
автор Хм... Ну тогда следовало бы оценить насколько часто будут встречатся запросы к нескольким периодам. Если достаточно редко, то можно и разбить на таблици... Но я так ниразу не делал и хлопот не имел :) В принципе для анализа динамики изменения параметров зачастую достаточно выбрать данные за последние 3-15 дней, т.е. в начале месяца выборка будет происходить по двум таблицам в средине и в конце по одной таблице. А потом, честно говоря, если пользователь захочет вдруг выбрать все данные за несколько >3 месяцев, то не ясно как быть в этом случае т.к. объем выбираемых данных будет очень большой. А если использовать FibPlus или IBX то они всю выборку помещают в память, что не есть гуд при таких выборках. Возможно, имеет смысл, вообще ввести ограничение, что выборку нельзя делать за период большей чем месяц, т.е. захотел посмотреть данные за два месяца, то сначала смотришь данные за один месяц, а потом за второй. А кстати, а как обстоят дела с компонентами IBO, может они позволяют как - то задавать (или сами решают) где размещать выбираемые данные в памяти или в файле на диске. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 14:25 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Тогда тушите свет !!! Такая система на первой неделе заткнется. Best regards, Dnico. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 14:36 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
>начинающий ? Ну начнем с того, что существует такое понятие как своп. И когда заканчивается оперативка (а иногда и раньше) информация начинает выталкиватся в своп, который в свою очередь есть обычный файл. Единственная разница может быть, что компоненты IBO сами сразу выкладывают на диск, а IBX средствами свопинга операционки. Но опять же, есть такое понятие как дисковый кеш, и совсем не обязательно когда IBO начинает выкладывать данные на диск они действительно начинают туда помещатся. И всетаки я бы подумал над усреднением данных для отчетов. Например с помощью SP можно сделать очень многое. И затраты памяти были бы значительно меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 14:53 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
>ведь с математической точки зрения <10 и <=9 это одно и тоже угу, а с точки зрения IB/FB не очень :) А можно разжевать, если не в облом, конечно? BTW, аналогично по +0... _________________ "Hello, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 17:10 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
>Ex_Soft Ну... э... по идее исходя из результатов моих тестов при запросе <10 проход по индексу осуществляется и по записям =10 и по записям <10. А при запросе <=9 проход по индексу осуществляется только по записям <10. Правда мне совершенно непонятно что значит "однонаправленный" индекс. Может такие результаты у меня вышли потому что я использовал asc-индекс... Но это наверное тоже очевидно и совершенно не требует описания в документации Про +0 незнаю. Или это был впрос не ко мне? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 17:29 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Про +0 незнаю. Или это был впрос не ко мне? Да не... Ваще ко всем, в отличие от меня, вченным людям Типа почему, 4 example: select bla-bla-bla where aaa=bbb получается медленнее, чем select bla-bla-bla where aaa=bbb+0? Так сказать теоритическую базу под это подвести... _________________ "Hello, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 17:52 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Чушь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 17:53 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Сам понимаю, но факты - весчЪ неумолимая. Тем паче, не я это сам придумал - где-то высмотрел... И на конфе, вроде, тоже пробегало - +0 употребляют... Визуально помню, а вот точную ветку указать не могу... _________________ "Hello, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 17:58 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Ну начнем с того, что существует такое понятие как своп. И когда заканчивается оперативка (а иногда и раньше) информация начинает выталкиватся в своп, который в свою очередь есть обычный файл. Единственная разница может быть, что компоненты IBO сами сразу выкладывают на диск, а IBX средствами свопинга операционки. Но опять же, есть такое понятие как дисковый кеш, и совсем не обязательно когда IBO начинает выкладывать данные на диск они действительно начинают туда помещатся. Да новот как показывают наблюдения если данные выкладываются в простой файл, а не в память и не в файл подкачки, то система себя чуствут значительно лучше и работает гараздо шустрее. т.к. захламление памяти и файла подкачки к хорошему не приводит. И всетаки я бы подумал над усреднением данных для отчетов. Например с помощью SP можно сделать очень многое. И затраты памяти были бы значительно меньше. Думал и не раз и над усреднением и над фильтрами, по фильтрам кое чего надумал (но это все равно не позволяет сильно уменьшить объем выбираемых данных). А насчет усреднения вообще непредставляю как можно cделать: если в таблице за периуд усреднения записаны значения ну например температур: т.е. 500 записей что температура была около 15 °С (не есть хорошо), 500 записей что она была около 25 °С (не есть хорошо), и 10 записей что она была около 20 °С ( хорошо). Если это усреднить то получится что на всем промежутке она была равна 20 °С и следовательно технологический процесс был в норме (что не верно). Или я чего то не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 17:59 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Ex_SoftСам понимаю, но факты - весчЪ неумолимая. Тем паче, не я это сам придумал - где-то высмотрел... Какие накуй факты?! На тех запросах что ты привёл?! Фикня полная! Да, иногда бывает нужно "обмануть" оптимизатор, который иногда на сложных запросах цепляет лишний индекс , но не на таких же ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 18:10 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Я ж для примера - так сказать, чтобы на пальцах. Там запросец - не ната баловаться... А где можно просветиться на тему МимопроходящийДа, иногда бывает нужно "обмануть" оптимизатор, который иногда на сложных запросах цепляет лишний индекс Не от балды ж этот +0 юзают. _________________ "Hello, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 18:21 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
>Мимопроходящий Что именно чушь? >кочнающий ? Чет с ником твоим сталося :) >Да новот как показывают наблюдения.... Ну... значит там (IBO) возможно используется сжатие при записи на диск. И кстати, на каких объемах это тесировалось и какая машина (в частности объем оперативки) была? >Думал и не раз и над усреднением и над фильтрами... насколько я понял надо показать динамику изменения температуры на протяжении какого-то времени. Если так то: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. примерно так с помощью "фильтра". Если нужно с определенным временным шагом, то все тоже самое, только разницу времени через UDF я бы сделал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 18:21 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Ex_SoftНе от балды ж этот +0 юзают. Ещё раз повторяю, специально для "НЕвченных". +0 юзают не от балды, а только тогда когда видят, что оптимизатор схватил лишний индекс и сунул его в PLAN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 18:29 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
Огромное человеческое спасибо за исчерпывающий ответ _________________ "Hello, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 18:34 |
|
||
|
Что лучше при работе с большими таблицами
|
|||
|---|---|---|---|
|
#18+
температура это аналоговое значение, полученное с АЦП а практически у все АЦП есть такая фитча к плаванье последнего 1 - 2х разрядов, т.е. даже если температура в точке измерения будет постоянной, то измеренные значения будут колебаться (например 20 ; 20.1; 20.2; 19.8 и т.д.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 18:46 |
|
||
|
|

start [/forum/topic.php?fid=40&fpage=475&tid=1578783]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 251ms |
| total: | 421ms |

| 0 / 0 |
