У меня есть база данных Oracle 10g геномных данных с несколькими таблицами> 100 миллионов строк, которые выглядят примерно так:
ID AssayID Sample Mutation Call Frequency
101 12578 Sample01 T367G P 0.87
102 31384 Sample01 A2345C A 0.28
103 3453 Sample01 T247C P 0.67
104 12578 Sample02 G235del M 0.11
105 7868 Sample02 None P 0.98
ID
— это уникальный ПК,AssayID
иSample
— внешние ключи.- Предположим, что для каждого значения
Sample
есть ~ 50 тыс. строк. - Каждый
AssayID
встречается ровно один раз вSample
. Mutation
является относительно случайным, аCall
может быть одним из трех значений.- Запросы к этой таблице могут использовать любую комбинацию
AssayID
,Sample
,Mutation
,Call
или значение в связанной таблице черезAssayID
иSample
.
Типичный запрос:
select t.*
from this_table t
join assay_table a on t.assayid = a.assayid
join sample_table s on t.sample = s.sample
where
s.name = 'xxx' and a.gene in ('abc', 'xyz') and t.call = 'P'
- Запросы к этим таблицам всегда объединяют несколько меньших таблиц.
- Оператор
WHERE
обычно фильтрует данные по нескольким столбцам, но никогда только по базовой таблице данных.
Как спроектировать таблицу, чтобы добиться наилучшей производительности запросов при выборе всех столбцов?
Использую ли я только индексы, только разделы или их комбинацию? Место на диске и производительность вставки/обновления не являются проблемой.
name
имеется ~ 50 тыс. строк, каждоеattr2
встречается 1 тыс. раз для каждого имени, откуда берется другой множитель 50? Если каждыйattr1
иotherID
встречается один раз для каждого имени, остается толькоid
для создания дополнительного 50-кратного множителя, что кажется странным. Таблица, которую вы описываете, также кажется очень денормализованной: если для каждогоname
существует 1000 различных значенийattr2
, это означает, чтоattr2
должно находиться в другой таблице, связанной с этой с помощью первичного ключа. Почему вы не нормализуете таблицу, если вас беспокоит производительность? - person Justin Cave   schedule 27.06.2012name
иattr2
,attr2
должна находиться в отдельной таблице. Если таблица на самом деле нормализована, возможно, некоторые примеры данных помогут нам понять, как согласовать ваши описания. - person Justin Cave   schedule 27.06.2012Sample
и создам глобально разделенный индекс поMutation
? Если 90% запросов ссылаются наSample
и 10% ссылаются наMutation
, имеет ли это смысл? Насколько я могу судить, индексирование и разбиение примера таблицы не имеет значения, если запрос фильтрует только столбец в объединенной таблице. - person woemler   schedule 28.06.2012