2013-02-26 2 views
0

Существуют различия между отдельными таблицами и столбцами типа с точки зрения производительности или оптимизации для запросов?Производительность Типированная колонка x Отдельная таблица

, например:

Create Table AllInOne(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null, 
    OneType Integer Not Null 
) 

Где OneType получает только 1,2 или 3. (целые значения)

Против следующей архитектуры:

Create Table One(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null 
) 

Create Table Two(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null 
) 

Create Table Three(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null 
) 

Другая возможная архитектура:

Create Table Root(
    Key Integer Identity Primary Key, 
    Desc varchar(20) Not Null 
) 

Create Table One(
    Key Integer Primary Key references Root  
) 

Create Table Two(
    Key Integer Primary Key references Root  
) 

Create Table Three(
    Key Integer Primary Key references Root  
) 

В 3-м порядке все данные будут установлены в корневом каталоге и связаны с одной, двумя и тремя таблицами.

Я спросил своего учителя некоторое время назад, и он не мог ответить, если есть какая-либо разница. Предположим, мне нужно выбирать между этими тремя подходами.
Предположим, что часто используемые запросы фильтруют тип. И нет никаких дочерних таблиц, которые ссылаются на них.

Чтобы упростить понимание, давайте подумаем о системе начисления заработной платы.
One = Incomings
Two = Скидки
Три = База для расчета.

+3

Зависит от ваших запросов. Помимо производительности, есть и другая (более серьезная разница). Во втором проекте вы не можете иметь внешний ключ, который ссылается на таблицу «AllInOne», вы можете ссылаться только на одну из трех таблиц отдельно. И наоборот. –

+0

Согласен с ypercube. Если вы последуете этому аргументу до логического вывода, у вас будет только одна таблица в любой базе данных, просто с большим количеством столбцов ... – Paddy

+0

@ypercube перефразировал вопрос – EProgrammerNotFound

ответ

1

Наличие отдельных таблиц, как в (2), означает, что кто-то, кому необходимо получить доступ к данным для определенного OneType, может игнорировать данные для других типов, тем самым делая меньше ввода-вывода для сканирования таблицы. Кроме того, индексы в таблице в (2) будут меньше и могут иметь меньшую высоту, что означает меньше операций ввода-вывода для доступа к индексу.

Учитывая высокую избирательность OneType, индексы не помогли бы фильтровать в (1). Однако разбиение таблиц может быть использовано для получения всех преимуществ, упомянутых выше.

Также были бы дополнительные преимущества. При запросе (2) вам нужно знать, какой OneType вам нужен, чтобы узнать, какую таблицу запрашивать. В многораздельной версии (1) устранение разделов для ненужных разделов может происходить через значения, заданные в предикате предложения where, что делает процесс намного проще.

Другие преимущества включают упрощение управления базой данных (когда вы добавляете столбец в секционированную таблицу, он добавляется ко всем разделам), простое масштабирование и простое добавление разделов для новых значений OneType. Кроме того, как уже упоминалось, таблица может быть нацелена на внешние ключи.

+0

Это замечательно! Это тоже для оракула? – EProgrammerNotFound

+0

Вы имеете в виду разделение? Да, очень – muhmud

Смежные вопросы