Много Удаление строк от таблицы в SQL Server

export class MemeGenerator extends React.Component {
constructor (props) {
super(props)
this.state = {
  apiData: []
}
this.submitChange = this.submitChange.bind(this)
}
componentDidMount () { /* fetch something as default here to show user or nothing till user pushes Gen button*/}

    submitChange (name) {
    fetch(`https://api.imgflip.com/${name}`)
    .then(response => response.json())
    .then(data => {
       this.setState({
       apiData: data
       })
    console.log(this.state.apiData)
    })
    }

render () {
return (
  <div>
    <form onSubmit={this.submitChange}>
      /* you should decide whre to get this name from an array of names from state? hardcode enum ...*/
      <button onClick={this.submitChange({name})} value='Submit'>Gen</button>
   <div>
       <img src='http://i.imgflip.com/1bij.jpg' onLoad={this.loadImg} />
   </div>
    </form>
  </div>
)}}
6
задан dkretz 25 January 2009 в 21:55
поделиться

10 ответов

Если (и только если) Вы хотите удалить все записи в таблице, можно использовать DROP TABLE или TRUNCATE TABLE.

УДАЛИТЕ удаляет одну запись за один раз и записывает запись в журнале транзакций для каждой удаленной строки. TRUNCATE TABLE намного быстрее, потому что он не записывает действие в журнале транзакций. Это удаляет все строки из таблицы, но структура таблицы и ее столбцы, ограничения, индексы и так далее остаются. DROP TABLE удалил бы их.

Соблюдите осторожность, если Вы решаете УСЕЧЬ. Это необратимо (если у Вас нет резервного копирования).

5
ответ дан 9 December 2019 в 20:50
поделиться
DELETE FROM table WHERE a=b;

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

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

--Disable Index
ALTER INDEX [IX_MyIndex] ON MyTable.MyColumn DISABLE

--Enable Index
ALTER INDEX [IX_MyIndex] ON MyTable.MyColumn REBUILD

Если Вы хотите удалить все записи в таблице, можно использовать УСЕЧЕННЫЙ.

1
ответ дан 9 December 2019 в 20:50
поделиться

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

В зависимости от какого Вы хотите сделать и целостность транзакций, можно ли удалить вещи в маленьких пакетах, например, при попытке удалить 1,5 миллиона записей, который является ценностью 1 года данных, можно ли сделать это 1 неделя за один раз?

1
ответ дан 9 December 2019 в 20:50
поделиться

Можно хотеть попытаться удалить в пакетах также. Я просто протестировал это на таблице, которую я имею, и удалить операция пошла от 13 секунд до 3 секунд.

While Exists(Select * From YourTable Where YourCondition = True)
  Delete Top (100000)
  From   YourTable
  Where  YourCondition = True

Я не думаю, что можно использовать предикат TOP, если Вы выполняете SQL2000, но он работает с SQL2005 и. Если Вы используете SQL2000, то можно использовать этот синтаксис вместо этого:

Set RowCount 100000
While Exists(Select * From YourTable Where YourCondition = True)
   Delete 
   From YourTable
   Where  YourCondition = True
2
ответ дан 9 December 2019 в 20:50
поделиться

составьте вторую таблицу, вставив все строки сначала, что Вы не хотите удалять.

удалите первую таблицу

переименуйте вторую таблицу, чтобы быть первыми

(или вариация на вышеупомянутое)

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

3
ответ дан 9 December 2019 в 20:50
поделиться

Удалите из таблицы где условие для тех 1,5 миллионов строк

Время зависит.

0
ответ дан 9 December 2019 в 20:50
поделиться

УСЕЧЕННЫЙ также проигнорирует любую ссылочную целостность или включает таблицу. УДАЛИТЕ ИЗ... ГДЕ Будет уважать обоих. Время будет зависеть от индексации Ваших столбцов условий, Ваших аппаратных средств и любой дополнительной системной нагрузки.

0
ответ дан 9 December 2019 в 20:50
поделиться

На Oracle также возможно использовать

truncate table <table>

Не уверенный, если это - стандартный SQL или доступный в SQL Server. Это однако очистит целую таблицу - но затем это более быстро, чем, "удаляют из" (это также проведет фиксацию).

0
ответ дан 9 December 2019 в 20:50
поделиться

Удалить SQL является точно тем же, поскольку нормальный SQL удаляет

удалите из таблицы где [Ваше условие]

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

0
ответ дан 9 December 2019 в 20:50
поделиться
CREATE TABLE new_table as select <data you want to keep> from old_table;

index new_table
grant on new table
add constraints on new_table
etc on new_table

drop table old_table
rename new_table to old_table;
0
ответ дан 9 December 2019 в 20:50
поделиться
Другие вопросы по тегам:

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