Почему SQL Server работает быстрее, когда вы индексируете таблицу после ее заполнения?

Есть два подхода, которые вы можете использовать:

-Используйте UIAlertView или «UIActionSheet» вместо этого (не рекомендуется, потому что он устарел в iOS 8, но теперь он работает)

-Кто-то вспомните последний контроллер представления, который представлен. Вот пример.

@interface UIViewController (TopController)
+ (UIViewController *)topViewController;
@end

// implementation

#import "UIViewController+TopController.h"
#import <objc/runtime.h>

static __weak UIViewController *_topViewController = nil;

@implementation UIViewController (TopController)

+ (UIViewController *)topViewController {
    UIViewController *vc = _topViewController;
    while (vc.parentViewController) {
        vc = vc.parentViewController;
    }
    return vc;
}

+ (void)load {
    [super load];
    [self swizzleSelector:@selector(viewDidAppear:) withSelector:@selector(myViewDidAppear:)];
    [self swizzleSelector:@selector(viewWillDisappear:) withSelector:@selector(myViewWillDisappear:)];
}

- (void)myViewDidAppear:(BOOL)animated {
    if (_topViewController == nil) {
        _topViewController = self;
    }

    [self myViewDidAppear:animated];
}

- (void)myViewWillDisappear:(BOOL)animated {
    if (_topViewController == self) {
        _topViewController = nil;
    }

    [self myViewWillDisappear:animated];
}

+ (void)swizzleSelector:(SEL)sel1 withSelector:(SEL)sel2
{
    Class class = [self class];

    Method originalMethod = class_getInstanceMethod(class, sel1);
    Method swizzledMethod = class_getInstanceMethod(class, sel2);

    BOOL didAddMethod = class_addMethod(class,
                                        sel1,
                                        method_getImplementation(swizzledMethod),
                                        method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(class,
                            sel2,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}

@end 

Использование:

[[UIViewController topViewController] presentViewController:alertController ...];
16
задан mk. 26 August 2008 в 21:51
поделиться

9 ответов

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

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

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

42
ответ дан Jon Galloway 26 August 2008 в 21:51
поделиться

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

3
ответ дан Iker Jimenez 26 August 2008 в 21:51
поделиться
  • 1
    Это является ПОТРЯСАЮЩИМ! Я wasn' t знающий о initcap встроенной функции! Работы как очарование... Спасибо – Ayyoudy 4 September 2012 в 15:19

После выполнения больших операций манипулирования данными часто необходимо обновлять базовые индексы. Можно сделать это при помощи UPDATE STATISTICS [таблица] оператор.

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

2
ответ дан palehorse 26 August 2008 в 21:51
поделиться

Думайте о нем этот путь.

, Учитывая
unorderedList = {5, 1,3}
orderedList = {1,3,5}

добавляют 2 к обоим спискам.
unorderedList = {5, 1,3,2}
orderedList = {1,2,3,5}

, Что список, Вы думаете, легче добавить к?

Btw, заказывая Ваш вход, прежде чем загрузка будет стимулировать Вас.

3
ответ дан jason saldo 26 August 2008 в 21:51
поделиться

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

то, что статистика устарела, может быть обнаружено на Query Analyzer. Когда Вы видите, что на определенном количестве сканирования таблицы ожидаемых строк отличается к очень от фактических чисел обработанных строк.

необходимо использовать UPDATE STATISTICS для перевычисления распределения значений после вставки всех данных. После того, как то никакое различие в производительности не должно наблюдаться.

1
ответ дан Dima Malenko 26 August 2008 в 21:51
поделиться

это вызвано тем, что, если данные Вы вставка не находится в порядке индекса, SQL должен будет разделить страницы для создания места, чтобы дополнительные строки держали их вместе логически

1
ответ дан SQLMenace 26 August 2008 в 21:51
поделиться

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

6
ответ дан tghw 26 August 2008 в 21:51
поделиться

В дополнение к индексу наверху, выполняя каждый запрос, поскольку транзакция является плохой идеей по той же причине. Если Вы работаете, блоки вставок (скажите 100) в рамках 1 явной транзакции, необходимо также видеть, что производительность увеличивается.

1
ответ дан Dana the Sane 26 August 2008 в 21:51
поделиться

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

, Конечно, при импорте записей в индексном порядке, он не должен иметь значения так.

1
ответ дан Joel Coehoorn 26 August 2008 в 21:51
поделиться
Другие вопросы по тегам:

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