Подсказки для того, чтобы улучшить производительность DB, который является выше размера 40 ГБ (SQL-сервер 2005) и растущий ежемесячно приблизительно на 3 ГБ

Текущий DB или наш проект пересекли 40 ГБ в этом месяце, и в среднем это растет ежемесячно приблизительно на 3 ГБ. Теперь все таблицы лучше всего нормализованы, и надлежащая индексация использовалась. Но все еще поскольку размер растет, требуется больше времени для увольнения даже основных запросов как 'избранное количество (1) от таблицы'. Так можете Вы совместно использовать еще некоторые точки, которые помогут в этой передней стороне. Базой данных является SQL-сервер 2005. Далее, если бы мы реализуем Разделение разве, оно не создало бы издержки?

Заранее спасибо.

7
задан HotTester 13 March 2010 в 06:57
поделиться

6 ответов

  1. убедитесь, что у вас есть подходящие/соответствующие индексы
  2. убедитесь, что у вас есть хорошая стратегия обслуживания индексов (например, обновляйте статистику перестройки/дефрагментации/поддержки индексов, чтобы обеспечить хорошую работу индексов)
  3. определите плохо работающие запросы и оптимизируйте их (возможно, они были записаны/тестированы на небольших томах данных, когда проблемы с производительностью не проявились бы)
  4. рассмотрите возможность разметки ваших данных (например, в SQL 2005 и далее встроена поддержка разметки, если у вас есть Enterprise Edition). Правка: чтобы подробнее рассказать о разметке сервера SQL, я полностью рекомендую прочитать эту MSDN статью о том, почему и как это сделать. В общем, на QCon 2008 был также неплохой доклад Рэнди Шоупа (Randy Shoup) (архитектор eBay) о масштабируемости, одним из ключевых моментов в масштабировании системы в целом является разбиение. Это обобщенно здесь .
  5. Достаточно ли аппаратного обеспечения вашего сервера db? Может ли он извлечь выгоду из большего объема памяти? Правка: глядя на ваш комментарий с информацией об оборудовании, я думаю, что вы могли бы сделать с (по крайней мере) бросить больше оперативной памяти в него
  6. вы можете извлечь выгоду из некоторой денормализации. Трудно быть специфическим без знания точной структуры db, но денормализация может улучшить некоторые запросы за счет дублирования данных/пространства диска
8
ответ дан 6 December 2019 в 12:50
поделиться

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

0
ответ дан 6 December 2019 в 12:50
поделиться

Я бы начал с использованием монитора производительности и Profiler SQL Server , чтобы узнать, что является наиболее важным пределом производительности в вашей системе. После этого вам, вероятно, хорошая идея, где начать.

Вот одно место для начала: Устранение неисправностей Проблемы с производительностью в SQL Server 2005

1
ответ дан 6 December 2019 в 12:50
поделиться

Ваша машина довольно низкая спецификация, однако, как вы даже не упомянули, какой диск вы используете, это, скорее всего, проблема. Вам понадобится очень быстрый диск для поддержки базы данных 40 ГБ с 4 ГБ оперативной памяти, несколько полосатых дисков были бы голым минимумом.

3
ответ дан 6 December 2019 в 12:50
поделиться

Я скорее отправляю эти данные через OCTET STRING/DisplayString. Такие номера, как «1.5», могут быть легко отправлены.

Однако, если данные должны быть точными, вы можете использовать предложение Кайла, отправляя байты (октеты). Заметно, что это также отправляется через OCTET STRING, поскольку это идеальный контейнер байтов.

-121--3879786-

Это так называемое «скрытие»: Y:: spray скрывает X:: spray . Добавьте с помощью директивы:

class Y : public X
{
public:
   using X::spray;
   // ...
};
-121--1654782-

Также, возможно, вам захочется перейти к основам и переосмыслить причину роста базы данных и ее структуру. 3GB месяц (возможно, увеличивается, если вы успешны) рано или поздно доставит вам неприятности; -)

-1
ответ дан 6 December 2019 в 12:50
поделиться

Несколько способов:

if (element.firstChild) {
    // It has at least one
}

или функция hasChildNodes () :

if (element.hasChildNodes()) {
    // It has at least one
}

или свойство length свойства childNodes :

if (element.childNodes.length > 0) { // Or just `if (element.childNodes.length)`
    // It has at least one
}

Если вы хотите знать только о дочерних элементах (в отличие от текстовых узлов, узлов атрибутов и т.д.) во всех современных браузерах (и IE8 - фактически, даже IE6) вы можете сделать это: (спасибо Флориан !)

if (element.children.length > 0) { // Or just `if (element.children.length)`
    // It has at least one element as a child
}

Это зависит от свойства children , которое не было определено в DOM1 , DOM2 , или DOM3 , но которое имеет почти универсальную поддержку. (Он работает в IE6 и вверх и Chrome, Firefox и Opera в по крайней мере еще в ноябре 2012 года, когда это было первоначально написано.) При поддержке старых мобильных устройств обязательно проверьте наличие поддержки.

Если вам не нужна IE8 и более ранняя поддержка, вы также можете сделать это:

if (element.firstElementChild) {
    // It has at least one element as a child
}

, которая полагается на firstElireChild . Как и child , он также не был определен в DOM1-3, но в отличие от children он не был добавлен в IE до IE9.

Если вы хотите придерживаться чего-то определенного в DOM1 (может быть, вам придется поддерживать действительно неясные браузеры), вы должны сделать больше работы:

var hasChildElements, child;
hasChildElements = false;
for (child = element.firstChild; child; child = child.nextSibling) {
    if (child.nodeType == 1) { // 1 == Element
        hasChildElements = true;
        break;
    }
}

Все это является частью DOM1 , и почти универсально поддерживается.

Было бы легко завершить это в функции, например:

function hasChildElement(elm) {
    var child, rv;

    if (elm.children) {
        // Supports `children`
        rv = elm.children.length !== 0;
    } else {
        // The hard way...
        rv = false;
        for (child = element.firstChild; !rv && child; child = child.nextSibling) {
            if (child.nodeType == 1) { // 1 == Element
                rv = true;
            }
        }
    }
    return rv;
}
-121--773134-

Можно проверить, имеет ли элемент дочерние узлы element.hasChildNodes () . Будьте осторожны в Mozilla это вернет true, если является пробел после тэга, так что вам нужно будет проверить тип тэга.

https://developer.mozilla.org/En/DOM/Node.hasChildNodes

-121--773136-

База данных размером 40 ГБ в настоящее время не считается большой базой данных. И рост на 3 ГБ в месяц тоже не является чем-то необычным.

Однако в тех областях, где вы действительно должны быть внимательны к некоторым мелким вещам, которые вам могут сойти с рук в небольших базах данных. Так как вы пишете о выдаче запроса «SELECT COUNT (1)»..., вы можете подумать о необходимости таких запросов. Похоже, это тип функции «Отображение количества строк в таблице». Вам действительно нужно то, что вы называете «базовыми запросами», или вы можете обойтись без них? Учитывая особенно этот вопрос: нужен ли результат, чтобы быть точным или это также может быть «хорошая оценка»? Если это так, вы можете добавить подсказку WITH (NOLOCK) здесь и там, где точность не является обязательной. Однако используйте NOLOCK мудро, так как он вернет неправильные данные с невероятной скоростью.: -)

Множество хороших предложений были упомянуты AdaTheDev, просто позвольте мне добавить один момент:

Ничто не дает вам лучшую производительность, чем звук и твердая схема. И, кто знает, то, что, возможно, считалось уместным в то время, когда вы разрабатывали схему, может понадобиться пересмотреть сейчас после того, как какое-то время находился в производстве. Особенно это касается индексов.

5
ответ дан 6 December 2019 в 12:50
поделиться
Другие вопросы по тегам:

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