Как ускорить крупное обновление сгруппированного столбца?

Эта функция берет любое количество CGPoints и возвращает вам наименьший CGRect.

CGRect CGRectSmallestWithCGPoints(CGPoint pointsArray[], int numberOfPoints)
{
    CGFloat greatestXValue = pointsArray[0].x;
    CGFloat greatestYValue = pointsArray[0].y;
    CGFloat smallestXValue = pointsArray[0].x;
    CGFloat smallestYValue = pointsArray[0].y;

    for(int i = 1; i < numberOfPoints; i++)
    {
        CGPoint point = pointsArray[i];
        greatestXValue = MAX(greatestXValue, point.x);
        greatestYValue = MAX(greatestYValue, point.y);
        smallestXValue = MIN(smallestXValue, point.x);
        smallestYValue = MIN(smallestYValue, point.y);
    }

    CGRect rect;
    rect.origin = CGPointMake(smallestXValue, smallestYValue);
    rect.size.width = greatestXValue - smallestXValue;
    rect.size.height = greatestYValue - smallestYValue;

    return rect;
}
7
задан Jeff Meatball Yang 19 June 2009 в 17:16
поделиться

3 ответа

Вот что я сделал (и это было намного быстрее):

  1. Я отбросил кластерный индекс.
  2. Я ТАКЖЕ сбросил внешние ключи ссылки (два других int столбцы).
  3. Я запустил оператор обновления
  4. Я воссоздал индекс, что оказалось быстрее, чем ожидалось. (Это первоначальная причина, по которой я сначала спросил ТАК).

Это сократило весь процесс до нескольких секунд. Да, ~ 1 миллион строк примерно за 15 секунд.

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

Число физических чтений было утроено из-за этих поисков внешнего ключа.

Я не уверен, зачем SQL Server это нужно, но предполагаю, что он по-прежнему выполняет проверку целостности, даже если я не обновляю этот столбец, но перемещаю всю строку (обновление кластерного столбца).


Кстати, я также пробовал запускать обновление партиями:

8
ответ дан 7 December 2019 в 05:27
поделиться

Я думаю, что предыдущий комментарий верен. Вы вроде как ответили на свой вопрос.

Поскольку

Кластерные индексы сортируют и сохраняют строки данных в таблице на основе их ключевые значения (исходный msdn),

вам может быть лучше просто отбросить кластерный индекс (оставить индекс в электронной почте). Когда операция будет завершена, мы воссоздадим кластерный индекс. Пока groupid не участвует ни в каких других индексах, я бы их не трогал. Если идентификатор группы участвует в других индексах, отбросьте их. Я бы оставил хотя бы индекс в электронной почте, просто для быстрого присоединения.

2
ответ дан 7 December 2019 в 05:27
поделиться

Почему бы вам не сделать следующее:

  • Создайте другой столбец (один из varchar) кластерный индекс
  • Создайте индекс для вашего groupId
  • update
  • Затем отмените процесс.

Это должно быть быстрее.

-2
ответ дан 7 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

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