Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 КАк лучше создать индексы  [new]
Igor MV
Member

Откуда:
Сообщений: 106
Здравствуйте

Есть таблица статистики

CREATE TABLE TRAF_STATISTICS
(
  ID                NUMBER                    constraint NN_STAT_ID     NOT NULL,
  CLIENT_ID         NUMBER                    constraint NN_STAT_CL_ID  NOT NULL,
  PORTING_ID        NUMBER,
  KIND              VARCHAR2(1 BYTE)          constraint NN_STAT_KIND   NOT NULL,
  RAD_ACCT_ID       NUMBER,
  TIME_BEGIN        TIMESTAMP(6),
  TIME_END          TIMESTAMP(6)              constraint NN_STAT_T_END  NOT NULL,
  SESSION_TIME      NUMBER,
  DURATION          VARCHAR2(50 BYTE),
  TRAFFIC_IN        NUMBER,
  TRAFFIC_OUT       NUMBER,
  RECTIME           DATE         DEFAULT sysdate,
  CONSTRAINT  PK_STAT_ID  PRIMARY KEY (ID)
      USING INDEX (CREATE UNIQUE INDEX UDX_STAT_ID
          ON TRAF_STATISTICS (ID)
          TABLESPACE  DYN_INDEX)
)
TABLESPACE DYN_DATA
STORAGE    (
            INITIAL          100M
           )
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING
PARTITION BY RANGE (RECTIME)
   SUBPARTITION BY LIST (KIND)
   SUBPARTITION TEMPLATE 
      (SUBPARTITION TRAF_DIALUP VALUES ('R'),
       SUBPARTITION TRAF_VOIP VALUES ('V'),
       SUBPARTITION TRAF_XDSL VALUES ('N'),
       SUBPARTITION OTHERS VALUES (DEFAULT)
      )
(PARTITION CUR_YEAR VALUES LESS THAN (..),
PARTITION UNTIL_2008_YEAR VALUES LESS THAN (..),
PARTITION UNTIL_2007_YEAR VALUES LESS THAN (..)
);

выборки по полям client_id, porting_id, kind, rad_acct_id, time_end или их комбинации

Как правильно определить индексы, чтобы скорость выборок была наибольшей?
(данные в PARTITION CUR_YEAR вставляются постоянно и в большом количестве)
18 янв 08, 15:33    [5172908]     Ответить | Цитировать Сообщить модератору
 Re: КАк лучше создать индексы  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
0. А таблица у вас самодостаточна? :) То есть, ни одного FOREIGN KEY, никогда не соединяется в запросах с другими таблицами?
1. Мне только кажется, или у вас действительно информация дублируется в таблице? То есть, поля TIME_BEGIN, TIME_END, SESSION_TIME, DURATION, RECTIME абсолютно между собой не связаны и не вычисляются как DURATION = TIME_END - TIME_BEGIN etc.?
2. Учтите то, что операторы ЯМД при множестве индексов выполняются медленней.
3. Если возможно - приведите несколько распространённых примеров запросов к этой таблице.

Вместо PS:
Thomas Kyte, "Expert One-on-One Oracle", ch. 7
Я часто сталкиваюсь с тем, что об индексах при разработке приложений думают в последнюю очередь. Считаю, что это — ошибочный подход. С самого начала, если понятно, как будут использоваться данные, необходимо создать достаточный набор индексов для использования в приложении. Слишком часто приложение просто устанавливают в производственной среде, а потом решают, какие индексы необходимо добавить. Это означает, что разработчики вовремя не оценили способы использования и окончательные объемы данных, с которыми придется работать. Индексы в такой системе придется добавлять бесконечно, по мере роста объемов данных (это называется настройкой постфактум). Появятся избыточные индексы, которые никогда не используются, и на них будет тратиться не только место, но и вычислительные ресурсы. Обдумав в самом начале, когда и как индексировать данные, можно сэкономить большое количество времени, затрачиваемого на настройку по ходу эксплуатации.
18 янв 08, 16:41    [5173560]     Ответить | Цитировать Сообщить модератору
 Re: КАк лучше создать индексы  [new]
wdelete
Member

Откуда:
Сообщений: 63
партиционирование лучше сделать по полю time_end раз оно используется в запросах
и например можно партицый сделать по больше (для каждого месяца или дня);
18 янв 08, 16:49    [5173649]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить