Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как получить план выполнения триггера или как сравнить триггеры  [new]
туплю
Guest
нужно написать триггер, который предотвращает удаление,
если пытаются удалить строки с flag > 1.

у меня пока 2 варианта, на вид первый должен дольше выполняться,
зато он стандартный, второй же использует спец. удаление в T-SQL.
не знаю как сравнить планы.
create trigger del_test
on test
instead of delete
as
if exists (select 1 
           from deleted 
           where flag > 1)
   raiserror ('...', 16, 1)
else
   delete from test
    where exists (select 1 
                    from deleted as d
                   where d.id_date = test.id_date 
                     and d.flag = test.flag
                     and d.num_prat = test.num_prat)
-----

create trigger del_test
on test
instead of delete
as
if exists (select 1 
           from deleted 
           where flag > 1)
   raiserror ('...', 16, 1)
else
   delete from test
               from test join deleted as d
                   on d.id_date = test.id_date 
                     and d.flag = test.flag
                     and d.num_prat = test.num_prat

в таблице первичный ключ id_date, flag, num_prat.
соотношение строк: всего 80 000 000,
из них сейчас только 3 000 000 строк с flag <= 1,
т.е. которые можно удалять.
каждую неделю еще 200 000 строк подваливают.

а удаление могут запросить любое,
вообще чаще случается, что удаляют то, что можно.
в любом случае работает часами.
как вообще можно сравнивать быстродействие триггеров?
просто сидеть с секундомером? так спасибо, когда вообще удаление за 8 часов отработает...
20 фев 12, 16:04    [12123950]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
Glory
Member

Откуда:
Сообщений: 104751
туплю
как вообще можно сравнивать быстродействие триггеров?

Сравнить планы, например

туплю
просто сидеть с секундомером? так спасибо, когда вообще удаление за 8 часов отработает...

Использовать Profiler
20 фев 12, 18:17    [12125660]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
туплю
Guest
Glory,

так нет плана без delet-а.
а delete это очень надолго,
и чтоб снова на тех же данных другой вариант проверить,
это ж надо снова данные восстановить, это снова на всю ночь.
короче, оба за 1 ночь не проверить, а днем нельзя трогать.
ALTER TRACE нет.
20 фев 12, 18:24    [12125717]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
Glory
Member

Откуда:
Сообщений: 104751
туплю
Glory,

так нет плана без delet-а.
а delete это очень надолго,

В смысле "долго" ? Одна запись удаляется днями и годами ?
20 фев 12, 18:27    [12125741]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
туплю
Guest
Glory,

а зачем мне на 1 запись-то, никто по одной и не удаляет.
а если выдрать из триггера и deleted заполнить (ну сделать with deleted as (select ...) ),
то планы разные, смотря сколько в это deleted кладу с flag > 1.
20 фев 12, 18:32    [12125767]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
туплю,

можно отловить план выполняющегося запроса, не дожидаясь его завершения
sp_who2 -> sys.dm_exec_requests -> sys.dm_exec_query_plan()

ну или поискать в sys.dm_exec_cached_plans, если запрос уже выполнялся
20 фев 12, 18:33    [12125775]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
Glory
Member

Откуда:
Сообщений: 104751
туплю
а зачем мне на 1 запись-то, никто по одной и не удаляет.

Для получения плана ?

туплю
а если выдрать из триггера и deleted заполнить (ну сделать with deleted as (select ...) ),

Это не одно и тоже
20 фев 12, 18:33    [12125777]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
туплю
Guest
Shakill,

select * from sys.dm_exec_query_plan(0x020000005B7A3A210C1B9AEEC5467BB6AFC4BA74F1C4964A);

select *
from sys.dm_exec_cached_plans;
прав не хватает. оба дают
The user does not have permission to perform this action.

Glory,
а какая разница между "удалить одну запись" или же заполнить сразу себе deleted одной записью?
и как все-таки для кучи записей планы получить?
20 фев 12, 18:43    [12125805]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
Glory
Member

Откуда:
Сообщений: 104751
туплю
а какая разница между "удалить одну запись" или же заполнить сразу себе deleted одной записью?
и как все-таки для кучи записей планы получить?

Разница в том, что виртуальные таблицы deleted/inserted - это не ваша эмуляция с вложенным неизвестным запросом
20 фев 12, 18:47    [12125818]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
туплю
Shakill,
прав не хватает. оба дают
The user does not have permission to perform this action.
ну если вы хранимый код создаете и отлаживаете, эти права вам пригодятся. надо раздобыть
20 фев 12, 18:53    [12125839]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
А может проще как-то так:

USE FOLIOBASE;

alter trigger dbo.all_artc on dbo.all_artc_before_20june2011 for delete 
as
if exists (select * from deleted where COUNTRY = 'Тайвань')
rollback tran
;


Может, и некузяво, но...


PS Хм, а вот если убивается НЕ ОДНА строка а несколько, причём в части из них стоит флаг, а в другой - флаг сброшен?
21 фев 12, 02:20    [12127114]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
туплю
Guest
SIMPLicity_,
именно что если хоть в одной строке удаляется то, что нельзя,
никакого удаления не должно быть.
поэтому и проверяю перед удалением.
а Вы вот сперва удалите на 6 часов, а потом еще и такой же роллбэк на другие 6 часов
21 фев 12, 11:55    [12128649]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
Glory
Member

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

А просто отфильтровать при удалении эти записи ?
21 фев 12, 12:01    [12128722]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
туплю
Guest
да дурдом какой-то.
стала еще раз уточнять, чего же надо-то,
оказалось, таблица вообще партиционированная.
я вообще такое только в теории и слышала.
сейчас надо срочно читать,
а как вообще можно было сходу увидеть, что партиционирована?
и где живет функция партиционирования?
короче, иду читать на тему и про ALTER TRACE выскаала,
что совсем охренели что-то хотеть, если я ничего не вижу.
еще и отпираются, что первый раз слышат, что не надо быть админом,
чтоб поиметь ALTER TRACE .
21 фев 12, 12:23    [12128930]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
туплю
а как вообще можно было сходу увидеть, что партиционирована?
Да просто в SSMS свойства таблицы посмотреть или сгенерить её скрипт.
21 фев 12, 14:45    [12130518]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
туплю
Guest
alexeyvg,

уже нашла вообще все партиционированные таблицы в своей базе,
чтоб больше так не попадать.
прочитала в общем виде партиционирование и посмотрела, что делается в этой таблице.
прямо секрет военный.
сперва абстрактно попросили написать триггер, где святая колонка flag.
я на своей тестовой таблице и написала.
теперь секрет приоткрыли, показав реальную таблицу.
никакой не flag, колонка для проверки это номер партиции.
причем почему-то нельзя удалять, где номер партиции > 1.
а у самих разбито так, что в 1-ую слито по 199912.
никак не пойму, если данные до 199912 нужны, то почему можно их удалять.
если не нужны, то зачем их хранят.
можно ли как-то вообще использовать, что таблица партиционная и сделать все партиции read-only,
кроме первой и последней?
в последнюю дописывают, ок.
из первой почему-то можно удалять, тоже пусть будет ок.
можно ли остальные партиции без всякого триггера защитить от удаления
(и наверняка сейчас еще выяснится, что и от обновления)?

CREATE PARTITION FUNCTION [PF_...](int) AS RANGE LEFT FOR VALUES (199912, 200401, 200402, 200403, 200404, 200405,... 
21 фев 12, 15:02    [12130752]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
туплю
Guest
можно еще вопрос по ходу дела?
нарыла вообще все процедуры, удаляющие из этой таблицы.
таблица разбита по колонке year_month_partition,
а удаление идет, например, за вчерашний день, если это не последнее число месяца.
т.е. там в стоит
where ID_DATA=@id_data_last

надо ж наверное высчитать номер партиции (ну т.е. yyyymm) и его в where добавить?
6 часов-то поди потому удаляет, что по всей таблице шарит...
сервер ограничится одной партицией, если условие будет
where ID_DATA=@id_data_last and year_month_partition = ...
?
21 фев 12, 15:41    [12131152]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
Да нет, там судя по всему за вас уже подумали. Просто забудьте про свои мысли. Если 6 часов удаляется информация из буферной таблицы, то конечно инстэд- лучше чем афта- триггер. Хотя что там такого черезжопу написано, что удаляется 6 часов (в одной транзакции!) в секционированной таблице? Тем более, что секционирование как раз по требуемому параметру... Может там ещё какая херь на таблице висит - типа на delete висит ещё один триггер и он все удаляемые записи пересылает в другую базу (на дргой сервер?) или логирует операцию удаления? У меня был похожий момент, когда сам повесил логирующий тригер и потом сам же из этой таблицы массово записи начал удалять. И сам же возмущался: "Фигасе какой сервак оказывается медленный", - ....
21 фев 12, 19:09    [12132738]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
туплю
Guest
SIMPLicity_,
там оказывается было условие and year_month_partition = ...,
просто мне дали "усовершенствованную" версию, где условие потерли.
процедуру правили неск. человек,
один сделал что-то через switch partition, но это не пустили в продакшн,
а сейчас он в отпуске, и таинственно пропало условие.
я когда про условие спросила, мне подтвердили, что было.
наверное он перед уходом решил народ проучить, а может вообще не он постарался.
еще там 14 неуникальных индексов, т.е. еще 14 раз по 80000000 строк,
и модель фулл. может оно и нормально, 6 часов
21 фев 12, 22:59    [12133783]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
туплю
Guest
SIMPLicity_
Просто забудьте про свои мысли.

кстати и наплевала.
я как должна отгадывать, что у них в продакшене,
если я его в глаза не вижу?
именно что, может у них триггер на триггере.
считайте, для себя спрашивала.
знаю уже даже кто партициями занимался, пусть его из отпуска и ждут
21 фев 12, 23:10    [12133819]     Ответить | Цитировать Сообщить модератору
 Re: как получить план выполнения триггера или как сравнить триггеры  [new]
Crimean
Member

Откуда:
Сообщений: 13147
туплю,

не есть большой проблем обеспечить "клон" продуктива как минимум по структуре и объектам. где можно и нужно проверять такие вещи. одна проблема - обеспечить схожее респределение данных. но если позволяют обстоятельства то продуктив типа раз в неделю (условно) поднимают для опытов девелоперам. а то ничего толкового действительно не получится
21 фев 12, 23:14    [12133831]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить