Эта функция берет любое количество 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;
}
Вот что я сделал (и это было намного быстрее):
Это сократило весь процесс до нескольких секунд. Да, ~ 1 миллион строк примерно за 15 секунд.
Второй шаг имел решающее значение, потому что внешние ключи вынуждали обновление выполнять какую-то очередь для связанных таблиц, каждая из которых также имеет большое количество строк .
Число физических чтений было утроено из-за этих поисков внешнего ключа.
Я не уверен, зачем SQL Server это нужно, но предполагаю, что он по-прежнему выполняет проверку целостности, даже если я не обновляю этот столбец, но перемещаю всю строку (обновление кластерного столбца).
Кстати, я также пробовал запускать обновление партиями:
Я думаю, что предыдущий комментарий верен. Вы вроде как ответили на свой вопрос.
Поскольку
Кластерные индексы сортируют и сохраняют строки данных в таблице на основе их ключевые значения (исходный msdn),
вам может быть лучше просто отбросить кластерный индекс (оставить индекс в электронной почте). Когда операция будет завершена, мы воссоздадим кластерный индекс. Пока groupid не участвует ни в каких других индексах, я бы их не трогал. Если идентификатор группы участвует в других индексах, отбросьте их. Я бы оставил хотя бы индекс в электронной почте, просто для быстрого присоединения.
Почему бы вам не сделать следующее:
Это должно быть быстрее.