Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2012, 09:17   #1
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию Firebird и представления

Добрый день.
Проблема такая. Firebird 1.5. Как я уже писал в одном из постов, есть таблица с пол миллионом записей в которую нужно выполнить около 2-х тысяч сложных агрегатных запросов. Работает очень медленно или вообще виснет.

Попробовал сделать представление (view), выбрав из этой таблицы только нужные для дальнейших расчетов записи (отфильтровав их на нужную дату и т.п.). Получилось всего около 8-и тысяч записей. Делаю запросы в этот view. Все работает, но скорость доступа к view та же самая, что и к большой таблице.

Попробовал по другому... Создал реальную (временную) таблицу в БД с такой же структурой. Очищаю ее от старых записей, циклично добавляю в нее эти 8 тыс. записей и делаю эти 2 тыс. запросов . Весь расчет вместе с созданием временной таблицы занимает всего 5 секунд. Это меня вполне устраивает. Но совсем не нравится способ реалицации.

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

Чего я не понимаю? И что делаю не так? Почему запросы к view работают так медленно?
_SERGEYX_ вне форума Ответить с цитированием
Старый 21.02.2012, 11:26   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вьюшка каждый раз при обращение к ней делает запрос к физической таблице. Отсюда и проблемы. Гляньте в сторону индексов основной таблицы. Следует учитывать, что увеличение к-ва индексов замедляет редактирование
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.02.2012, 13:32   #3
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
Вьюшка каждый раз при обращение к ней делает запрос к физической таблице
Аватар, я так и думал. Спасибо
_SERGEYX_ вне форума Ответить с цитированием
Старый 21.02.2012, 15:32   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
делаю эти 2 тыс. запросов
Это какой-то расчет с итерациями? Может подход поменять и не дергать так агрессивно базу?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.02.2012, 18:50   #5
GoodDA
фрилансер
Форумчанин
 
Аватар для GoodDA
 
Регистрация: 18.07.2008
Сообщений: 107
По умолчанию

у меня похожая проблема была,
сделал часть агреганных действий в триггере,
за счет того что в триггере уже известна запись которая редактируется и ее не надо искать, работать стало быстрее на порядок
GoodDA вне форума Ответить с цитированием
Старый 21.02.2012, 23:47   #6
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
Это какой-то расчет с итерациями? Может подход поменять и не дергать так агрессивно базу?
Есть таблица "лицевые счета" оплат за квартиру, всего полмиллиона записей.
Нужно сделать отчет по домам (не квартирам, а именно домам).
1. Вытаскиваю distinct-ом все дома (а они лежат в связанной таблице "адреса", отсюда и JOIN появился...) без учета квартир за последний месяц (их получается около 2-х тысяч).
2. Циклом вытаскиваю данные для каждого дома.
Отчет делается всего лишь раз в месяц.
По другому, вроде, никак.

Можно, конечно, сразу при добавлении оплаты за квартиру определять какой это дом и плюсовать сумму к данному дому в какое-то поле или что-нибудь в этом роде... Но это пол программы надо переписать, что не есть для меня хорошо .

Последний раз редактировалось _SERGEYX_; 21.02.2012 в 23:50.
_SERGEYX_ вне форума Ответить с цитированием
Старый 21.02.2012, 23:57   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ладно. Вот выдернули во временную таблицу дома. Не вижу причин почему нельзя одним запросом выдернуть сразу всю сводную информацию по всем домам. Даже без этой временной таблицы. Покажите хоть примерную структуру таблиц и что получить нужно.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.02.2012, 00:22   #8
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
Ладно. Вот выдернули во временную таблицу дома
Не, не дома. Я не точно выразился. Во временную таблицу именно счета.

То есть добавляю во временную таблицу все счета, где (дата = за_последний_месяц) и (оплата > 0) и т.д. Получается всего лишь 8 тысяч записей счетов.

А потом циклично по таблице домов делаю запросы в эту временную таблицу.
(select sum(...) из счетов где (дом = дому) и т.д.).
_SERGEYX_ вне форума Ответить с цитированием
Старый 22.02.2012, 00:32   #9
GoodDA
фрилансер
Форумчанин
 
Аватар для GoodDA
 
Регистрация: 18.07.2008
Сообщений: 107
По умолчанию

Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
Можно, конечно, сразу при добавлении оплаты за квартиру определять какой это дом и плюсовать сумму к данному дому в какое-то поле или что-нибудь в этом роде... Но это пол программы надо переписать, что не есть для меня хорошо .
одну таблицу и триггер добавить, вроде немного
ну и сделать начальную "иницилизацию"

зато в любой момент потом можно сразу актуальные данные посмотреть
GoodDA вне форума Ответить с цитированием
Старый 22.02.2012, 00:35   #10
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Да, наверно, переписать придется много, я этой прогой всего 3-4 дня занимаюсь.
До меня ее кто-то писал явно на скорую руку... А в чужом коде разбираться, сами знаете... проще все с нуля написать.
_SERGEYX_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Представления в Visual FoxPro Studbgc Помощь студентам 0 27.12.2011 13:00
Форматы представления данных Alkagolik Помощь студентам 0 06.02.2011 18:54
представления в interbase Domanoff БД в Delphi 1 05.04.2010 18:43
форматы представления ссылок ТАНя K Microsoft Office Excel 1 16.10.2007 08:14