Удаляет все записи в таблице плохая практика в SQL Server?

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

Сначала объявите один глобальный varialbe для Handler, чтобы обновить элемент управления пользовательского интерфейса из Thread, как показано ниже

Handler mHandler = new Handler();

Теперь создайте один поток и используйте цикл while для периодического выполнения задачи с использованием метода ожидания потока.

 new Thread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                try {
                    Thread.sleep(10000);
                    mHandler.post(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            // Write your code here to update the UI.
                        }
                    });
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
        }
    }).start();
6
задан GEOCHET 19 May 2009 в 14:59
поделиться

9 ответов

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

Из книг в Интернете:

TRUNCATE TABLE функционально идентичен оператору DELETE без Предложение WHERE: оба удаляют все строки в Таблица. Но TRUNCATE TABLE - это быстрее и использует меньше системы и ресурсы журнала транзакций, чем DELETE.

http://msdn.microsoft.com/en-us/library/aa260621 (SQL.80) .aspx

20
ответ дан 8 December 2019 в 03:01
поделиться

Вы также можете УБИРАТЬ таблицу и воссоздать ее ... если нет взаимосвязей.

Оператор [DROP table] транзакционно безопасен, тогда как [TRUNCATE] - нет.

Таким образом, от вашей схемы зависит, в каком направлении вы хотите двигаться !!

Также используйте SQL Profiler для анализа времени выполнения. Попробуйте и выберите лучший !!

2
ответ дан 8 December 2019 в 03:01
поделиться

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

0
ответ дан 8 December 2019 в 03:01
поделиться

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

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

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

0
ответ дан 8 December 2019 в 03:01
поделиться
delete from sometable

Позволит вам отменить изменение. Так что, если ваша таблица очень большая, это может привести к значительному использованию памяти и времени.

Однако, если вы не боитесь сбоя, тогда:

truncate sometable

Будет работать почти мгновенно и с минимальными требованиями к памяти. Однако отката нет.

5
ответ дан 8 December 2019 в 03:01
поделиться

Натану Фегеру:

Вы можете выполнить откат из TRUNCATE. Убедитесь сами:

CREATE TABLE dbo.Test (i INT); ИДТИ INSERT dbo.Test (i) SELECT 1; ИДТИ НАЧАТЬ ТРАН ОБРЕЗАТЬ ТАБЛИЦУ dbo.Test; ВЫБЕРИТЕ i ИЗ dbo.Test; ОТКАТ ИДТИ ВЫБЕРИТЕ i ИЗ dbo.Test; GO

i

(затронуто 0 строк)

i

1

(затронуто 1 строка)

2
ответ дан 8 December 2019 в 03:01
поделиться

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

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

EDIT: обратите внимание, что даже если для модели восстановления установлено значение Simple, ваши журналы транзакций будут расти во время массового удаления. Журналы транзакций будут просто очищены после этого (без освобождения места). Идея состоит в том, что DELETE создаст транзакцию даже временно.

1
ответ дан 8 December 2019 в 03:01
поделиться

Рассмотрите возможность использования временных таблиц. Их имена начинаются с символа #, и они удаляются, когда на них никто не ссылается. Пример:

create table #myreport (
    id identity,
    col1,
    ...
)

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

Другой вариант - использовать TRUNCATE TABLE вместо DELETE. При усечении файл журнала не увеличивается.

1
ответ дан 8 December 2019 в 03:01
поделиться

Я думаю, что в вашем примере есть возможная проблема с параллелизмом. Что, если несколько процессов используют таблицу одновременно? Если вы добавите столбец JOB_ID или что-то в этом роде, это позволит вам очистить соответствующие записи в этой таблице, не сбивая данные, используемые другим процессом.

0
ответ дан 8 December 2019 в 03:01
поделиться
Другие вопросы по тегам:

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