Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

Открыть новую тему     Написать ответ в эту тему

AlexPetrovich

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover
Чего-то ты какую-то ахинею пишешь...

Цитата:
Например 3 автоинкремента на одну таблицу - зачем это может понадобиться?

Да хоть 10. Это определяет разработчик в зависимости от решаемой задачи.

Цитата:
Так вот почему автоинкрементное поле не индексируется изначально?

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

Цитата:
Пользуватели пишут очень сложный математический SQL запрос который работает медленно потому что сервер вынужден делать за программиста предположения об использовании индекса.

А с какого перепугу "пользователи" пишут SQL-запросы ??  Дело пользователя кнопочки нажимать, а запросы должен составлять, отлаживать и оптимизировать разаработчик.
Сервер не делает предположений об использовании индекса - в зависимости от запроса он выбирает "оптимальный" план запроса.  Если разработчика не устраивает полученный результат (скорость или еще чего) - значит надо модифицировать запрос, добавить (или убрать) индексы, модифицировать структуру БД.

Цитата:
Масса примеров когда сервер неспособен вычленить из SQL запроса обязательное условие - мастер детейл, который сократит операцию по времени в 100 раз. В интербейзе 2 способа - писать OrderBy или Plan, но оба способа совершенно не подходят. OrderBy - теряет реальную последовательность, Plan - не вычленяет главного условия как мастер-детейл.  

Вообще муть какая-то... Сервер ничего не "вычленяет".  Для мастер-детейл связок учитесь писать правильные запросы с использованием JOIN, FK и PK.
OrderBy задает всего лишь сортировку, причем сдесь мастер-детейл ?
"теряет реальную последовательность," - реальная последовательность это какая ?? Порядок хранения и извлечения данных в/из БД НЕ ОПРЕДЕЛЕН, т.е. идет вперемешку, если нжно упорядочивание - используйте "Order By"

Цитата:
пользователи ущербны - либо SQL как язык запросов, не обеспечивающий требуемого быстродействия

либо неграмотный разработчик...

Цитата:
Я бы расширил SQL язык

Вообще-то это стандарт, и практически всех устраивает. Слава Богу, что вы далеки от разработчиков этого стандарта...
 
ВЫВОД - RTFM!    (Перед тем, как писать всякую муть на уважаемых ресурсах).

Всего записей: 87 | Зарегистр. 08-05-2003 | Отправлено: 14:08 10-05-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexPetrovich
О, я люблю пошутить за это злюсь конечно на себя, но на этом вся ваша правота заканчивается. В ПМ могу скинуть ссылку на БД полностью в исходниках. По этому я смелюсь утверждать что знаю про что пишу не из теории...
 

Цитата:
Да хоть 10. Это определяет разработчик в зависимости от решаемой задачи.  

Как разработчику мне ни разу не понадобилось в течении 20-и лет эта возможность.  
 

Цитата:
Потому что сервер не должен "додумывать" за разработчика и заниматься "самодеятельностью".  

То есть обязан лениться из принципа и быть далёким от реально возможной оптимизации.
 

Цитата:
А с какого перепугу "пользователи" пишут SQL-запросы ??

Пользователей сервера можно назвать пользователями, пользователей моего по тоже можно назвать пользователями, тем не менее я пользователь сервера и не стесняюсь этого. У меня сейчас планирование собственного сервера и SQL как стандарт заранее не устраивает - тут подробнее.
 
OnWhere - выполняет фильтрацию. OnJoin - выполняет добавление полей в выборку. Насколько знаю - сильно не бейте, сначала выполняется приджойнивание (условия джойна) а потом условия where - это справедливо для того чтобы в условиях могли присутствовать поля из всех таблиц запроса. Однако.
 
Та база пока что не сервер. И я смотрю как реализован Selet. О чудо OnWhere выполняется до OnJoin. Я понимаю автора - в клиентской базе все данные все таблицы уже доступны в OnWhere и нет просто смысла выполнять Join данных до выполнения Join условий которые доступны в событии OnWhere... Выборка мастер детейла на двух таблицах с тремя миллионами делается в миллисекунду. Это происходит за счёт того что в первую очередь выбирается правильный индекс. То есть - берётся индекс который высчитан по условию либо больше либо меньше либо если равно то либо больше либо меньше реальный RecNo. И вся выборка первично идёт из локейта на первую позицию по условию потом чтение пока условие true.  
 
!!! Так вот когда я могу вычленить это условие из запроса Я могу делать выборку за одну миллисекунду на трёхмиллионных таблицах и далее делать дополнительную фильтрацию дубляж джойнами и условиями конечной фильтрации. И даже больше если вы дадите запрос groupBy я его интелектуально как девелопер разберу и выполню на тех же данных что и FB сервер в сотню раз быстрее, потому что именно вычленю оптимальное условие.
 

Цитата:
Вообще-то это стандарт, и практически всех устраивает. Слава Богу, что вы далеки от разработчиков этого стандарта...  

Вы косо читали впереди я писал - сервер FB в посте выше был запрос делает 2 раза чтение в трёхмиллионных таблицах выбрав не те индексы. И он это делает когда я заранее знаю что он ничего не вернёт. Я пишу ПО далее отдаю в техподдержку которая его полгода мучает - отдает мне, после релиза мучается сама. Мои попытки реорганизовать в запросах план запроса не дали необходимых мне результатов, если вы внимательно читали что я пишу то понимаете почему - Join по 3 миллионам всегда идёт раньше чем первичное условие мастер-детайл.  
 
ВЫВОД - Не кипятитесь теоретики, на уважаемых ресурсах. Я могу выложить все данные все ссылки все цыферки сравнения. Напишу инструкцию на русском как запустить и Вы никогда в жизни не добётесь этих же результатов на стандартном SQL    (Перед тем, как писать всякую муть на уважаемых ресурсах, славо богу если научитесь так же уважать себя). Я про экономию электроэнергии. Почему на уважаемом ресурсе не уважают экономию энергии тупо простаивающих компов?
 
ps
Девелопер не бог, всего учесть не может даже за полгода - результат еле ворочающиеся программы и безполезный в этом случае SQL, который можно было бы оптимизировать в 100 раз, абсолютно уверен.
 
 
Добавлено:


И В ПЕРВУЮ ОЧЕРЕДЬ SQL не устраивает из того принципа что сервер не должен делать предположений.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 15:43 10-05-2012 | Исправлено: delover, 01:29 27-07-2012
AlexPetrovich

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover
Извините, но я категорически не понимаю ваш поток сознания...
Удачи вам в разработке собственного SQL
 
Добавлено:
После просмотра ваших ссылок я вроде понял о чем вы...
То, что на локальной машине можно произвести выборку из локальных данных быстрее, чем это сделает SQL-сервер ?  В это верю конечно. И изредка такой подход оправдан.
НО!  Это имеет смысл только в очень узко применимых задачах, когда стандартные методы не работают.
Потому как теряется многопользовательская работа, транзакции, и проч.
 
Если вы уверены, что вашу задачу можно решить только так - ну что ж, вы разработчик, вам виднее.
 
Но это совсем не значит, что SQL-стандарт "плохой" и сервера БД "плохие".
Просто их тоже надо уметь использовать.
У меня в БД таблицы по 10 млн записей и все летает...

Всего записей: 87 | Зарегистр. 08-05-2003 | Отправлено: 15:57 10-05-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexPetrovich

Цитата:
У меня в БД таблицы по 10 млн записей и все летает...

Почемуто я уверен что изначально Вы были разработчиком этого ПО. По этой причине всё летает. Я не прав? ) У меня обратная ситуация - я не разрабатывал ПО, я его обезглючиваю и оптимизирую. Рад что Вы увидели про что я писал, так как всю соль вы можете увидеть под отдалчиком в методе Select.
 

Цитата:
Но это совсем не значит, что SQL-стандарт "плохой" и сервера БД "плохие".  

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

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 16:31 10-05-2012 | Исправлено: delover, 07:06 11-05-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уже в join запихивал условие даже OR убрал везде. Шаманю бестолку.
 
добавлено
под конец дня полностью разочаровался в своей идее. По крайней мере FireBird тут вряд ли оптимизируешь. У меня выигрыш был в миллисекундах на фоне двух секунд. Это было после того как выяснилось что селект идёт не на прямую из процедуры а именно в селект запросе с ордербай по апперкейс имени. Потом это скармливается гридине у которой уже стоит сортировка - она сортирует по другому. Потом Filtered := false когда он и так false. Потом блок который востанавливает сортирувку в других гридинах где это нужно востановить, то есть сортируется ещё раз. И потом видимо компоненты поменялись, потом считываются установки из реестра и сортируется ещё раз. То есть вместо 30 секунд стало делать за 9 секунд. Ну и я забил уже на миллисекунды.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 07:18 11-05-2012 | Исправлено: delover, 13:32 11-05-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору


Фраза - поток сознания происходит из того что некий индивидуум может пьян а может ослеплён мыслью, но он не может донести - доказать... Говорит всё понятно но мысли то нет или не видно. В языке обывателей это выражение можно заменить на равнозначное - "не грузи меня". В сознании обывателя, - если сразу не понятно то это поток сознания. Теряется привкус того что это сказано к месту. Рекоммендяция не использовать.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 19:49 12-05-2012 | Исправлено: delover, 21:35 12-05-2012
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover, хватит уже разорятся. ИТ зашли в тупик, впрочем как и всё остальное. Прогресса не будет, эксплуатируй то что есть.
 
Добавлено:

Цитата:
под конец дня полностью разочаровался в своей идее
Период внедрений кончился, пошёл процесс эксплуатации )))
Отсюда разрыв шаблонов - на внедрении срубают бабки, за эксплуатацию никто не платит.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 23:47 12-05-2012 | Исправлено: AlexCoRu, 23:53 12-05-2012
SevereK20

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может не совсем в тему.. Есть ли у кого-нибудь исходники программ на delphi, илюстрирующие работу с FB базой...

Всего записей: 7699 | Зарегистр. 07-05-2010 | Отправлено: 23:56 12-05-2012
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Есть ли у кого-нибудь исходники программ на delphi, илюстрирующие работу с FB базой


Цитата:
селект идёт не на прямую из процедуры а именно в селект запросе с ордербай по апперкейс имени. Потом это скармливается гридине у которой уже стоит сортировка - она сортирует по другому. Потом Filtered := false когда он и так false. Потом блок который востанавливает сортирувку в других гридинах где это нужно востановить, то есть сортируется ещё раз. И потом видимо компоненты поменялись, потом считываются установки из реестра и сортируется ещё раз.

Как-то так )))
 
Добавлено:
SevereK20, если серьёзно то Всего-то хотелось иметь несколько независимых курсоров на один набор данных
 
Добавлено:
Как вам нравится из справки QuantumGrid
Цитата:
In Grid mode, the data controller's performance is better, but features such as automatic sorting, filtering and summary calculations are disabled. You have to write appropriate event handlers (OnSortingChanged, Filter.OnBeforeChange, OnAfterSummary) to perform these actions.
И сразу же, мордой об стену
Цитата:
Grid mode is automatically switched off when grouping is applied to a grid view.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 00:11 13-05-2012 | Исправлено: AlexCoRu, 00:39 13-05-2012
SevereK20

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexCoRu
не понял....
я имел ввиду исходник программы, илюстрирующей общую работу с фб базой - учет многопользовательской работы и других аспектов.

Всего записей: 7699 | Зарегистр. 07-05-2010 | Отправлено: 01:42 13-05-2012
AlexPetrovich

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SevereK20
Зависит от компонентов какими будешь пользоваться.
Обычно с компонентами идет папка Demo с примерами.
 
И советую сходить сюда - http://ibase.ru/  раздел "Документация и статьи"
 

Всего записей: 87 | Зарегистр. 08-05-2003 | Отправлено: 13:30 14-05-2012
SevereK20

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexPetrovich
FIBPlus... читал книги... но сухо как-то - хотелось бы посмотреть на работающую систему, а не рассматривать урывки. В папках демо примеры по работе с отдельными компонентами.

Всего записей: 7699 | Зарегистр. 07-05-2010 | Отправлено: 15:09 14-05-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SevereK20
Вы очень уместно спросили. Я Вам предложу следующее. Я не представляю себе работы без IBExpert.
1) Копируем IBExpert и создаём базу test. Там можно переключить интерфейс на русский язык.
2) Накатываем на созданную базу следующий скрипт CTRL+F12.
Подробнее...
 
3) Открываем NEW_PROCEDURE и выполняем. Выполняется достаточно долго для 5 миллионов - 3 минуты.
 
4) Выполним на базе селект
select * from table1 t
where t.parent_id between 5 and 5 and
- результат эксперта 0 миллисекунд и 1 запись.
 
5) Выполним на базе селект
select * from table1 t
where t.grade_id between 1000005 and 1000005
- результат эксперта 0 миллисекунд и 1 запись та же самая.
 
6) Выполним на базе селект
select * from table1 t
where t.parent_id between 5 and 5 and
  t.grade_id between 0 and 3000000
- хоть как оптимизируйте уже 100 миллисекунд. И вот сдесь начинается Delphi.  
 
Вывод  
Проделайте это чтобы убедится в моей фразе - "В 100 раз быстрее".
 
AlexCoRu

Цитата:
delover, хватит уже разорятся. ИТ зашли в тупик,

В такой тупик что им говорят - вы в 100 раз быстрее можете, а они отвечают - мы умнее.
 
 
 
 
 
Добавлено:
ps
Чтоб вообще без кривотолков, я не хочу чтоб мне премию дали даже нобелевскую, я хочу чтоб быстрее работали. Не надо на меня злиться - этот текст читает узкий круг специалистов. И в своей идее я разочаровался и писал чтоб совесть чиста и не хочу революций (солнце втало солнце светит нехай светит).

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 18:33 15-05-2012 | Исправлено: delover, 19:23 15-05-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору


Ну тогда я сделаю between. Есть ещё одно неприятное качество SQL, которое можно увидеть пройдя первый вопрос. - Среди приджойненных индексов, импровизация, вдруг будет именно в одной записи взаимоисключающее условие и оно не будет просчитываться полностью, будет оптимизировано в момент компиляции, хотя бы одно условие.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 21:23 15-05-2012
SevereK20

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover
в том-то и дело, что я прошу пример проги на делфи для того чтобы увидеть как с клиентского приложения происходит работа с базой данных. как правильнее использовать блокировки, транзакции и прочее. именно их применение из клиентских приложений, а не теория.

Всего записей: 7699 | Зарегистр. 07-05-2010 | Отправлено: 22:17 15-05-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SevereK20
Про транзакции - их две на чтение и на запись. Про блокировки в одной программе я работал там 2 года мы использовали блокировки везде. В другой программе 2 года там блокировок нигде не использовалось. Обе программы замечательны, но написаны по разному, так что я не скажу как правильно будет, это зависит от стиля программирования, который вы выберете. Прочее - например Алертеры, то же что с блокировками - всё зависит от стиля и постановки работы пользователей в вашем приложении. Блокировки можно заменить на 1 дополнительное поле в таблице. Алертеры можно заменить на один единственный сервер-порт прописанный в таблице настроек. Транзакции лучше 2, но это тоже от стиля зависит - есть стиль вообще без транзакций.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 07:37 16-05-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexCoRu

Цитата:
Отсюда разрыв шаблонов - на внедрении срубают бабки, за эксплуатацию никто не платит.

Я вернусь к моему примеру и оптимизации запроса. В процессе эксплуатирования - тестирования, всё же мой запрос смогли оптимизировать. Отсюда не желание платить за то что всё равно рано или позно будет сделано.

Код:
 
select Tab1.* from
  (select * from table1 t1
   where t1.parent_id between 5 and 5) Tab1
join
  (select * from table1 t2
   where t2.grade_id between 1 and 3000000) Tab2
   on tab1.id = tab2.id
PLAN JOIN (TAB1 T1 INDEX (TABLE1_IDX2), TAB2 T2 INDEX (PK_TABLE1))
 

Именно для этого запроса необходимо обязательно прописывать план индексов, так как после перекомпиляции индексов непрописанный план может составляться по другому и тогда запрос будет уже не 0 миллисекунд а 18 секунд. Можно закомментировать план посмотреть как запрос ведёт себя до компиляции индексов и после. В процессе эксплуатации сервера, sql программисты узнают очень много нового о сервере такого что даже сложно понять почему так происходит.
 
Добавлено:
Так вот чтобы всего лишь задать первичную фильтрацию для FB нужно:
1) Один простой подселект превратить в 3 селекта
2) Обязательно подобрать правильный план индексов.
3) придумать 4 алиаса вместо одного  
 
Итого
Всё это делается для того чтобы оператор and был использован правильно.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 08:17 17-05-2012
AlexPetrovich

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover

Цитата:
6) Выполним на базе селект  
 select * from table1 t  
 where t.parent_id between 5 and 5 and  
   t.grade_id between 0 and 3000000  
 - хоть как оптимизируйте уже 100 миллисекунд.

 
И что ?  
Это сильно принципиально ?  Юзер сможет заметить разницу 1 и 100 мс ?
 
И вообще SQL и СУБД - это универсальный инструмент, который предназначен для решения общих задач.
Да FB  не идеален, там нет например кластерных индексов, и оптимизатор изредка тупит и выбирает не самый оптимальный план. Но для этого и существует разработчик, который знает что у него за данные и как они распределены.
 
Конечно, каждый конкретный случай можно разложить по полочкам и оптимизировать.
Но стоит ли оно того? Оптимизировать нужно только то, что реально необходимо, а не все подряд.
 
Вот что вам даст ускорение одного запроса с 100 до 1 мс ?
 
 
Приведите пример реальной задачи где это нужно, а не сферического коня в вакууме.

Всего записей: 87 | Зарегистр. 08-05-2003 | Отправлено: 12:38 17-05-2012
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Вот что вам даст ускорение одного запроса с 100 до 1 мс ?

 
когда этот проверяется на 1000 записях, то оно понятно, что разницы нет, но когда таблица вырастает до 100 тыщ или мульёна.... то разница уже сильно заметна и тогда приходится выполнять редизайн приложения.

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 12:49 17-05-2012
AlexPetrovich

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
X11

Цитата:
когда этот проверяется на 1000 записях, то оно понятно, что разницы нет, но когда таблица вырастает до 100 тыщ или мульёна....

 
Опять про сферического коня...  Пример реальной задачи где ?
 
К тому же этот запрос как раз и работает с таблицей в которой 5 000 000 записей и ее размер ~350 МБ.
 
По моему 100 мс - не так и плохо.
 
Добавлено:
delover

Цитата:
 Выполним на базе селект  
 select * from table1 t  
 where t.parent_id between 5 and 5 and  
   t.grade_id between 0 and 3000000  
 - хоть как оптимизируйте уже 100 миллисекунд.  

 
И кстати - откройте для себя хинты.
 
"Оптимизируем" немного этот запрос:
 select * from table1 t  
 where t.parent_id between 5 and 5 and  
   t.grade_id+0 between 0 and 3000000  
 
И "внезапно" - он выполняется за 0 мс
 
Можно просто к исходному запросу приписать план
PLAN (T INDEX (TABLE1_IDX2))  
Эффект тот же.
 
И не нужно переписывать в 3 сджойниных подзапроса...

Всего записей: 87 | Зарегистр. 08-05-2003 | Отправлено: 13:22 17-05-2012 | Исправлено: AlexPetrovich, 13:32 17-05-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru