Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление дубликатов - страшно долго / 25 сообщений из 43, страница 1 из 2
25.09.2018, 11:29
    #39707531
pavell450
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
Здравствуйте, прошу помощи у старших товарищей.
Дано: MS SQL Server 2014
Запрос
DELETE FROM MATERIAL WHERE MATERIALID NOT IN ( SELECT min(MATERIALID) as ID FROM MATERIAL GROUP BY RATE, TITLE , RESCODE )
Выполняется 6-10 часов...

Таблица MATERIAL содержит 75 933 записей
Выборка SELECT min(MATERIALID) as ID FROM MATERIAL GROUP BY RATE, TITLE , RESCODE
дает 43 228 записей.
Индекс в таблице MATERIAL один - MATERIALID

Вопрос знатокам:
Корректен ли такой запрос для удаления дубликатов?
за 10 часов удалено 3600 записей...
Может быть надо что-то настроить на сервере, в структуре БД? Индекс создать...
Или нужно переписать запрос полностью, революционно?
Заранее признателен всем, кто откликнется.
...
Рейтинг: 0 / 0
25.09.2018, 11:31
    #39707532
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
pavell450,

если не брать в расчёт сам запрос, то FK много на эту таблицу?
...
Рейтинг: 0 / 0
25.09.2018, 11:31
    #39707533
KRS544
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
скопируйте нужные данные в новую таблицу, потом переименуйте.
...
Рейтинг: 0 / 0
25.09.2018, 11:38
    #39707535
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
pavell450,

выполните в базе и покажите результат:

Код: sql
1.
2.
exec sp_spaceused MATERIAL
exec sp_helpindex MATERIAL
...
Рейтинг: 0 / 0
25.09.2018, 11:39
    #39707537
pavell450
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
TaPaK,
FK не очень много, но полагаю причина задержек не в удалении записей.
Запрос 10ти самых тяжелых запросов пишет про 1 643 789 196 логических считываний при 3771 записях.
Время CPU 83 154 070
Разработчик говорит, что есть еще одна подчиненная таблица.
...
Рейтинг: 0 / 0
25.09.2018, 11:43
    #39707545
pavell450
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
komrad,
name rows reserved data index_size unused
MATERIAL 89433 117064 KB 116448 KB 544 KB 72 KB


index_name index_description index_keys
PK__MATERIAL__278B51D51F4E3A40 clustered, unique, primary key located on PRIMARY MATERIALID
...
Рейтинг: 0 / 0
25.09.2018, 11:44
    #39707547
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
pavell450TaPaK,
FK не очень много, но полагаю причина задержек не в удалении записей.
Запрос 10ти самых тяжелых запросов пишет про 1 643 789 196 логических считываний при 3771 записях.
Время CPU 83 154 070
Разработчик говорит, что есть еще одна подчиненная таблица.
или создавать индекс в таблицах с FK на поле REFERECE MATERIALID? или удалять(хотя совет так себе :))
...
Рейтинг: 0 / 0
25.09.2018, 11:55
    #39707559
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
pavell450,

а это ?

Код: sql
1.
2.
3.
4.
5.
6.
select name 
from sys.objects 
where type ='TR'
and parent_object_id=object_id('MATERIAL')

exec sp_depends MATERIAL 
...
Рейтинг: 0 / 0
25.09.2018, 11:57
    #39707560
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
pavell450TaPaK,
FK не очень много, но полагаю причина задержек не в удалении записей.


проверьте, может с таблицей работают другие сессии

http://whoisactive.com/downloads/
...
Рейтинг: 0 / 0
25.09.2018, 11:58
    #39707562
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
komradpavell450TaPaK,
FK не очень много, но полагаю причина задержек не в удалении записей.


проверьте, может с таблицей работают другие сессии

http://whoisactive.com/downloads/

1 643 789 196 логических считываний. Это сканы таблиц с FK, может там ещё и индексированные представляния... Ну и да наличие триггера.
...
Рейтинг: 0 / 0
25.09.2018, 13:04
    #39707631
pavell450
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
komrad,


name
trigger_unique_item_code_material

name
dbo.trigger_unique_item_code_material
...
Рейтинг: 0 / 0
25.09.2018, 13:26
    #39707653
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
pavell450Таблица MATERIAL содержит 75 933 записей
Выборка SELECT min(MATERIALID) as ID FROM MATERIAL GROUP BY RATE, TITLE , RESCODE
дает 43 228 записей.Это копейки.

Покажите план запроса в формате sqlplan. Тогда не придется гадать, что там у вас творится при выполнении.
...
Рейтинг: 0 / 0
25.09.2018, 13:34
    #39707661
pavell450
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
TaPaK,
Проверка ничего не показала.
Оно и понятно - система пока не под нагрузкой. Пользователей нет, запросов нет.
...
Рейтинг: 0 / 0
25.09.2018, 13:40
    #39707671
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
pavell450komrad,


name
trigger_unique_item_code_material

name
dbo.trigger_unique_item_code_material

покажите текст этого триггера
...
Рейтинг: 0 / 0
25.09.2018, 13:41
    #39707672
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
pavell450TaPaK,
Проверка ничего не показала.
Оно и понятно - система пока не под нагрузкой. Пользователей нет, запросов нет.
а что вы проверяли?
...
Рейтинг: 0 / 0
25.09.2018, 13:53
    #39707682
лолл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
pavell450komrad,


name
trigger_unique_item_code_material

name
dbo.trigger_unique_item_code_material

Код: sql
1.
2.
3.
ALTER TABLE MATERIAL DISABLE TRIGGER dbo.trigger_unique_item_code_material;
DELETE FROM MATERIAL WHERE MATERIALID NOT IN (SELECT min(MATERIALID) as ID FROM MATERIAL GROUP BY RATE, TITLE, RESCODE);
ALTER TABLE MATERIAL ENABLE TRIGGER dbo.trigger_unique_item_code_material;

?
...
Рейтинг: 0 / 0
25.09.2018, 14:33
    #39707718
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
pavell450Запрос
DELETE FROM MATERIAL WHERE MATERIALID NOT IN ( SELECT min(MATERIALID) as ID FROM MATERIAL GROUP BY RATE, TITLE , RESCODE )
Выполняется 6-10 часов...

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

Код: sql
1.
2.
3.
delete t
from MATERIAL as t
WHERE not exists( select * from MATERIAL as t1 where t1.MATERIALID < t.MATERIALID and t1.RATE = t.RATE and t1.TITLE  = t.TITLE  and t1.RESCODE = t.RESCODE )


Особую прыть это проявит, если есть индекс

(RATE, TITLE, RESCODE, MATERIALID )

если же до зарезу хоцца по вашему

Код: sql
1.
2.
3.
create table #IDs (ID int primary key);
insert #IDs with(tablockx) SELECT min(MATERIALID) as ID FROM MATERIAL  GROUP BY RATE, TITLE, RESCODE order by 1;
DELETE FROM MATERIAL WHERE MATERIALID NOT IN ( SELECT  ID FROM #IDs );
...
Рейтинг: 0 / 0
25.09.2018, 16:27
    #39707830
pavell450
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
komrad,
Текст триггера:

USE [test]
GO
/****** Object: Trigger [dbo].[trigger_unique_item_code_material] Script Date: 9/25/2018 4:24:22 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER trigger [dbo].[trigger_unique_item_code_material] on [dbo].[MATERIAL]

FOR INSERT ,UPDATE
AS

SET NOCOUNT ON;
DECLARE @tempRes VARCHAR(max)
DECLARE @tempId bigint
DECLARE @TempString VARCHAR(max)
DECLARE my_Cursor CURSOR LOCAL FAST_FORWARD FOR SELECT RESCODE,MATERIALID FROM INSERTED;
OPEN my_Cursor
FETCH NEXT FROM my_Cursor into @tempRes,@tempId

WHILE @@FETCH_STATUS = 0

BEGIN
IF ( CHARINDEX( '_N_VALID',@tempRes) = 0)
IF EXISTS ( SELECT before.RESCODE
FROM ( SELECT * FROM dbo.MATERIAL AS a WHERE a.MATERIALID NOT IN(SELECT o.MATERIALID FROM inserted o ) ) AS before
WHERE before.RESCODE=@tempRes )
UPDATE a SET a.RESCODE = a.RESCODE+'_N_VALID' FROM dbo.MATERIAL a WHERE a.MATERIALID = @tempId
FETCH NEXT FROM my_Cursor into @tempRes,@tempId
END
...
Рейтинг: 0 / 0
25.09.2018, 16:29
    #39707832
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
Дальше FOR INSERT ,UPDATE лучше не читать
...
Рейтинг: 0 / 0
25.09.2018, 16:30
    #39707835
pavell450
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
TaPaK,
Был запрос "проверьте, может с таблицей работают другие сессии http://whoisactive.com/downloads/ "
= проверка показала, что других сессий нет
...
Рейтинг: 0 / 0
25.09.2018, 16:31
    #39707838
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
pavell450TaPaK,
Был запрос "проверьте, может с таблицей работают другие сессии http://whoisactive.com/downloads/ "
= проверка показала, что других сессий нет
давайте план, уже ж сказали.
...
Рейтинг: 0 / 0
25.09.2018, 16:40
    #39707854
pavell450
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
aleks222Вам, батенька, в управдомы надоть переквалифицироваться.

Примерно так и есть, ибо - не разработчик, поддержка, смотрю на черный-черный ящик сбоку, из SQL.
Спасибо за пример скрипта, попробую убедить творцов, что есть иные способы удаления дубликатов ...
...
Рейтинг: 0 / 0
25.09.2018, 16:58
    #39707875
pavell450
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
TaPaK,

План найти пока не могу, как будто нет такого запроса.
Внутрь системы доступа нет.
...
Рейтинг: 0 / 0
25.09.2018, 18:17
    #39707922
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
pavell450План найти пока не могу,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
 t.text, qp.query_plan
from
 sys.dm_exec_query_stats qs cross apply
 sys.dm_exec_query_plan(qs.plan_handle) qp cross apply
 sys.dm_exec_sql_text(qs.sql_handle) t
where
 t.text like N'%DELETE%FROM%MATERIAL%WHERE%MATERIALID%NOT%IN%'
option
 (recompile);


pavell450Спасибо за пример скриптаВ основном там бред написан.

Как удалить за один проход по таблице:
Код: sql
1.
2.
3.
4.
5.
with t as
(
 select row_number() over (partition by RATE, TITLE, RESCODE order by MATERIALID) as rn from MATERIAL
)
delete t where rn > 1;


Если это разовое действие, то можно оставить как есть. Таблица у вас слишком уж маленькая, чтобы показанная форма delete приводила к таким проблемам.
В общем, план нужен. Иначе можно много чего напредполагать.
...
Рейтинг: 0 / 0
25.09.2018, 18:58
    #39707939
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление дубликатов - страшно долго
invmВ основном там бред написан.

Как удалить за один проход по таблице:[src]
with t as
(
select row_number() over (partition by RATE, TITLE, RESCODE order by MATERIALID) as rn from MATERIAL
)
delete t where rn > 1;


Откровение Иоанна-программизда?
Сортировать и нумеровать ВСЕ записи внезапно стало быстрее?
О темпора, о морес!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление дубликатов - страшно долго / 25 сообщений из 43, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]