Касательно запроса и таблицы

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Dinya
Сообщения: 15
Зарегистрирован: 24 мар 2005, 18:48

Касательно запроса и таблицы

Сообщение Dinya » 25 мар 2005, 17:29

Здравствуйте, почтенная публика! :)
У меня вот такой вопрос: во есть допустим у меня несколько таблиц каждая в среднем по 100 000, а одна из них на 800 000 записей. :(

Вот скажите, при создании представления, выбирающего из этой табл. и из других значения, можно ли выводить отобранные записи по-странично или как-нить еще чтобы не сидеть не скучать, не ждать...
И еще, как мне повысить скорость обработки запроса, одновременно не переполнить базу лишними индесами? (база находится на сервере)
Спасибо за внимание. :oops: :)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: Касательно запроса и таблицы

Сообщение Merlin » 25 мар 2005, 17:40

Dinya писал(а): У меня вот такой вопрос: во есть допустим у меня несколько таблиц каждая в среднем по 100 000, а одна из них на 800 000 записей. :(
Не расстраивайся так, подрастёт когда-нибудь.
Dinya писал(а): Вот скажите, при создании представления, выбирающего из этой табл. и из других значения, можно ли выводить отобранные записи по-странично или как-нить еще чтобы не сидеть не скучать, не ждать...
Помедитируй о слове Where. И об них, об индексах.
Dinya писал(а): И еще, как мне повысить скорость обработки запроса, одновременно не переполнить базу лишними индесами?
Сделать полезные индексы. Не делать лишних индексов.
Dinya писал(а): (база находится на сервере)
Да ты що?!!!!

Dinya
Сообщения: 15
Зарегистрирован: 24 мар 2005, 18:48

Сообщение Dinya » 25 мар 2005, 18:18

тов. Мерлин! я конечно понимаю, что танцы с бубном - не профессия, а призвание, но ничего серьезного я в вашем ответе не услышал!
Если честно, мне не до смеха, мне за эту базу вставляют что она не работает, а если и работает, то очень медленно!!!
Так что, извините, вы - бесчуственный ХАМ!
Прошу вас впредь так не поступать, а проявить участие и помочь с этой колизией!
С уважением, бесконечно ваш Dinya

Dinya
Сообщения: 15
Зарегистрирован: 24 мар 2005, 18:48

Сообщение Dinya » 25 мар 2005, 18:44

Еще раз здрасьте!
Я совсем недавно на IB и поэтому спрашиваю: вот скажите, как результаты представления (вьюшки) занести в таблицу?
Понятно что есть команда CREATE TABLE, но что писать в полях созд-мой табл. если, допустим не точно знаешь какой размер поля типа varchar использовался изначально? Не хотелось чтобы обрезались вставляемые записи в этих полях! :cry:
Что, предположительно ставить varchar (100)?
Спасибо за внимание! :P

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 25 мар 2005, 19:39

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

DSKalugin
Сообщения: 212
Зарегистрирован: 27 окт 2004, 13:39

Re: Касательно запроса и таблицы

Сообщение DSKalugin » 25 мар 2005, 21:30

Dinya писал(а):можно ли выводить отобранные записи по-странично
Select first 100 skip 200 * from table where ...
пропустить 200 строк а дальше выбрать 100 штук
вот тебе и постраничность
Запрос работает с параметрами и выражениями
Dinya писал(а): или как-нить еще чтобы не сидеть не скучать, не ждать...
можно пойти в бухгалтерский отдел, с девочками чяйку попить.
Или по порносайтам пошарить. Че скучать то?
Если серьезно, то тебе надо везде где только возможно использовать компоненты Query вместо Table и указать FetchAll=False
везде где это всречается
Dinya писал(а): И еще, как мне повысить скорость обработки запроса, одновременно не переполнить базу лишними индесами?
делать их только по тем полям, которые нужны для сортировки и фильтрации в order by ... и where ... соответственно
Таблицы-справочники должны быть обязательно проиндексированы по ключу
Стараться избегать внешних объединений в запросах...

Для начала, думаю, достаточно информации
[/b]

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: Касательно запроса и таблицы

Сообщение Merlin » 25 мар 2005, 22:17

DSKalugin писал(а):
Dinya писал(а):можно ли выводить отобранные записи по-странично
Select first 100 skip 200 * from table where ...
пропустить 200 строк а дальше выбрать 100 штук
вот тебе и постраничность
Ну-ну. Советовать надо аккуратно. Тут на днях один мыслитель "багу" зарегистрировал аж в тракере:

SELECT FIRST 10 SKIP 0 * FROM TABLE;
it lasts about 3-10ms. When making query like this:
SELECT FIRST 10 SKIP 450000 * FROM TABLE;
it lasts about 300-500ms.

У него и так похоже запрос тормозной, а ты ему советуешь его 100 раз выполнить "постранично" с нарастающими тормозами на фетче в скипе? Бесчувственный ты :lol:
DSKalugin писал(а): Если серьезно, то тебе надо везде где только возможно использовать компоненты Query вместо Table и указать FetchAll=False
везде где это всречается
Если серьёзно, то в первую голову надо конструировать запросы. Создавая под основные индексы с хорошей селективностью и следя за их использованием оптимизатором. Насчёт Fetchall=False - это сильно поможет в случае сортировки гигантской выборки натуралом? Конструирование таблиц пока отложим, но чует моё сердце, что в данном случае собака там тоже основательно порылась.
DSKalugin писал(а): Стараться избегать внешних объединений в запросах...
Ты явно не умеешь их готовить.

DSKalugin
Сообщения: 212
Зарегистрирован: 27 окт 2004, 13:39

Сообщение DSKalugin » 26 мар 2005, 11:29

>Merlin
Откуда ко мне такое пристальное внимание?
Мы вопрос обсуждать будем или мой ответ?

По крайней мере я дал человеку ответы на его вопросы, а не просто посмеялся над его уровнем познаний. Все мы когда-то с чего-то начинали. Это нормально.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 26 мар 2005, 15:39

DSKalugin писал(а): Откуда ко мне такое пристальное внимание?
Про клятву Гиппократа слышал? "Не навреди"? Так ты её прямо только что нарушил с "постраничностью". Этой фичей следует начинать баловаться только когда знаешь как оно работает, что выиграешь с ней, что проиграешь на каком запросе. А не пытаться заместить ей оптимизацию запросов и структур, будет только хуже. Остальные советы главным образом из серии "мойте руки перед едой". Ты в телепатический локатор увидел, что он юзает TTable и усиленно делает fetchall? Кстати, именно и, по-моему, только TTable имеет интересные особенности, дающме очень серьёзный выигрыш при прыжках по длинной таблице из конца в конец. Не путать с TIBTable. И вот, вместо того, чтоб расти над собой в плане понимания что он делает и писания хороших запросов, начнёт он сейчас с твоей подачи тратить время на "поиски правильных компонентов" и возню с fetchall, который и так везде false по умолчанию.
DSKalugin писал(а): Мы вопрос обсуждать будем или мой ответ?
А где вопрос-то? Его же нету. "Как мне писать запросы, работающие быстро, и не писать работающие медленно". Отвечать в виде монографии будем? Или эссе?
DSKalugin писал(а): По крайней мере я дал человеку ответы на его вопросы,
Да ну? А мне показалось, что ты в очередной раз огласил некоторый личный опыт, слабо связанный с затруднениями вопрошающего.
DSKalugin писал(а): а не просто посмеялся над его уровнем познаний. Все мы когда-то с чего-то начинали. Это нормально.
Это действительно нормально. И мне накласть на его и вообще любого вопрошающего уровень познаний. А смех, уже даже раздражительный, вызывает неспособность поставить вопрос, а не уровень познаний. Потому что это массовое явление уже достало. Для того, чтобы ему помочь начать думать в правильную сторону, нужно сутки из него клещами тащить сам запрос, план, применяемый оптимизатором при его выполнении, метаданные таблиц, статистику индексов. И тогда уже можно на примере этого запроса объяснить что такое хорошо и что такое плохо и почему. Хочешь ему действительно помочь - воружайся клешами и приступай. Я уже бессердечный, или как там, мне влом. Если добьёшь его до того момента, когда над ним можно начинать работать - я может и помогу, если будет время. Мне, знаешь ли, тоже время от времени вставляют за что-нибудь. И kdv поможет. И ещё кто-нибудь.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 28 мар 2005, 09:47

У меня вот такой вопрос: во есть допустим у меня несколько таблиц каждая в среднем по 100 000, а одна из них на 800 000 записей.
От этого еще никто не умирал. :)
Путей решения несколько
1. скачать тузлу ИБЭксперт, скормить ему твой тормозной запрос, потом вдумчиво смотреть на вкладку 'plan' и 'perfomance', опосля, подумамши добавитиь много хороших индексов, чтоб нониндекседрид было поменьше.
2. Если п1 не дал результатов, то качаем мускулы железу ака пара шустрых камней, размер ОЗУ не меньше размера БД и сказевый рэйд.
3. если п2 не помог, то перенимай опыт лифтостроителей, когда американцы понастроили свойх небоскребов, встал вопрос скоростных лифтов, но лифт не может ехать со сверхзвуковой скоростью, ну и ладно вешаем рядом большое зеркало, пущщай дамы в него глазеют на себя любимых, почему-то лифты вдруг стали ездить куда быстрее :D
4. Если насилия избежать не удается, расслабьтесь и попробуйте получить удовольствие. Моя напарница, например, время от времени сожалеет, что компы стали такие быстрые, то бывало запустишь формирование и можно вздремнуть на диванчике припрятаном за высокими спинами ЕЭСок. Я вот правда в боевом режиме ЕЭСок не застал, возрастом не вышел :D

О, как загнул :lol:

Коллеги, и Шо вы так из-за РТФМа завелись? спокойней :)

Dinya
Сообщения: 15
Зарегистрирован: 24 мар 2005, 18:48

Сообщение Dinya » 28 мар 2005, 10:13

Здрасьте, Мерлин! Здрасьте, DVKalugin!
Спасибо за такой всеобъемлющий диспут на мою скромную тему!
Я работаю в IBExpert, а не в Делфях или еще в какой визуал-среде.

Касательно самого запроса.
SELECT AL.PART, AL.NAIMENOVAN, AL.PRODUCER, AL.GEN,
CLIENTS.MANAGER, CLIENTS.REGION, CLIENTS.CITY,
JURMAT."ppol", JURMAT."nomnu",
"GetYear"(jurmat.dat) as god , "WeekOfYear"(jurmat.dat) as num_week,
sum(jurmat."kol"),
sum(jurmat."sale_price")
FROM AL
RIGHT OUTER JOIN JURMAT ON (AL.INV = JURMAT."nomnu")
LEFT OUTER JOIN CLIENTS ON (JURMAT."ppol" = CLIENTS.PSEVDONIMK)
where jurmat."ndoc"='Íàêëàäíàÿ' and jurmat."mscet"='21'

group by AL.PART, AL.NAIMENOVAN, AL.PRODUCER, AL.GEN, CLIENTS.MANAGER,
CLIENTS.REGION, CLIENTS.CITY, JURMAT."ppol", JURMAT."nomnu" ,
"GetYear"(jurmat.dat), "WeekOfYear"(jurmat.dat)
;

"GetYear" и "WeekOfYear" - UDF-функции, написанные нашим программистом, возвращающие значения года и номера недели года. Конечно, есть свои функ. типа "EXTRACT (YEAR/MONTH FROM <table_name>) AS <ИМЯ ПСЕВДОНИМА>". но в тексте создания представления
CREATE VIEW AL_JUR_CL(
"part",
"naimenovan",
"producer",
"gen",
"manager",
"region",
"city",
"ppol",
"nomnu",
"god",
"num_week",
"kol",
"su")
AS
SELECT AL.PART, AL.NAIMENOVAN, AL.PRODUCER, AL.GEN,
CLIENTS.MANAGER, CLIENTS.REGION, CLIENTS.CITY,
JURMAT."ppol", JURMAT."nomnu",
"GetYear"(jurmat.dat) as god , "WeekOfYear"(jurmat.dat) as num_week,
sum(jurmat."kol"),
sum(jurmat."sale_price")
FROM AL
RIGHT OUTER JOIN JURMAT ON (AL.INV = JURMAT."nomnu")
LEFT OUTER JOIN CLIENTS ON (JURMAT."ppol" = CLIENTS.PSEVDONIMK)
where jurmat."ndoc"='Накладная' and jurmat."mscet"='21'

group by AL.PART, AL.NAIMENOVAN, AL.PRODUCER, AL.GEN, CLIENTS.MANAGER,
CLIENTS.REGION, CLIENTS.CITY, JURMAT."ppol", JURMAT."nomnu" ,
"GetYear"(jurmat.dat), "WeekOfYear"(jurmat.dat)
;
они почему то не работают...
Вот, честно, не знаю с чем это связанно, может IBExpert кривоватый. но это факт... Отдельно все компилируется и выполняется, но совместно с телом создания представления не фурычит. :cry:

Индексы я поставил на поля:
табл. AL - INV, PART
табл. CLIENTS - PSEVDONIMK
табл. JURMAT - DAT, NOMNU

План:
PLAN SORT (JOIN (JOIN (JURMAT NATURAL,AL INDEX (_IDX3)),CLIENTS INDEX (CLIENTS_IDX1)))

вот...
В принципе, все работает... но очень медленно, о-о-о-о-о-очень!

Поэтому у меня еще вот каукие вопросы:
1. Нет ли на ваш почтенный и умудренный (бесчуственный :wink: ) взгляд лишних индексов, притормаживающих выполнение запроса?
2. Считаете ли вы что с моим IBExpert'ом что-то неладное или можно забить на эту фигню?
Однако, иногда приходится прибегать к помощи нашего штатного программиста. Он в основном работатет под ORACLE, но и на IB он тоже многое сделал... Так вот, на его машине все работает очень быстро и почти что идеально... Но при попытке написания в моей версии IBExpert у него постоянно появляются непонятки по поводу того как мой IBExpert ведет себя в плане синтаксиса. Может дело все в том, что опция "Всегда приводить имена объектов к верхнему регистру" у него не помечена... :?

Вот, про статистику индексов чичас не могу написать, я не могу сейчас вспомнить где я ее видел. Я еще тока начинаю, так что до таких премудростей я еще не дошел.

А пока, откланиваюсь почтенно! Пишите если еще что надо рассказать!
С уважением, Dinya

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 28 мар 2005, 11:41

Я работаю в IBExpert, а не в Делфях или еще в какой визуал-среде.
А это как? разве ИБЭксперт может программу скомпилировать?...
group by AL.PART, AL.NAIMENOVAN, AL.PRODUCER, AL.GEN, CLIENTS.MANAGER,
CLIENTS.REGION, CLIENTS.CITY, JURMAT."ppol", JURMAT."nomnu" ,
"GetYear"(jurmat.dat), "WeekOfYear"(jurmat.dat)
За что ты его так жестоко? Ну нельзя же все в груп бай перечислять, немудрено, что тормоза...
Дай структру таблиц, участвующих выборке, глядишь сочиним селект :wink:
А нафига вьюху создаешь?

может IBExpert кривоватый
Так качни ласт стэбл и пользуй.

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 28 мар 2005, 11:54

Здравствуй, Dinya,
ну что могу сказать. Почему у тебя вьюха не создается с EXTRACT - хз, на 1.52 - все пучком, ты бы версию сервера указал штоли. Почему у твоего штатного программиста все летает - тоже хз, предположу, что у вас с ним сервера локальные, а его машинка помощнее твоей будет, или еще одно предположение, он волшебное слово знает, а ко всему прочему он бесчувственный и тебе его не выдает :(
Теперь по твоему запросу.
1. А нужны ли тебе OUTER вообще?
2. С кавычками в запросах завязывай, глаз рэжет.
3. "медленно, о-о-о-о-о-очень" - это скока?
4. На IBExpert греши в последнюю очередь.
На мой взгляд, тебе надо оптимизировать твой запрос.
Навыки оптимизации приходят с опытом, научить этому тяжело, но так как я не бесчувственный, попробую помочь тебе.
Попробуй к процессу оптимизации подойти творчески.
Перво-наперво, для себя определи допустимое время для твоего запроса, например, "это отчет, допустимое время работы до 3 минут", или "это запрос основной формы, используемой в оперативной работе, время работы критично, до 5 сек". А то может так сложиться, что даже выжав при оптимизации все что мона, в определенные тобой рамки ты не влезешь и придется схемы бд дорабатывать/перерабатывать.
Итак, что я вижу. Запрос по 3-м таблицам, JURMAT - основная, AL и CLIENTS приляпываются по OUTER, запрос выбирает всяческие текстовые поля из приляпанных таблиц и суммирует два поля JURMAT-а. Пойдем методом последовательного усложнения.
1. Пробуем

Код: Выделить всё

select sum(jurmat.kol), sum(jurmat.sale_price) 
from jurmat
where jurmat.ndoc='Накладная' and jurmat.mscet='21' 
что показывают приборы? Вписываемся в заданные рамки? Не вписываемся? Тогда пытаемся прикрутить индексы: создаем по ndoc (по хранению в полях-типах оперативных таблиц таких вот строк у меня есть свое частное мнение, но сейчас я его скромно сокрою) или по mscet или по обоим этим полям; выбираем оптимальный вариант, если вписались в рамки. Едем дальше.
2. Приляпываем еще одну таблицу. Например AL.
Делаем
select al."Первичный ключ",
sum(jurmat.kol), sum(jurmat.sale_price)
from jurmat [outer] join al on (....)
where jurmat.ndoc='Накладная' and jurmat.mscet='21'
group by 1
Приборы? Влезли в рамки? Едем дальше.
3. Приляпываем последнюю таблицу CLIENTS.
Делаем

Код: Выделить всё

select al."Первичный ключ",
       CLIENTS."Первичный ключ",
 sum(jurmat.kol), sum(jurmat.sale_price) 
from jurmat [outer] join al on (....)
 [outer] join CLIENTS on (....)
where jurmat.ndoc='Накладная' and jurmat.mscet='21' 
group by 1, 2
Приборы? Влезли в рамки? Влезли - ура, мы на финише.
4. Начинаем последовательно присандаливать недостающие поля,
по одному, каждый раз смотря на приборы. Если при окончательном
варианте с наличествованием всех желательных полей в рамки неожиданно не помещаемся, начинаем колдовать с подзапросами, но, надеюсь, до этого не дойдет.

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 28 мар 2005, 14:26

>sag
Респект, вот это ответ! :lol:

Dinya
Сообщения: 15
Зарегистрирован: 24 мар 2005, 18:48

Сообщение Dinya » 28 мар 2005, 14:42

Здрасьте все на сегодня еще раз!
Спешу высказать особую благодарность всем, кто участвует в обсуждении данной темы! :D Очень приятно!!!

sag, вот уж чего действительно не ожидал, так это того, что есть еще сочуствующие люди в наших селениях!!!! :lol:

Последовать пока вашему совету еще не успел... :oops: НО ничего, ваш труд зря не пропадет... После обеденного перерыва настрою приборы и тогда все будет!

Спасибо за содействие и подмогу тов. Ивану_Писаревскому! Радует такой дружеский подход к проблеме малоизвестного человека! :o

И еще раз всем спасибо, скорее всего вопросы еще появятся (особенно после обеда) и если можно, то я еще раз к вам обращусь!
Можно? :P

А пока, откланиваюсь, исчезаю! Очень скоро буду!
Dinya
8)

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 28 мар 2005, 14:57

Спасибо за содействие и подмогу тов. Ивану_Писаревскому! Радует такой дружеский подход к проблеме малоизвестного человека!
Болтовня одна покуда, ты б задал конкретный вопрос, глядишь и ответы были б интересные.

Dinya
Сообщения: 15
Зарегистрирован: 24 мар 2005, 18:48

Сообщение Dinya » 28 мар 2005, 15:56

sag!
настраиваю приборы:
- требуется время выполнения запроса в пределах минуты (а так - сколько руководитель устоит рядом), но не больше...

старт!
первая часть кода. Приборы:
"План
PLAN (JURMAT NATURAL)
Адаптированный план
PLAN (JURMAT NATURAL)"
Время: 3m 0s 570ms, но выполнилось....
в рамки отчета, я думаю, уложились! :?

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

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 28 мар 2005, 16:38

старт!
первая часть кода. Приборы:
"План
PLAN (JURMAT NATURAL)
Время: 3m 0s 570ms, но выполнилось....
Сейчас искал дочке слова мегапесни

Код: Выделить всё

Стоять на месте, на месте стоять,
Иначе рискуешь ничо не понять.
Так вот. Чтобы было полное взаимопонимание, давай определимся со следующим: что мы делаем - конечный запрос для отчета, или делаем запрос для вьюхи, которая потом будет использоваться во многих местах с наложением по верх ее, родимой, всяческих допwhereусловий. А сомнения меня гложут, так как ты про вью уже заикался ранее, и, на первый взгляд, запрос - это сбор каких-то сумм и атрибутов по каким-то документам, поэтому как-то напрашиваются условия по каким-то там датам (или периодам дат), а можа еще какие. Или "where jurmat.ndoc='Накладная' and jurmat.mscet='21'" - это окончательный вариант условия фильтра-отбора?

Dinya
Сообщения: 15
Зарегистрирован: 24 мар 2005, 18:48

Сообщение Dinya » 28 мар 2005, 16:54

sag! Еще раз приветик!

Ага! понял!
значит так, делается вьюха, но такая чтобы потом ее, родимую, можно было юзать :oops: и всячески модифицировать! 8)
вот...
{а сам цитируемый запрос - это запрос на создание представления без части CREATE view...
AS... }

и еще
where jurmat.ndoc='Накладная' and jurmat.mscet='21' - это основное условие сортировки, потом только остается присоединение...
просто потом еще это все закидывается во вьюху (которую создаем чичас), а потом она используется далее....

Вообщем-то, она у меня заработала, но понятно и невооруженному взгляду, т.е. моему, что перелопатить ее надо, дабы отрегулировать ее работут и скорость выполнения запроса.

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

Спасибо! Жду ответа! :)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 28 мар 2005, 17:16

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

Ответить