|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogвот есть ли преимущество перед звездочкой? есть - это более "fail early" и более определённе поведение если ты потом таблицу поменяешь и в ней убьются некоторые столбцы - то у тебя "фиксированный2 запрос явно и сразу выдаст ошибку, а "звёздочка" сделает вид что так и хорошо и программа споткнеся уже где-то сильно позже. но вот тупой пример с потолка - мы обновляем данные по массиву record'ов, соответсвенно поля таблицы соответсвуют переменным членам record'a. Если поля в SQL-запросе заданы жестко (формируются из типа record'a) и какое-то из полей пропало в результате неудачного развития проги, сервер сразу скажет "нет такого столбца, иди лесом". А в случае звёздочки этого поля просто не будет в запросе. Предположим, далее ты для каждой строки перебираешь все столбцы запроса и их значения запихиваешь в MyRecordArray[i] в соотв. поля - тогда поле одноименное исчезнутому столбцу ты просто пропустишь и сам этого не заметишь, оно просто не будет обновляться из БД и получить "мусор в памяти". пример с потолка, но идею ругани, возможно отражает ---- Кстати, в достаточно современной Дельфи пробег по SQL-запросу можно организовать не только как FieldXXX.AsInteger и потом Query.Next, но иногда и таким трюком: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 14:14 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovТолько вот он подымет сложность алгоритма до O(N^2)... В смысле, будут пробеги по всей таблице главной базы для каждой записи локальной? Ну да, зато сервак не тормозит :) 2 Di_LIne >У тебя чё, состав полей в табле меняется, как настрояниее у бушек, по 5 раз на дню? Нет, но меньше действий - меньше вероятность ошибиться/забыть. А если таких таблиц сто? >А от разовых 6 килобайт - так пипец, как вся сеть ляжет. От разовых нет, а ну как они раз в секунду перегоняются? От ситуации зависит >- А ты и не дергай каждый раз. :-) Справочник он и в африке справочник. В данном случае для проверки дельт. Опять же, по ситуации. У тебя шаблон использования такой, у кого-то - другой... >- А есле полей нуна не под 600, а 500? Тогда чё? Бушь в каждой итерации тягать излишки на клиента, напрягая сеть и сервер. Ежели не подтягивать все записи разом, то оверхед мб незначительный. >И тырканье "селект * фром Табля" больше грит о лености прогера и его не желания думать головом ДО. Леность - двигатель прогресса :) В общем, не думаю, что запрет на применение "*" должен иметь статус непогрешимой заповеди. Лучше уж в каждом случае руководствоваться здравым смыслом и целесообразностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 14:25 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Го-стхиЛеность - двигатель прогресса :) - Брехня! (из кины про Неуловимых) Миф для самоуспокоения лохов и гнилая отмаска, которая не катит. :-) Прогресс двигает только шевеление извилины. Но ни как не коденг "по шаблону из книшки". ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 14:36 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Ariochказалось бы... на самом деле в некоторых условиях такая транзакция тоже течет ресурсами - например БЛОБами ты серьезно хотелось бы душераздирающих подробностей с адресами, фамилиями, явками ... конкретными воспроизводимыми примерами ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 22:53 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
ДокAriochказалось бы... на самом деле в некоторых условиях такая транзакция тоже течет ресурсами - например БЛОБами ты серьезно хотелось бы душераздирающих подробностей с адресами, фамилиями, явками ... конкретными воспроизводимыми примерами И вот о чем в моей ветке все эти люди спорят? О_о И кто эти люди? о_О Шучу, шучу. Я не все понимаю из ваших диалогов, но интересно да. На подкорку пишется, время придет вспонится, осмыслится. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 07:58 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Отчитываюсь, кому интересно: 1. Сдвинув папироску в уголок рта поставил ультиматум начальству: Сейчас импортируем КАК ЕСТЬ. Паралельно полностью переделываю импорт. (дали срок две недели, хмыкнул сказал, что за две недели они получат очередную заплатку, но сам думаю, что впринципе, если не отвлекаться и обложиться грамотными примерами ... управлюсь) 2. Покурили с 1Сником, у него там в 1С есть "ПланВыгрузки". Т.е. при выходе из 1С бухгалтера внесшего свежие проводки, (теоретически) он выгружает все изменения в файл (XML) Который я считываю. Собственно ЭТО ОЧЕНЬ БОЛЬШОЕ ПОДСПОРЬЕ для меня. 2.1 не лезу медленным COM соединением к базам. 2.2 не лезу в базы в которых нет изменений. 2.3 получаю болеменее актуальные данные, а не тыркаю базу на проверки всех проводок за период. Вот баз 1С у нас большинство. Жду значит, решение от 1Сника до пятницы. Посмотрю в каком формате он может выкидывать данные и насколько эти данные актуальны. Вопрос к знающим(треп на тему приветствуется): Допустим есть у меня 200 потенциальных файлов на импорт (формат не суть, любой разберу, но скорей всего будет XML). Которые надо проверить, отфильтровать и только потом влить в основные таблички базы. Беда в том, что файлы появляются не одномоментно. Т.е. если бы они были все разом сформированы, считал их в TempTable, обработал процедурами и всё. Но, на деле будет так: появился файл, я его увидел, тутже кинулся считал. Кинул в TempTable обрабатываю... тут появляется еще 4 файла, один из этой же конторы, 3 других из других.... И чего бы сделать, в коем-то веке правильного? 1. Дать какой-то индекс данным из определенного файла и работать с этим куском (паралельно добавляя в TempTable другие файлы и обрабатывать их, каждый отдельно по индексу? 2. Под каждый кусок импорта создавать временную таблицу? И расстреливать ее по окончании обработки? 3. Другие варианты? (тут кто-то говорил про какие-то ГлобалТмпТабле... вроде, но мне не до них было, сейчас найду сообщение еще про них почитаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 09:17 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog, фишка GTT в том что сами таблицы (метаданные) постоянные их не надо каждый раз создавать и удалять, а вот данные в них временные: либо на время сессии, либо на время транзакции. Соответственно каждая сессия/транзакция видит и работает только со своими данными. Почитать можно здесь и здесь ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 09:41 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
еще вопрос, на сколько я правильно понял механизм: Есть Query для чтения. Дал ему отдельную транзакцию (read) "write nowait rec_version read_committed " Select в query забит жестко, не изменяется никогда. Стартую транзакцию. Выполняю Запрос. (Жарптица строит план, выполняет, отдает данные) Получаю данные обрабатываю... Закрываю транзакцию. (Вот здесь, ЖарПтичка похоронит план да? и не будет держать его в кэше? Я правильно понял?) ( как правильно? Стартавать транзакцию Реад перед выполнением запроса, или стартануть ее скажем при открытии формы и обрывать по закрытию формы? Как дольше держать план выполнения запроса в кэше?) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 09:42 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog, 1. план получается при препарировании запроса. Поэтому до тех пор пока ты не грохнешь свой query, или не закроешь коннект, или не сделаешь ему повторный prepare, или не вызовешь unprepare с планом ничего не будет. 2. Если у тебя основные действия будут делаться в ХП, то планы её внутренних запросов кешируются во время загрузки процедуры в кеш метаданных, который для классика будет жить до конца коннекта. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 09:48 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Симонов Денисdgdog, 2. Если у тебя основные действия будут делаться в ХП, то планы её... Понял. Спасибо. Но нет это не ХП, это справочники для заполнения PickList (dbgrideh) по полям. Срабатывает при реопене PfibDataset. Заметил, что сильно они тормозят (ну тут еще и DbGridEh, но пока хочу правильно сделать сами запросы, выжать максимум). Т.е. при закрытии транзакции Птичка план оставит до поры до времени? (FB Classic 2.1) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 10:01 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Симонов Денисdgdog, фишка GTT в том что сами таблицы (метаданные) постоянные их не надо каждый раз создавать и удалять, а вот данные в них временные: либо на время сессии, либо на время транзакции. Соответственно каждая сессия/транзакция видит и работает только со своими данными. Почитать можно здесь и здесь (похоже) То что доктор прописал. Ушел эксперементировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 10:03 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog, план запроса никак не связан с транзакцией и временем её жизни ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 10:06 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
по GTT? (ответ на вопрос сэкономит мне час на эксперименты) Создавая CREATE GLOBAL TEMPORARY TABLE MYSUPPERGTT в одной копии программы, следить чтоб другая копия одновременно создавала CREATE GLOBAL TEMPORARY TABLE MYSUPPERGTT_1 Или это проблема сервера? И я в каждой копии создаю CREATE GLOBAL TEMPORARY TABLE MYSUPPERGTT и CREATE GLOBAL TEMPORARY TABLE MYSUPPERGTT и они не пересекуться (для каждой копии программы свой набор данных)? А как это скажется на мусоре? А производительность сильно просядет от GTT (это ведь надо создать ГТтаблю. Запихать туда данные. Желательно проиндексировать... выполнить пару ХП... грохнуть ГТтаблю) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 10:09 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Попутный вопрос: ГТТ создается в памяти (ну если логику включить)? Какая интересно логика у разработчиков и как это конкретно работает... Форум КЛАСС. Где я раньше был? Спасибо вам ребята. Все пинки в основном в нужную сторону ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 10:16 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogПопутный вопрос: ГТТ создается в памяти (ну если логику включить)? Какая интересно логика у разработчиков и как это конкретно работает... Вопрос снят. Нашел сообщение Dimitr где то в других постах "для начала они в страничном кеше ФБ, как и любые другие таблицы. Затем в кеше оси. И уже потом на диске." ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 10:26 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog, надо не просто на буквы глядеть, но и хоть чуток разобраться что тебе пишут. GTT создаётся ровно один раз и не в твоей программе, а в любом средстве администрирования IBExpert, isql и т.д. Метаданные (поля и их типы) общие, а данные раздельные. И в плане мусора там всё норм. Данные GTT хранится не в самом файле БД, а во временных файлах или оперативной памяти. За временем жизни временных файлов следит сам FB. Ну релиз ноты почитай уже. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 10:29 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Симонов Денисdgdog, надо не просто на буквы глядеть, но и хоть чуток разобраться что тебе пишут. GTT создаётся ровно один раз и не в твоей программе, а в любом средстве администрирования IBExpert, isql и т.д. Метаданные (поля и их типы) общие, а данные раздельные. И в плане мусора там всё норм. Данные GTT хранится не в самом файле БД, а во временных файлах или оперативной памяти. За временем жизни временных файлов следит сам FB. Ну релиз ноты почитай уже. Хм. Уже пинают. И это еще Di_LIne и Arioch спят... те выйдут вообще на ноль поделят ,проиндексируют и спишут как ненужную GTTешечку. Денис - да я вкурсе, что надо читать. Что никто конкретную задачу не разгребет кроме недотепы-автора. Но руки и глаза разбегаются, времени катастрофически не хватает. Я вот сюда (на форум) пришел с одной задачкой... а напинали так, что я сижу и перелопачиваю свой код вообще в других модулях. И ДА, помогает.))) Тема GTT в голове, но руки не доходят, ну и кидаю вопросы которые могут возникнуть. За тычок в сторону GTT признателен. За объяснения, даже сквозь зубы СПАСИБИЩЕ. Твои ссылки про GTT прочитал по диагонали. Пока руки заняты перебивкой всяких Query вертятся вопросы, вот и кидаю их, а вдруг кто ответит и хоть часть инфы копать не надо будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 11:12 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogэто справочники для заполнения PickList (dbgrideh) по полям. Срабатывает при реопене PfibDataset. Заметил, что сильно они тормозят Сильно сомневаюсь, что план тут влияет, тем более по справочникам - думаю, время его построения находится за разрядной сеткой. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 11:15 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
я бы вот сам про GTT когда бы узнал, и что это применимо к моим задачам. А так раз пнули, два пнули, башкой в унитаз макнули... О тооочно. Во! то что нужно - GTT)))) Так что не стесняйтесь))) Уяснить надо много. ОЧЕНЬ МНОГО в короткий срок: от правильной конфигурации Птицы, до правильного написания кода в приложении. Чередую задачи, чтоб не свихнуться))) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 11:16 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Го-стхиdgdogэто справочники для заполнения PickList (dbgrideh) по полям. Срабатывает при реопене PfibDataset. Заметил, что сильно они тормозят Сильно сомневаюсь, что план тут влияет, тем более по справочникам - думаю, время его построения находится за разрядной сеткой. Яндексы-Хренадексы не вкурсе запроса "firebird разрядная сетка". Ладно, отложим понимание этого. Или подскажете со временем или... или Яндекс вспотеет в выходные. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 11:20 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
ДокAriochказалось бы... на самом деле в некоторых условиях такая транзакция тоже течет ресурсами - например БЛОБами ты серьезно хотелось бы душераздирающих подробностей с адресами, фамилиями, явками ... конкретными воспроизводимыми примерами копай в обе стороны от 14633271 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 11:30 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogХм. Уже пинают. И это еще Di_LIne и Arioch спят... те выйдут вообще на ноль поделят ,проиндексируют и спишут как ненужную GTTешечку. щаззз стану я попусту индексировать то, что все равно под списание? а потом индексы еще чистить? так спишешься бе церемоний! :-P ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 11:38 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Arioch, если поделить ТСа на 0, то он в теории должен в бесконечность превратится ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 11:41 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Го-стхиdgdogэто справочники для заполнения PickList (dbgrideh) по полям. Срабатывает при реопене PfibDataset. Заметил, что сильно они тормозят Сильно сомневаюсь, что план тут влияет, тем более по справочникам - думаю, время его построения находится за разрядной сеткой. Просто я не могу описать все задачи. Отсюда конечно непонимание... Эти query еще срабатывают после Post в табличке. И пересобирают PickListы. Поэтому если уж залез бух править эту табличку, то вызываются эти запросы часто. Переписал, пересобрал. За одно нашел не проиндексированный справочник))) Чисто субъективно, все начало работать быстрее. Господа ээээ... НОРМАЛЬНЫЕ программисты, (одел каску, залажу под стол... ибо можете ведь и покалечить) PfibDataset.FetchALL это не по феншую??? Это зло? (110 тысяч записей выкидывает, да тормозит. Но они все прям позарез нужны бухгалтеру, "ВСЕ И СРАЗУ!") ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 11:41 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogГо-стхипропущено... Сильно сомневаюсь, что план тут влияет, тем более по справочникам - думаю, время его построения находится за разрядной сеткой. Яндексы-Хренадексы не вкурсе запроса "firebird разрядная сетка". Ладно, отложим Он имеет в виду, что сколько бы у тебя в запросе строк ВСЕГО не было - на экран влезет несколько десятков, в память подтянется (чтобы быть под руками заранее) может быть еще пара сотен. И всё. Остальные данные как правило гриду не нужны, пока юзер не прокрутит его сильно-сильно вниз (что в 90% случаев не делается, люди не читают строки тысячами как правило, а уточняют отбор) Исключение - если ты например в гриде включил какие-нибудь навороты типа "показывать общее количество строк" - тогда да, пока всю выборку до конца не вычитает, рисоваться не начнёт. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 11:42 |
|
|
start [/forum/topic.php?fid=40&msg=39280950&tid=1561790]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 151ms |
0 / 0 |