Каков наилучший способ удалить всю большую таблицу в t-sql? T sql t удалить


Каков наилучший способ удалить всю большую таблицу в t-sql? Безопасный SQL

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

Я пытаюсь очистить столы, но это происходит вечно (есть все еще 57 000 000+ записей после того, как это пропустит выходные … и это только первый стол!)

Просто использование таблицы удаления занимает навсегда и ест пространство на диске (я считаю, из-за журнала транзакций.) Сейчас я использую цикл while для удаления записей X за раз, играя с X, чтобы определить, что на самом деле быстрее всего. Например, X = 1000 занимает 3 секунды, а X = 100 000 занимает 26 секунд … что делает математику немного быстрее.

(Как только это будет сделано, при запуске задания агента SQL очистите таблицу один раз в день … но сначала нужно ее очистить).

ПРОВЕРИТЬ таблицу или отключить индексы перед удалением

TRUNCATE TABLE [tablename]

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

Чтобы добавить к другим ответам, если вы хотите сохранить данные за прошлый день (или за последний месяц или год или что-то еще), затем сохраните это, выполните команду TRUNCATE TABLE и вставьте ее обратно в исходную таблицу:

SELECT * INTO tmp_My_Table FROM My_Table WHERE <Some_Criteria> TRUNCATE TABLE My_Table INSERT INTO My_Table SELECT * FROM tmp_My_Table

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

1) Таблица усечения

2) скрипт из таблицы, падение и воссоздание таблицы

TRUNCATE TABLE [tablename]

удалит все записи без ведения журнала.

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

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

set @@ rowcount x while 1 = 1 Начало

удалить из таблицы. Если @@ Rowcount = 0 break

Конец

Изменение режима ведения журнала на db на простое или массовое протоколирование уменьшит часть издержек на удаление.

Проверь это

  1. статья из MSDN Delete_a_Huge_Amount_of_Data_from
  2. Информация о моделях восстановления
  3. и просмотреть или изменить модель восстановления базы данных

sql.fliplinux.com

[tsql] T-SQL: удаление всех повторяющихся строк, но сохранение одного [sql-server]

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

WITH cte AS ( SELECT[foo], [bar], row_number() OVER(PARTITION BY foo, bar ORDER BY baz) AS [rn] FROM TABLE ) DELETE cte WHERE [rn] > 1

Поиграйте с ним и посмотрите, что вы получите.

(Edit: В попытке быть полезным, кто-то отредактировал предложение ORDER BY в CTE. Чтобы быть ясным, вы можете заказать все, что вы хотите здесь, это не обязательно должен быть один из столбцов, возвращаемых cte. Фактически, общий пример использования заключается в том, что «foo, bar» - это идентификатор группы, а «baz» - это своего рода штамп времени. Чтобы сохранить последнее, вы должны сделать ORDER BY baz desc )

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

DECLARE @SampleData AS TABLE (Id int, Duplicate varchar(20)) INSERT INTO @SampleData SELECT 1, 'ABC' UNION ALL SELECT 2, 'ABC' UNION ALL SELECT 3, 'LMN' UNION ALL SELECT 4, 'XYZ' UNION ALL SELECT 5, 'XYZ' DELETE FROM @SampleData WHERE Id IN ( SELECT Id FROM ( SELECT Id ,ROW_NUMBER() OVER (PARTITION BY [Duplicate] ORDER BY Id) AS [ItemNumber] -- Change the partition columns to include the ones that make the row distinct FROM @SampleData ) a WHERE ItemNumber > 1 -- Keep only the first unique item ) SELECT * FROM @SampleData

И результаты:

Id Duplicate ----------- --------- 1 ABC 3 LMN 4 XYZ

Не уверен, почему это то, о чем я думал в первую очередь ... определенно не самый простой способ, но он работает.

code-examples.net

sql-server - tsql: Удалить поведение

Я хочу удалить заказ с заголовком, подзаголовком и деталями позиции, прежде чем записывать тот же порядок с любым подзаголовком замены, теперь могут быть указаны данные позиции. Я получаю ошибку нарушения pk, когда я пытаюсь записать новую версию с изменениями. После анализа я вижу, что, хотя мои операторы DELETE работают, после их выдачи (например, пострадали строки x) целевая таблица --the остается неизменной. Таким образом, это объясняет проблему pk vio. Что мне не хватает?

Здесь одно из утверждений:

-- detail level (drop products) DELETE dprods FROM [SQLsever].[WIP].[order].DropProducts as dprods INNER JOIN #dropprods t on t.OrderId = dprods.OrderId AND t.OrderDropId = dprods.OrderDropId AND t.DropProdId = dprods.DropProdId;

после выдачи оператора, я все еще имею все 200+ строки в целевой таблице. И у меня есть 200+ идентификаторы в таблице #dropprods temp. Зачем?

** ИЗОБРАЖЕН ЛУЧШЕ ОПРЕДЕЛЕННАЯ ПРОБЛЕМА ************* Заявления DELETE НЕ были проблемой. Эта проблема привязана к набору вложенных/именованных транзакций. Операторы DELETE находятся под одним, операторы INSERT под другим. Вот что у меня есть. Это явно неправильно. То, что я пытаюсь сделать, это заверить, что я не совершаю DELETE, прежде чем я узнаю, что у меня будет хорошая замена INSERT. Вот что я сделал: * EDITED T-SQL с SAVE TRANSACTION FIX *** Этот TSQL будет работать сейчас.

-- CHANGED BEGIN TRANSACTION SAVE TRANSACTION process_orders BEGIN TRY -- detail level DELETE lprods FROM [SQLServer].[WIP].[order].LiftProducts as lprods INNER JOIN #liftprods t on t.OrderId = lprods.OrderId AND t.OrderLiftId = lprods.OrderLiftId AND t.LiftProdId = lprods.LiftProdId; -- the rest of the deletes --NOTE: No commit transaction here; saving it to the end END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_MESSAGE() AS ErrorMessage; IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION process_orders; END CATCH BEGIN TRANSACTION -- CHANGED SAVE TRANSACTION process_orders BEGIN TRY -- CHANGED COMMIT TRANSACTION process_orders; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_MESSAGE() AS ErrorMessage; IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION process_orders ; END CATCH источник поделиться

qaru.site

T-SQL удаляет записи из результата запроса MS SQL Server

Ваши запросы должны возвращать все строки в таблице. Если таблица не изменится между выполнением, результаты запуска подзапросов по отдельности должны быть такими же, как при запуске их с UNION ALL .

В качестве примечания, если вы хотите упростить запрос, вы можете сделать следующее:

SELECT COALESCE(a.WBS_ELEMENT_ID, ROW_NUMBER() OVER (PARTITION BY wbs_element_id ORDER BY a. wbs_element_desc) ) as [WBS Element], a.WBS_ELEMENT_DESC as [WBS Element Desc], a.UHC_INDUSTRY as [Industry], a.UHC_SECTOR as [Sector], a.UHC_DUNS_NUMBER as [UHC DUNS Number], a.UHC_DUNS_NAME as [UHC DUNS Name], a.PRIORITY_SUB_SECTOR as [Priority Sub Sector], a.BUDGET_ALLOCATION as [Budget Allocation], a.LAST_UPDATED_ON as [Last Updated] FROM DimSectorPd a;

Очевидно, что нет ничего плохого в вашем синтаксисе, но если вы хотите попробовать другой подход к тому, чтобы ваш UNION ALL работал с ROW_NUMBER . Вот:

;WITH q1 AS ( SELECT a.WBS_ELEMENT_ID AS [WBS Element] ,a.WBS_ELEMENT_DESC AS [WBS Element Desc] ,a.UHC_INDUSTRY AS [Industry] ,a.UHC_SECTOR AS [Sector] ,a.UHC_DUNS_NUMBER AS [UHC DUNS Number] ,a.UHC_DUNS_NAME AS [UHC DUNS Name] ,a.PRIORITY_SUB_SECTOR AS [Priority Sub Sector] ,a.BUDGET_ALLOCATION AS [Budget Allocation] ,a.LAST_UPDATED_ON AS [Last Updated] FROM DimSectorPd a WHERE a.wbs_element_id IS NOT NULL UNION ALL SELECT b.WBS_ELEMENT_ID AS [WBS Element] --just bring NULL values ,b.WBS_ELEMENT_DESC AS [WBS Element name] ,b.UHC_INDUSTRY AS [Industry] ,b.UHC_SECTOR AS [Sector] ,b.UHC_DUNS_NUMBER AS [UHC DUNS Number] ,b.UHC_DUNS_NAME AS [UHC DUNS Name] ,b.PRIORITY_SUB_SECTOR AS [Priority Sub Sector] ,b.BUDGET_ALLOCATION AS [Budget Allocation] ,b.LAST_UPDATED_ON AS [Last Updated] FROM dimsectorpd b WHERE b.WBS_ELEMENT_ID IS NULL ) SELECT CASE WHEN q1.[WBS Element] IS NULL THEN ROW_NUMBER() OVER (ORDER BY q1.WBS_Element_Desc) ELSE q1.[WBS Element] END [WBS_Element] ,q1.[WBS Element Desc] ,q1.Industry ,q1.Sector ,q1.[UHC DUNS Number] ,q1.[UHC DUNS Name] ,q1.[Priority Sub Sector] ,q1.[Budget Allocation] ,q1.[Last Updated] FROM q1

Вот упрощенный пример, можете ли вы увидеть, работает ли он на вашем сервере?

SELECT a.low AS [My ID], a.name AS [My Letter] FROM master..spt_values as a WHERE low is not null UNION ALL SELECT ROW_NUMBER() OVER (ORDER BY a.name) AS [My ID], a.name AS [My Letter] FROM master..spt_values as a WHERE a.low is null

master..spt_values ​​как 2515 строк в моей системе …

sqlserver.bilee.com

tsql - T-SQL удаляет дубликаты из таблицы?

У нас есть таблица, в которой перечислены изображения png и их исходный URL.

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

Я пробовал различные методы, которые я использовал для использования в MSAccess (например, GroupBy и First, но First, например, недоступны в SQL Server, поэтому я подумал, что попрошу помочь в T-SQL).

Может ли кто-нибудь дать T-SQL, который удалит дубликаты (сохраняя самую большую строку изображения каждого дубликата)?

CREATE TABLE [dbo].[tblImageSuggestions] ( [CounterID] [bigint] IDENTITY(700996,1) NOT NULL, [CreatedDateTime] [datetime] NOT NULL, [EmailAddress] [nvarchar](200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [ImageOriginalURL] [nvarchar](2000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [ImageOriginalWidthPixels] [int] NOT NULL, [ImageOriginalHeightPixels] [int] NOT NULL, CONSTRAINT [PK_tblImageSuggestions] PRIMARY KEY CLUSTERED ([CounterID] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ) SET IDENTITY_INSERT [dbo].[tblImageSuggestions] ON INSERT [dbo].[tblImageSuggestions] ([CounterID], [CreatedDateTime], [EmailAddress], [ImageOriginalURL], [ImageOriginalWidthPixels], [ImageOriginalHeightPixels]) VALUES (701030, CAST(0x0000A6AD0005543F AS DateTime), N'[email protected]', N'MyURL1', 1024, 1024) INSERT [dbo].[tblImageSuggestions] ([CounterID], [CreatedDateTime], [EmailAddress], [ImageOriginalURL], [ImageOriginalWidthPixels], [ImageOriginalHeightPixels]) VALUES (701031, CAST(0x0000A6AD00055445 AS DateTime), N'[email protected]', N'MyURL2', 450, 450) INSERT [dbo].[tblImageSuggestions] ([CounterID], [CreatedDateTime], [EmailAddress], [ImageOriginalURL], [ImageOriginalWidthPixels], [ImageOriginalHeightPixels]) VALUES (701032, CAST(0x0000A6AD00055489 AS DateTime), N'[email protected]', N'MyURL3', 3000, 3000) INSERT [dbo].[tblImageSuggestions] ([CounterID], [CreatedDateTime], [EmailAddress], [ImageOriginalURL], [ImageOriginalWidthPixels], [ImageOriginalHeightPixels]) VALUES (701033, CAST(0x0000A6AD00055768 AS DateTime), N'[email protected]', N'MyURL2', 1024, 1024) INSERT [dbo].[tblImageSuggestions] ([CounterID], [CreatedDateTime], [EmailAddress], [ImageOriginalURL], [ImageOriginalWidthPixels], [ImageOriginalHeightPixels]) VALUES (701034, CAST(0x0000A6AD00055771 AS DateTime), N'[email protected]', N'MyURL1', 450, 450) INSERT [dbo].[tblImageSuggestions] ([CounterID], [CreatedDateTime], [EmailAddress], [ImageOriginalURL], [ImageOriginalWidthPixels], [ImageOriginalHeightPixels]) VALUES (701035, CAST(0x0000A6AD0005577A AS DateTime), N'[email protected]', N'MyURL4', 768, 768) SET IDENTITY_INSERT [dbo].[tblImageSuggestions] OFF

qaru.site

t-sql – удалить только второе значение MS SQL Server

я хотел бы запустить sql-инструкцию, которая будет удалять ТОЛЬКО второе значение, например

Я хочу, чтобы этот оператор удалял ТОЛЬКО второе значение

я хотел бы уточнить. У меня есть поле под названием field1 которое является field1 и оно является первичным ключом, и оно увеличивается. я хотел бы удалить запись, содержащую большее число

Вы также можете использовать ROW_NUMBER() SQL-сервера для номера каждой строки и использовать этот номер для выделения только второго элемента для удаления в соответствии с вашим собственным пользовательским заказом во внутреннем запросе ( over (ORDER BY <myKey> asc) ). Это обеспечивает большую гибкость.

DELETE a FROM table1 FROM table1 a JOIN ( select ROW_NUMBER() over (ORDER BY <myKey> asc) as AutoNumber, <myKey> from table1 ) b on a.<myKey> = b.<myKey> WHERE condition1 AND b.AutoNumber = 2

Вы хотите удалить только последний дубликат или все, кроме первого?

Для всех, кроме первого: ( Отредактировано для использования CTE по предложению Мартина.)

with target as (select * from table1 where condition1) delete from target goner where exists (select * from target keeper where keeper.field1 < goner.field1)

Другими словами, если есть другая соответствующая запись с более низким полем1, удалите эту запись.

EDIT: удалить только последнее:

with target as (select * from table1 where condition1) delete from target goner where exists (select * from target keeper where keeper.field1 < goner.field1) and not exists (select * from target missing where missing.field1 > goner.field1)

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

Это было какое-то время (так что мой синтаксис мне не совсем прав), и это может быть не лучшее решение, но «академический» ответ будет примерно таким:

delete from table1 where condition1 and field1 = (select max(field1) from table1 where condition1)

Попробуй это:

DELETE MyTable FROM MyTable LEFT OUTER JOIN ( SELECT MIN(id) as id, Col1, Col2, Col3 FROM MyTable GROUP BY Col1, Col2, Col3 ) as KeepRows ON MyTable.id= KeepRows.id WHERE KeepRows.RowId IS NULL

ОБНОВИТЬ

Хотя это может быть не так «красиво», как у Джеффри, это работает. Из того, что я могу сказать, @ Джеффри не делает. См. Ниже sql (Удалить заменен на SELECT * для демонстрации):

WITH TEMP as ( SELECT 1 as id,'A' as a,'Z' as b UNION SELECT 2,'A','Z' UNION SELECT 3,'B','Z' UNION SELECT 4,'B','Z' ) SELECT * FROM TEMP LEFT OUTER JOIN ( SELECT MIN(id) as id, a, b FROM TEMP GROUP BY a, b ) as KeepRows ON temp.id= KeepRows.id WHERE KeepRows.id IS NULL

sqlserver.bilee.com

sql - T-SQL - удалить все дубликаты, кроме последних (SQL Server 2005)

У меня есть функция T-SQL, которая вытащит все записи, вставленные в основную таблицу за последние 60 минут, и вставляет их в переменную таблицы. Затем у меня есть еще один код, который будет фильтровать этот набор в другую переменную таблицы, которая будет возвращена.

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

EDIT: Извините, я думал, что я был более ясным, чем кажется на самом деле.

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

Например, ниже @table_variable_2 что должно получиться в @table_variable_2:

| ColA | ColB | DateTimeColumn | ColC | --------------------------------------------------- 1 | A | B | 2015-08-24 11:06:14.000 | C | 2 | A | B | 2015-08-24 11:18:58.000 | C | 3 | A | B | 2015-08-24 12:07:45.000 | C | 4 | A2 | B2 | 2015-08-24 12:17:24.000 | C2 | 5 | A2 | B2 | 2015-08-24 13:25:32.000 | C2 | 6 | A3 | B3 | 2015-08-24 14:52:10.000 | C3 | 7 | A3 | B3 | 2015-08-24 14:52:34.000 | C3 | 8 | A3 | B3 | 2015-08-24 14:52:45.000 | C3 | 9 | A3 | B3 | 2015-08-24 14:53:15.000 | C3 | 10 | A3 | B3 | 2015-08-24 14:53:32.000 | C3 |

Это то, что я ожидаю вернуть:

| ColA | ColB | DateTimeColumn | ColC | --------------------------------------------------- 1 | A | B | 2015-08-24 12:07:45.000 | C | 2 | A2 | B2 | 2015-08-24 12:09:35.000 | C2 | 3 | A2 | B2 | 2015-08-24 13:25:32.000 | C2 | 4 | A3 | A3 | 2015-08-24 14:53:32.000 | C3 |

Хорошо, что у вас есть дубликаты, есть шанс, что их много.

EDIT 2: Решено без функции CTE

DELETE @rtrn_tbl FROM @rtrn_tbl AS a INNER JOIN ( SELECT ColA, ColB, MAX(DateTimeColumn) AS MaxDate, ColC FROM @rtrn_tbl GROUP BY ColA, ColB, ColC HAVING COUNT(*) > 2 ) AS b ON a.ColA = b.ColA AND a.ColB=a.ColB and a.ColC = b.ColC WHERE a.DateTimeColumn <> b.MaxDate;

qaru.site