Удалить количество строк из таблицы Transact-SQL - PullRequest
1 голос
/ 09 февраля 2012

В общем случае необходимо удалить около 110K строк из таблицы Nodes, но их идентификаторы не объявлены явно, а заданы из другой таблицы.

DECLARE @gh Table(id int);
INSERT INTO @gh (id) SELECT node_id FROM Relations;
DELETE FROM Nodes WHERE id NOT IN (SELECT DISTINCT id FROM @gh)

Выбор (SELECT DISTINCT id FROM @gh) содержит около 20K строки сервер не может удалить их из-за истечения времени ожидания.Какие еще есть способы сделать это?

Ответы [ 4 ]

3 голосов
/ 09 февраля 2012

Если вы держите 20К из 130К, я бы сделал это иначе

SELECT N.* 
  INTO #NodesTemp 
FROM  
  Relations R JOIN Nodes N ON R.id = N.id;

TRUNCATE TABLE Nodes;

INSERT Nodes SELECT * FROM #NodesTemp;

DROP TABLE #NodesTemp;

Edit:

  • у вас есть триггер DELETE на узлах?
  • есть ли у вас внешние ключи для узлов, которые необходимо проверить?
1 голос
/ 09 февраля 2012

Вы можете попробовать удалить узлы в пакетах вместо всех сразу, добавив предложение TOP в DELETE:

WHILE EXISTS(SELECT * FROM Nodes WHERE id NOT IN (SELECT DISTINCT id FROM @gh))
DELETE TOP (100) Nodes
WHERE id NOT IN (SELECT DISTINCT id FROM @gh)
1 голос
/ 09 февраля 2012

Нечто подобное может помочь.Он удалит все узлы, для которых нет соответствующей записи отношения.Внешнее соединение должно быть намного быстрее, чем использование предложения «not in» с подзапросом.

delete n
from Nodes n left outer join Relations r on n.id = r.node_id
where r.node_id is null
0 голосов
/ 09 февраля 2012

Вам не нужно DINSTINCT для этого. Это добавляет ненужные накладные расходы к оператору удаления.

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

DELETE 
FROM Nodes 
WHERE id NOT IN 
      (SELECT node_id FROM Relations)

или удалите строки небольшими порциями, как предложил @Serguei:

SELECT 1

WHILE @@ROWCOUNT > 0
BEGIN
    DELETE TOP (1000)
    FROM Nodes 
    WHERE id NOT IN 
          (SELECT node_id FROM Relations)
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...