Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация базы данных, Может примеры есть  
V
    Опции темы
magikanin
Дата 6.5.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.4.2007

Репутация: 1
Всего: 1



Здравствуйте ! 
Я студент и у меня сейчас задание - создать из 4-5 таблиц базу данных и оптимизировать ее на 60 % .
Возможно кто то имеет ссылку или имеет примеры несложной оптимизации ? 
Заранее спасибо . 
PM MAIL   Вверх
Sqlninja
Дата 7.5.2007, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



надо создать 10 таблиц,  а потом 6 из них удалить. так вы оптимизируете storage на 60%.

на самом деле постановка задачи звучит очень бредово. хотел бы я посмотреть в однопиксельные глаза автора этого перла. а что надо оптимизировать? место на диске или чтоб имена полей покороче были?


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
ksnk
Дата 7.5.2007, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: нет
Всего: 386



Пример - легко! Вот база, используемая DDK chat'ом.
Код

#SKD101|chat|4|2007.05.07 09:35:21|15|9|1|5

DROP TABLE IF EXISTS `chat_banlist`;
CREATE TABLE `chat_banlist` (
  `id` int(11) NOT NULL auto_increment,
  `ip` varchar(15) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM /*!40101 DEFAULT CHARSET=cp1251 */;

DROP TABLE IF EXISTS `chat_messages`;
CREATE TABLE `chat_messages` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(50) NOT NULL default '',
  `time` int(50) NOT NULL default '0',
  `message` text NOT NULL,
  `private` int(1) NOT NULL default '0',
  `privateto` varchar(50) NOT NULL default '',
  `color` varchar(30) NOT NULL default 'Black',
  `postedbyadmin` int(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM /*!40101 DEFAULT CHARSET=cp1251 */;

DROP TABLE IF EXISTS `chat_onliners`;
CREATE TABLE `chat_onliners` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(50) NOT NULL default '',
  `user_isreg` int(1) NOT NULL default '0',
  `user_ip` varchar(15) NOT NULL default '0.0.0.0',
  `user_sid` varchar(255) NOT NULL default '',
  `user_isadmin` int(1) NOT NULL default '0',
  `user_ismoderator` int(1) NOT NULL default '0',
  `lastactivity` int(50) NOT NULL default '0',
  `user_status` varchar(10) NOT NULL default 'free',
  `user_ismuted` int(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM /*!40101 DEFAULT CHARSET=cp1251 */;

DROP TABLE IF EXISTS `chat_users`;
CREATE TABLE `chat_users` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(50) NOT NULL default '',
  `userpass` varchar(255) NOT NULL default '',
  `banned` int(1) NOT NULL default '0',
  `user_isadmin` int(1) NOT NULL default '0',
  `user_ismoderator` int(1) NOT NULL default '0',
  `bbcode_alowed` int(1) NOT NULL default '0',
  `mute_time` int(30) NOT NULL default '0',
  `mute_settime` varchar(30) NOT NULL default '0',
  `profile_pol` char(1) NOT NULL default '',
  `profile_land` varchar(50) NOT NULL default '',
  `profile_city` varchar(50) NOT NULL default '',
  `profile_homepage` varchar(150) NOT NULL default '',
  `profile_email` varchar(70) NOT NULL default '',
  `profile_icq` int(11) NOT NULL default '0',
  `profile_foto` varchar(150) NOT NULL default '',
  `profile_hobbys` varchar(150) NOT NULL default '',
  `profile_about` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM /*!40101 DEFAULT CHARSET=cp1251 */;


Если выкинуть из нее пересекающиеся поля, получатся те самые 40-60%.

P.S. Вообще-то это MySql проект, но для примера ввполне может подойти.


Это сообщение отредактировал(а) ksnk - 7.5.2007, 09:10


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
magikanin
Дата 8.5.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.4.2007

Репутация: 1
Всего: 1



Sqlninja, 

Возможно я не правильно выразился . Нужно с помощью хинтов , параметров при создании Oracle таблицы (типа index organized , pctfree , pctused)оптимизировать время исполнения самых часто исполняемых операций -  select'a и \ или inserta и\или update ( в зависимости от самых часто выполняемых операций ) 

Допустим с помощью хинта insert /*+ append */  мы скажем ускорим insert в 2 раза . Или изменив порядок joina в Select - быстрее выполняем данный запрос .

Oracle'a как такогого мы не изучали - а я выбрал предмет оптимизация баз данных oracle - поэтому немного сложновато . Возможно кто то имеет ссылку на подобный пример где создаеться база данных и оптимизируеться .

Спасибо за отклик !



ksnk, 

Спасибо ! Очень хорошая идея , создам базу чата !!
PM MAIL   Вверх
LSD
Дата 8.5.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(magikanin @  8.5.2007,  19:10 Найти цитируемый пост)
Oracle'a как такогого мы не изучали - а я выбрал предмет оптимизация баз данных oracle - поэтому немного сложновато .

Ахренеть smile 

Попробуй почитать эту книгу, и как-то перетащить примеры из нее в свою БД. Ну и Кайта, у него тоже были примеры оптимизации.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
magikanin
Дата 8.5.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.4.2007

Репутация: 1
Всего: 1



LSD

Спасибо большое ! Буду сидеть учиться ! smile 
PM MAIL   Вверх
DimW
Дата 10.5.2007, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(magikanin @  8.5.2007,  18:10 Найти цитируемый пост)
Допустим с помощью хинта insert /*+ append */  мы скажем ускорим insert в 2 раза .

1. не вовсех случаях это поможет, и не факт что в 2 раза!
2. за такие проделки админ бд имеет полное право тебя нагнуть (да грубо, но по другому это не лечится)  smile
только после согласования! smile 

Цитата(magikanin @  8.5.2007,  18:10 Найти цитируемый пост)
Нужно с помощью хинтов... 

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


Это сообщение отредактировал(а) DimW - 10.5.2007, 08:38
PM MAIL ICQ   Вверх
Sqlninja
Дата 10.5.2007, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



Цитата(DimW @  10.5.2007,  08:36 Найти цитируемый пост)
в остальных случаях при правельном построении индексов, при собранной статистике БД, CBO сам выберает наиболее оптимальный план запроса


Да ну? В запросе вида "select * from table" - может быть. В базе из 5 таблиц и 3 индексов - может быть, и то не 100%. В более сложных системах и запросах практически всегда остается место для дополнительного тюнинга.

CBO рассуждает просто - чем меньше cost - тем круче план. А вот нифига подобного. Например nested loops соединения по столбцам с уникальным индексом могут выполняться на порядок быстрее чем hash join, который оптимизатор выберет по умолчанию, так как cost у него в 10 раз меньше. Естественно, речь идет о частном случае. 

Так что собранная статистика еще не дает DBA права расслабляться. А уж тем более кого то там нагибать.

Это сообщение отредактировал(а) Sqlninja - 10.5.2007, 09:20


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
DimW
Дата 10.5.2007, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Sqlninja, ты меня не правельно понял, я не против хинтов, в некоторых с лучаях они действительно выручают!
я против бездумного использования их. 
я просто хочу сказать , что если magikanin поставили задачу оптимизировать с помощью хинтов то это не занчит что он должен обязательно их использовать.
 
Цитата(Sqlninja @  10.5.2007,  09:16 Найти цитируемый пост)
CBO рассуждает просто - чем меньше cost - тем круче план. А вот нифига подобного.

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

PM MAIL ICQ   Вверх
magikanin
Дата 10.5.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.4.2007

Репутация: 1
Всего: 1





DimW, 

Просто есть задание - его надо хоть как то сделать smile
PM MAIL   Вверх
DimW
Дата 11.5.2007, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(magikanin @  10.5.2007,  16:05 Найти цитируемый пост)
Просто есть задание - его надо хоть как то сделать  


magikanin, давай так: ты определишься что твоя БД будет делать, определишь какие операции часто выполняются, а мы постараемся определить примерные пути решения проблемы. надеюсь ты понимаешь что оптемизация конкретного случая уникальна, по этому 100% превельный вариант тебе врядли кто даст, но примерных путей решения, для преподов думаю будет достаточно.

Цитата(magikanin @  6.5.2007,  16:44 Найти цитируемый пост)
создать из 4-5 таблиц базу данных и оптимизировать ее на 60 %


magikanin, ты знаешь - порой потратишь не мало сил на то что бы отдельная бизнес единица твоей БД работала на 2% производительней, а тут 60%. думаю притаком раскладе преподы сами не понимают что хотят и мало что понимают в оптимизации оракла - отсюда следует что им можно грамотным языком впарить что угодно, лишь бы звучало по научному smile

Это сообщение отредактировал(а) DimW - 11.5.2007, 08:05
PM MAIL ICQ   Вверх
LSD
Дата 11.5.2007, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



DimW, Sqlninja, вы по моему о чем-то о своем говорите, а не о том что нужно автору вопроса. Ясно же сказано, что это учебная задача на оптимизацию. Какие админы БД, какие реальные БД, откуда они тут возьмутся.

Берем пример оптимизации: "в случае бла-бла-бла, может помочь бла-бла-бла". Создаем эту ситуацию и убеждаемся, что оптимизация действительно работает.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Sqlninja
Дата 11.5.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



Цитата(LSD @  11.5.2007,  10:11 Найти цитируемый пост)
DimW, Sqlninja, вы по моему о чем-то о своем говорите, а не о том что нужно автору вопроса



LSD , magikanin и компания автору вопроса нужно сначала разобраться в ОСНОВАХ Oracle или вся эта работа - вырванные годы. Как можно оптимизировать то, чего не знаешь?




--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
LSD
Дата 11.5.2007, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(Sqlninja @  11.5.2007,  14:40 Найти цитируемый пост)
LSD , magikanin и компания автору вопроса нужно сначала разобраться в ОСНОВАХ Oracle или вся эта работа - вырванные годы. Как можно оптимизировать то, чего не знаешь?

Давай не будем за автора, решать что ему надо smile 

Посчитает нужным - разберется, нет - дело его. Может он больше никогда в жизни не будет работать с Oracle, зачем ему тогда тратить время на ненужные знания.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
magikanin
Дата 13.5.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.4.2007

Репутация: 1
Всего: 1



DimW

Спасибо большое за помощь !

Я почитал основы баз данных и написал такую базу данных из 4 таблиц . База данных о режимном обьекте - Атомной Электростанции к примеру. Цель фиксировать в какое время в каком зале был работник , и какой проект он делал . 

1 таблица  my_zal - это таблица с первичным ключом зала и названием . Ну к примеру название "лаборатория " .
2 таблица my_rabotnik - это описание работника - его первичный ключ , имя , фамилия .
3 таблица my_vremia - первичный ключ , фиксирует время прихода и ухода , внешний ключи - первичный ключ работника , зала и проекта 
4 таблица my_projekt - первичный номер проекта и название проекта .
Код



echo on;
drop table my_vremia;
drop table my_zal;
drop table my_rabotnik;
drop table my_projekt;


create table my_zal (
      Nr     int  not null ,
      Nazvanije varchar2(32) not null ,
      constraint zal_pk primary key(Nr)
      ); 
create sequence my_seq minvalue 1 start with 1 increment by 1 cache 20;
     

create table my_rabotnik (
      Nr_rabotnik int not null ,
      Imia  varchar2(12) not null ,
      Familija varchar2(13) not null,
      constraint rabotnik_pk primary key(Nr_rabotnik)  
      );
create sequence rab_seq minvalue 1 start with 1 increment by 1 cache 20;      
      
 
create table my_vremia (
      Id int not null primary key,     
      Vremia_prihoda    timestamp (6) ,
      Vremia_uhoda  timestamp (6),
      rabotnik int not null,
      zal int not null,
      projekt int not null,
      
);

create sequence vremia_seq minvalue 1 start with 1 increment by 1 cache 20;

create table my_projekt(
    id int not null primary key,
    Nazvanije varchar2(12) not null
) ;

create sequence projekt_seq minvalue 1 start with 1 increment by 1 cache 20



Потом я добавляю внешние ключи 

Код

alter table my_vremia add constraint vremia_fk_zal foreign key (zal)
references my_zal(Nr)
on delete cascade;
      
      
alter table my_vremia add  constraint vremia_fk_rabotnik foreign key(rabotnik)
references my_rabotnik(Nr_rabotnik)
on delete cascade;

alter table my_vremia add constraint vremia_fk_projekt foreign key(projekt)
references my_projekt(id)
on delete cascade;


Ну и заполнил данными 
Код


begin
for i in 1..1000
loop 
insert into my_zal(Nr,Nazvanije) values (my_seq.nextval,'Labaratorija');
end loop;
end;
/



begin
for i in 1..10000
loop
insert /*+   append */ into my_rabotnik (Nr_rabotnik,Imia,Familija) values (rab_seq.nextval,'Anton','Antonov');
end loop;
end;
/

begin
    for i in 1..10 
    loop
        insert /*+ append */ into my_projekt(id,Nazvanije)
        values (projekt_seq.nextval,'AO'||to_char(i));

    end loop;
    

end;
/

begin
for i in 1..10000
loop
insert /*+ append */ into my_vremia(Id,Vremia_prihoda,Vremia_uhoda,rabotnik,zal,projekt) 
values (vremia_seq.nextval,
to_date('2007.04.15 17:46:41','yyyy/mm/dd hh24:mi:ss'),systimestamp,1,45,1);

end loop;
end;
/




На этой базе данных наиболее частые операции -
 это insert в таблицу my_vremia и полное удаление этой таблицы . 
Остальные три базы данных практически не меняються , но нам нужен часто быстрее выполнять Select обьединения по всем четырем таблицам . 
Примерно такой select

Код

set timing on;
set autotrace on;

select  /* ordered  */ 
z.Nr , z.Nazvanije, r.Imia, 
r.Familija , v.Vremia_prihoda,v.Vremia_uhoda , p.Nazvanije
from my_zal z ,my_rabotnik r, my_projekt p, my_vremia v
where z.Nr = v.sale and 
  z.Nr = 45 and 
  r.Nr_rabotnik = v.rabotnik and
  p.id = v.projektas;



Цитата

magikanin, давай так: ты определишься что твоя БД будет делать, определишь какие операции часто выполняются, а мы постараемся определить примерные пути решения проблемы. надеюсь ты понимаешь что оптемизация конкретного случая уникальна, по этому 100% превельный вариант тебе врядли кто даст, но примерных путей решения, для преподов думаю будет достаточно.


Спасибо большое ! 

LSD

Цитата


Берем пример оптимизации: "в случае бла-бла-бла, может помочь бла-бла-бла". Создаем эту ситуацию и убеждаемся, что оптимизация действительно работает.


Абсолютно точно  !

Sqlninja

Цитата

LSD , magikanin и компания автору вопроса нужно сначала разобраться в ОСНОВАХ Oracle или вся эта работа - вырванные годы. Как можно оптимизировать то, чего не знаешь?


Ну что бы сдать предмет  smile 


LSD 

Цитата

Посчитает нужным - разберется, нет - дело его. Может он больше никогда в жизни не будет работать с Oracle, зачем ему тогда тратить время на ненужные знания.


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




Это сообщение отредактировал(а) magikanin - 13.5.2007, 20:42
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0733 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.