Все версии SQL-сервера восстанавливают индексы автоматически или имеют значение по умолчанию, восстанавливают критерии?

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

MyEntity.fetchAll { items,
   self.entities = items
   self.tableView.reloadData()
}

В этом случае довольно легко сделать что-то вроде:

var entities: [Any]? {
    didSet {
        self.removeActivityIndicator()
    }
}

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

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

class ActivityManager {

    private static var retainCount: Int = 0 {
        didSet {
            if(oldValue > 0 && newValue == 0) removeActivityWindow()
            else if(oldValue == 0 && newValue > 0) showActivityWindow()
        }
    }

    static func beginActivity() { retainCount += 1 }
    static func endActivity() { retainCount -= 1 }
}

В этом случае вы можете использовать инструмент в любом месте вашего кода. Правило состоит в том, что у каждого «начала» должен быть «конец». Так, например:

func resolveData() {
    ActivityManager.beginActivity()
    doMagic {
        ActivityManager.endActivity()
    }
}

Есть действительно много способов сделать это, и, вероятно, не существует «лучшего решения», поскольку это зависит только от вашего случая.

Пример использования нового окна для отображения диалога:

В соответствии с просьбой в комментариях я добавляю пример того, как показать диалог в новом окне. Я использую новую раскадровку «Диалог», которая содержит контроллер представления AlertViewController. Это также может быть контроллер с некоторым индикатором активности, но более важной частью является то, как генерируется окно, как отображается контроллер и как его закрывают.

class AlertViewController: UIViewController {

    @IBOutlet private var blurView: UIVisualEffectView?
    @IBOutlet private var dialogPanel: UIView?
    @IBOutlet private var titleLabel: UILabel? // Is in vertical stack view
    @IBOutlet private var messageLabel: UILabel? // Is in vertical stack view
    @IBOutlet private var okButton: UIButton? // Is in horizontal stack view
    @IBOutlet private var cancelButton: UIButton? // Is in horizontal stack view

    var titleText: String?
    var messageText: String?
    var confirmButtonText: String?
    var cancelButtonText: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        setHiddenState(isHidden: true, animated: false) // Initialize as not visible

        titleLabel?.text = titleText
        titleLabel?.isHidden = !(titleText?.isEmpty == false)

        messageLabel?.text = messageText
        messageLabel?.isHidden = !(messageText?.isEmpty == false)

        okButton?.setTitle(confirmButtonText, for: .normal)
        okButton?.isHidden = !(confirmButtonText?.isEmpty == false)

        cancelButton?.setTitle(cancelButtonText, for: .normal)
        cancelButton?.isHidden = !(cancelButtonText?.isEmpty == false)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        setHiddenState(isHidden: false, animated: true)
    }

    private func setHiddenState(isHidden: Bool, animated: Bool, completion: (() -> Void)? = nil) {
        UIView.animate(withDuration: animated ? 0.3 : 0.0, animations: {
            self.blurView?.effect = isHidden ? UIVisualEffect() : UIBlurEffect(style: .light)
            self.dialogPanel?.alpha = isHidden ? 0.0 : 1.0
        }) { _ in
            completion?()
        }
    }

    @IBAction private func okPressed() {
        AlertViewController.dismissAlert()
    }
    @IBAction private func cancelPressed() {
        AlertViewController.dismissAlert()
    }


}

// MARK: - Window

extension AlertViewController {

    private static var currentAlert: (window: UIWindow, controller: AlertViewController)?

    static func showMessage(_ message: String) {

        guard currentAlert == nil else {
            print("An alert view is already shown. Dismiss this one to show another.")
            return
        }

        let controller = UIStoryboard(name: "Dialog", bundle: nil).instantiateViewController(withIdentifier: "AlertViewController") as! AlertViewController
        controller.confirmButtonText = "OK"
        controller.messageText = message

        let window = UIWindow(frame: UIApplication.shared.windows[0].frame)
        window.windowLevel = .alert
        window.rootViewController = controller
        window.makeKeyAndVisible()

        self.currentAlert = (window, controller)
    }

    static func dismissAlert() {
        if let currentAlert = self.currentAlert {
            currentAlert.controller.setHiddenState(isHidden: true, animated: true) {
                self.currentAlert?.window.isHidden = true
                self.currentAlert = nil
            }
        }
    }

}

Я добавил весь класс на всякий случай, но важная часть показывает новое окно:

let window = UIWindow(frame: UIApplication.shared.windows[0].frame) // Create a window
window.windowLevel = .alert // Define which level it should be in
window.rootViewController = controller // Give it a root view controller
window.makeKeyAndVisible() // Show the window

И удаление окна:

window.isHidden = true

Просто скрывая ваш окна достаточно. Предполагая, что у вас нет сильной ссылки на него, он будет удален из стека приложения. Для подтверждения этого убедитесь, что UIApplication.shared.windows.count имеет подходящее значение, которое в большинстве случаев должно быть 2, когда отображается предупреждение, и 1 в противном случае.

Мое тестовое использование приведенного выше кода было просто:

AlertViewController.showMessage("A test message. This is testing of alert view in a separate window.")
12
задан Ian Nelson 24 February 2009 в 13:06
поделиться

5 ответов

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

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

http://weblogs.sqlteam.com/tarad/archive/2008/09/03/Defragmenting-Indexes-in-SQL-Server-2005.aspx

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

9
ответ дан 2 December 2019 в 19:55
поделиться

Как люди упомянули здесь, Ваши индексы автоматически не восстанавливают. Это - вполне большая проблема в SQL Server, поскольку Ваши индексы будут фрагментировать со временем. Ваш мог найти, что Ваши индексы составляют 95% плюс фрагментированная, влияющая производительность запросов плохо.

Вот простой запрос для проверки фрагментации на существующих индексах:

DECLARE @DBNAME VARCHAR(130);
SET @DBNAME = 'MYDBNAME';

DECLARE @DBID INT;
SET @DBID = DB_ID(@DBNAME);

SELECT
OBJECT_ID AS objectID
, index_id AS indexID
, avg_fragmentation_in_percent AS fragmentation
, page_count 
INTO #indexDefragList
FROM
sys.dm_db_index_physical_stats 
(@DBID, NULL, NULL , NULL, N'Limited')
WHERE
index_id > 0
OPTION (MaxDop 1);

SELECT
i.[name] as indexname,
d.fragmentation,
d.page_count
FROM
#indexDefragList d
INNER JOIN sys.indexes i
ON d.objectid = i.object_id
ORDER BY 
d.fragmentation DESC

DROP TABLE #indexDefragList

Это возвратит список всех индексов в Вашем текущем DB с их фрагментацией в %.

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

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

Чтобы подробно остановиться на том, что сказал Chris:

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

2005 SQL Server определяет, обновить ли статистику автоматически на основе изменений в счетчиках модификации столбца (colmodctrs).

Объект статистики считают устаревшим в следующих случаях:

1. Размер таблицы пошел от 0 до> 0 строк.

2. Количество строк в таблице, когда статистические данные были собраны, было 500 или меньше, и colmodctr ведущего столбца объекта статистики изменился больше чем на 500 с тех пор.

3. Таблица имела больше чем 500 строк, когда статистические данные были собраны, и colmodctr ведущего столбца объекта статистики изменился больше чем на 500 + 20% количества строк в таблице, когда статистические данные были собраны

Можно найти следующую ссылку относительно статистики использования:

http://blogs.technet.com/rob/archive/2008/05/16/sql-server-statistics.aspx

Надежда это помогает, но не стесняйтесь излагать дальнейшие запросы.

С наилучшими пожеланиями, John

1
ответ дан 2 December 2019 в 19:55
поделиться

Как @Chris отмеченный, индексы не восстановлены автоматически ни в какой версии SQL Server. Надлежащее ведение индексов часто отсутствует на сайтах без специализированной роли DBA, и часто когда базы данных просто перемещены от разработки в производство (наряду с обслуживанием Журнала транзакций).

SQL Server 2005 + имеет способность сделать индекс онлайн, реорганизовывает, и офлайн полный восстанавливает.

0
ответ дан 2 December 2019 в 19:55
поделиться

Это должно быть расписанием и расположило себя.

При улаживании его он зависит от размера таблиц и окна обслуживания.

Кроме того, статистические данные восстановлены автоматически, когда индексы восстановлены, но могут быть запланированы отдельно.

Для быстрого исправления, принимая хорошее длинное окно обслуживания и не слишком крупные (несколько 100 ГБ), просто запланируйте это:

EXEC sp_msforeachtable 'SET QUOTED_IDENTIFIER ON ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR = 90)'

Править: только для> SQL 2005 этот SQL

0
ответ дан 2 December 2019 в 19:55
поделиться
Другие вопросы по тегам:

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