Что лучший способ состоит в том, чтобы хранить исторические данные в SQL Server 2005/2008?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

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

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

22
задан Tom H 8 July 2010 в 15:05
поделиться

6 ответов

это ЗАВИСИТ от шаблонов использования приложений... Если шаблоны использования указывают, что исторические данные будут запрашиваться чаще, чем текущие значения, то помещенный их всех в одной таблице... Но если Исторические запросы являются исключением, (или меньше чем 10% запросов), и производительность более общего запроса текущего значения пострадает от помещения всех данных в одной таблице, то имеет смысл разделять те данные на свою собственную таблицу...

13
ответ дан Charles Bretana 29 November 2019 в 05:36
поделиться

Я сохранил бы данные в одной таблице , если у Вас нет очень серьезной предвзятости для текущих данных (в использовании) или данных истории (в объеме). Составной индекс с ДАТОЙ + TOWNID (в том порядке) удалил бы проблему производительности в большинстве случаев (хотя ясно у нас нет данных, чтобы быть уверенными в этом в это время).

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

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

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

5
ответ дан Godeke 29 November 2019 в 05:36
поделиться

Ваша таблица является очень узкой и вероятно работала бы в единственной правильно индексируемой таблице, которая никогда не будет опережать способность SQL Server в традиционной нормализованной модели OLTP, даже для миллионов и миллионов строк. Даже с моделью двойной таблицы преимущества может быть смягчен при помощи разделения таблицы в SQL Server. Таким образом, это не имеет многого для рекомендации его по единственной модели таблицы. Это был бы Inmon-стиль или "Корпоративное хранилище данных" - сценарий.

В намного больших сценариях, я передал бы данные хранилищу данных (смоделированный с Kimball-стилем размерная модель) регулярно и просто произвел бы чистку живых данных - в некоторых простых сценариях как Ваши, могло бы эффективно быть НИКАКОЙ живые данные - все это идет прямо в склад. Размерная модель имеет много преимуществ при разрезании данных различные пути и хранении огромных чисел фактов со множеством размеров. Даже в сценарии хранилища данных, часто таблицы фактов делятся по дате.

не могло бы казаться, что Ваши данные имеют это (Город, и Дата Ваши единственные явные размеры), однако, в большинстве хранилищ данных, размеры могут снежинка или может быть дублирование, таким образом, были бы другие размеры о факте, сохраненном во время загрузки вместо snowflaking для большей эффективности - как состояние, почтовый индекс, WasItRaining, (изобретенный) IsStationUrban.

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

3
ответ дан Cade Roux 29 November 2019 в 05:36
поделиться

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

, Когда размер становится проблемой, можно разделить его к десятилетию и иметь объединение хранимой процедуры требуемые строки.

1
ответ дан Gordon Bell 29 November 2019 в 05:36
поделиться

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

1
ответ дан PhilHoy 29 November 2019 в 05:36
поделиться

Я использовал бы единственную таблицу с индексными представлениями для предоставления мне последнюю информацию. Сервер SQL 2005 и 2008 разработан для организации хранилищ данных, так должен формовать хорошо при этом условии.

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

0
ответ дан Aaron Fischer 29 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: