|
11.04.2017, 11:24 | #1 |
Участник
|
Очистка больших таблиц DAX
Добрый день, коллеги.
Прошу поделиться опытом по очистке больших таблиц DAX в SQL Server - InventTrans, InventDim, InventsumLogTTS и т.д. InventTrans у нас очень большая, такая, что с ней практически невозможно проводиться какие-то операции (реиндексация, секционирование и т.д.). Есть еще журналы базы данных, которые растут просто стремительно, но старые данные в них никто очищать не хочет под предлогом того, что "могут пригодиться" и точка. Буду благодарен за рекомендации. |
|
11.04.2017, 11:36 | #2 |
Участник
|
Чистил большую таблицу sql скриптом итерациями по 100к строк. Но это был не InventTrans а оборотка по складу, которую интегратор сделал в виде регулярной таблицы.
Насчет "могут пригодиться" и точка можно ответственно заявить что в таком случае бэкап не будет разворачиваться (в приемлемое время) и точка |
|
11.04.2017, 12:05 | #3 |
Banned
|
Удалял InventTrans там, где InventSum была "Closed". Проблематично в том, что InventSum не сообщает, когда именно данный серийный номер был "закрыт" и сопоставлен. В тех же случаях, когда серийные номера или batches не используются, а есть только склады, ситуация еще сложнее, и удаляли только те InventTrans, где ItemId "устарели". При удалении очень рекомендую отключить индексы.
Вот для вдохновения: X++: delete InventDim where exists (select 1 from INVENTSERIAL where INVENTSERIAL.DATAAREAID = 'XXX' AND INVENTDIM.INVENTSERIALID = INVENTSERIAL.INVENTSERIALID) AND not exists (select 1 from inventTrans where InventTrans.InventDimId = InventDim.InventDimId AND InventTrans.DataAreaId = 'XXX') AND INVENTDIM.INVENTSERIALID <> '' AND INVENTDIM.DATAAREAID = 'XXX' X++: insert into INVENTSETTLEMENT (QTYSETTLED, COSTAMOUNTSETTLED, SETTLETRANSID, COSTAMOUNTADJUSTMENT, RECVERSION, RECID, TRANSRECID, INVENTTRANSID, ITEMID, TRANSDATE, VOUCHER, BALANCESHEETACCOUNT, OPERATIONSACCOUNT, CANCELLED, SETTLEMODEL, DIMENSION, DIMENSION2_, DIMENSION3_, DIMENSION4_, DIMENSION5_, DIMENSION6_, DIMENSION7_, BALANCESHEETPOSTING, OPERATIONSPOSTING, ITEMGROUPID, POSTED, SETTLETYPE, DATAAREAID) select SUM(is1.QtySettled), SUM(is1.CostAmountSettled), is1.INVENTTRANSID, SUM(is1.COSTAMOUNTADJUSTMENT), 777, max(is1.RecId), is1.TRANSRECID, is1.INVENTTRANSID, is1.ItemId, is1.TransDate, is1.VOUCHER, is1.BalanceSheetAccount, is1.OPERATIONSACCOUNT, is1.Cancelled, is1.SettleModel, is1.Dimension, is1.Dimension2_, is1.Dimension3_, is1.Dimension4_, is1.Dimension5_, is1.Dimension6_, is1.Dimension7_, is1.BalanceSheetPosting, is1.OperationsPosting, is1.ItemGroupId, is1.Posted, 4, is1.DataAreaId from iSettlement as is1 where exists (select 1 from INVENTTRANS where INVENTTRANS.DATAAREAID = is1.DATAAREAID AND INVENTTRANS.RECID = is1.TRANSRECID AND INVENTTRANS.VALUEOPEN = 0) group by is1.TRANSRECID, is1.INVENTTRANSID, is1.ItemId, is1.TransDate, is1.VOUCHER, is1.BalanceSheetAccount, is1.OPERATIONSACCOUNT, is1.Cancelled, is1.SettleModel, is1.Dimension, is1.Dimension2_, is1.Dimension3_, is1.Dimension4_, is1.Dimension5_, is1.Dimension6_, is1.Dimension7_, is1.BalanceSheetPosting, is1.OperationsPosting, is1.ItemGroupId, is1.Posted, is1.SettleType, is1.DataAreaId GO delete iSettlement where exists (select 1 from INVENTTRANS where INVENTTRANS.DATAAREAID = iSettlement.DATAAREAID AND INVENTTRANS.RECID = iSettlement.TRANSRECID AND INVENTTRANS.VALUEOPEN = 0) AND iSettlement.RecVersion <> 777 X++: IF @TurnOffIndexes = 1 BEGIN ALTER INDEX I_155VoucherIdx ON INVENTJOURNALTRANS DISABLE ALTER INDEX I_155ToTransIdIdx ON INVENTJOURNALTRANS DISABLE ALTER INDEX I_155TransIDIdx ON INVENTJOURNALTRANS DISABLE ALTER INDEX I_155ExciseTariffCodes_INIdx ON INVENTJOURNALTRANS DISABLE ALTER INDEX I_155RecID ON INVENTJOURNALTRANS DISABLE ALTER INDEX I_174ClosedItemDimIdx ON INVENTSUM DISABLE ALTER INDEX I_174DimIdIdx ON INVENTSUM DISABLE ALTER INDEX I_174ClosedQtyIdx ON INVENTSUM DISABLE ALTER INDEX I_174ReservationIdx ON INVENTSUM DISABLE ALTER INDEX I_174ClosedAvailPhysIdx ON INVENTSUM DISABLE ALTER INDEX I_174ItemCloseAvailIdx ON INVENTSUM DISABLE ALTER INDEX I_174RecID ON INVENTSUM DISABLE ALTER INDEX I_698PalletIdIdx ON INVENTDIM DISABLE ALTER INDEX I_698LocationIdIdx ON INVENTDIM DISABLE ALTER INDEX I_698BatchIdIdx ON INVENTDIM DISABLE ALTER INDEX I_698DimIdx ON INVENTDIM DISABLE ALTER INDEX I_698SiteIdx ON INVENTDIM DISABLE ALTER INDEX I_698InventProfileIdx_RU ON INVENTDIM DISABLE ALTER INDEX I_698InventOwnerIdx_RU ON INVENTDIM DISABLE ALTER INDEX I_698GTDIdIdx_RU ON INVENTDIM DISABLE ALTER INDEX I_177StatusItemIdx ON INVENTTRANS DISABLE ALTER INDEX I_177DimIdIdx ON INVENTTRANS DISABLE ALTER INDEX I_177OpenItemIdx ON INVENTTRANS DISABLE ALTER INDEX I_177GoodsInRouteSalesIdx_RU ON INVENTTRANS DISABLE ALTER INDEX I_177GroupRefIdx_RU ON INVENTTRANS DISABLE ALTER INDEX I_177OpenSecCurItemIdx_RU ON INVENTTRANS DISABLE ALTER INDEX I_177GoodsInRouteTransitIdx_RU ON INVENTTRANS DISABLE ALTER INDEX I_177GoodsInRouteDeliveryIdx_RU ON INVENTTRANS DISABLE ALTER INDEX I_177RecId ON INVENTTRANS DISABLE ALTER INDEX I_2938InventTransIdIdx ON INVENTTRANSORIGIN DISABLE ALTER INDEX I_2938ItemIdx ON INVENTTRANSORIGIN DISABLE --ALTER INDEX I_553ItemTypeDateIdx ON INVENTTRANSPOSTING DISABLE ALTER INDEX I_553InventTransOriginIdx ON INVENTTRANSPOSTING DISABLE ALTER INDEX I_173DateVoucherIdx ON INVENTSETTLEMENT DISABLE ALTER INDEX I_173ItemDateIdx ON INVENTSETTLEMENT DISABLE ALTER INDEX I_173ItemVoucherDateIdx ON INVENTSETTLEMENT DISABLE ALTER INDEX I_752BatchIdx ON INVENTBATCH DISABLE ALTER INDEX I_752ItemVendBatchIdx ON INVENTBATCH DISABLE ALTER INDEX I_1204SerialIdx ON INVENTSERIAL DISABLE ALTER INDEX I_1204RFIDTagIdx ON INVENTSERIAL DISABLE END X++: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED PRINT convert(nvarchar, CURRENT_TIMESTAMP) + ' Deleting InventSum, InventDim ' + @ItemId delete INVENTSUM output deleted.INVENTDIMID into @DeletedIds where INVENTSUM.ITEMID = @ItemId and INVENTSUM.DATAAREAID = @DataAreaID delete INVENTDIM from INVENTDIM join @DeletedIds IDs on INVENTDIM.INVENTDIMID = IDs.ID where INVENTDIM.INVENTSERIALID <> '' and INVENTDIM.DATAAREAID = @DataAreaID --and INVENTDIM.INVENTBATCHID <> '' delete @DeletedIds PRINT convert(nvarchar, CURRENT_TIMESTAMP) + ' Deleting InventTrans ' + @ItemId delete INVENTTRANS output deleted.RECID into @DeletedRecIds where INVENTTRANS.ITEMID = @ItemId and INVENTTRANS.DATAAREAID = @DataAreaID PRINT convert(nvarchar, CURRENT_TIMESTAMP) + ' Deleting InventTransOrigin ' + @ItemId delete INVENTTRANSORIGIN output deleted.RECID into @DeletedOriginIds --join @DeletedRecIds IDs on INVENTTRANSORIGIN.RECID = IDs.OriginRecId where INVENTTRANSORIGIN.DATAAREAID = @DataAreaID and INVENTTRANSORIGIN.ITEMID = @ItemId delete INVENTTRANSORIGINPURCHLINE from INVENTTRANSORIGINPURCHLINE join @DeletedOriginIds IDs on INVENTTRANSORIGINPURCHLINE.INVENTTRANSORIGIN = IDs.OriginRecId delete INVENTTRANSORIGINSALESLINE from INVENTTRANSORIGINSALESLINE join @DeletedOriginIds IDs on INVENTTRANSORIGINSALESLINE.INVENTTRANSORIGIN = IDs.OriginRecId delete INVENTTRANSORIGINJOURNALTRANS from INVENTTRANSORIGINJOURNALTRANS join @DeletedOriginIds IDs on INVENTTRANSORIGINJOURNALTRANS.INVENTTRANSORIGIN = IDs.OriginRecId delete INVENTTRANSORIGINJOURNALTRANSRECEIPT from INVENTTRANSORIGINJOURNALTRANSRECEIPT join @DeletedOriginIds IDs on INVENTTRANSORIGINJOURNALTRANSRECEIPT.INVENTTRANSORIGIN = IDs.OriginRecId delete INVENTTRANSORIGINTRANSFER from INVENTTRANSORIGINTRANSFER join @DeletedOriginIds IDs on INVENTTRANSORIGINTRANSFER.ISSUEINVENTTRANSORIGIN = IDs.OriginRecId delete INVENTTRANSORIGINTRANSFER from INVENTTRANSORIGINTRANSFER join @DeletedOriginIds IDs on INVENTTRANSORIGINTRANSFER.RECEIPTINVENTTRANSORIGIN = IDs.OriginRecId -- the most expensive query PRINT convert(nvarchar, CURRENT_TIMESTAMP) + ' Deleting InventTransPosting ' + @ItemId delete INVENTTRANSPOSTING from INVENTTRANSPOSTING --join @DeletedOriginIds IDs on INVENTTRANSPOSTING.INVENTTRANSORIGIN = IDs.OriginRecId where INVENTTRANSPOSTING.DATAAREAID = @DataAreaID and INVENTTRANSPOSTING.ITEMID = @ItemId PRINT convert(nvarchar, CURRENT_TIMESTAMP) + ' Deleting InventTransSettlement ' + @ItemId -- the itemID alone is just too slow delete INVENTSETTLEMENT from INVENTSETTLEMENT join @DeletedRecIds IDs on INVENTSETTLEMENT.TRANSRECID = IDs.RecID where INVENTSETTLEMENT.DATAAREAID = @DataAreaID and INVENTSETTLEMENT.ITEMID = @ItemId |
|
|
За это сообщение автора поблагодарили: Ace of Database (3), Logger (1). |
11.04.2017, 12:18 | #4 |
Участник
|
Журнал базы данных режем регулярно в пакете - оставляем данные за последние полгода.
Если без сводного, то InventsumLogTTS чистить регулярно через deleteCommittedItemId() |
|
11.04.2017, 12:24 | #5 |
Участник
|
|
|
11.04.2017, 12:31 | #6 |
Участник
|
|
|
11.04.2017, 15:24 | #7 |
Участник
|
|
|
11.04.2017, 12:50 | #8 |
Участник
|
А кстати не пробовали подойти с другой стороны. в последнее время на ixbt и подобных ресурсах много обзоров носителей способных обрабатывать чуть ли не полмиллиона IOPS. причем объемы тоже довольно большие. т.е. такому хранилищу большие таблицы должны быть по зубам или это все еще слишком дорого?
|
|
11.04.2017, 13:44 | #9 |
Участник
|
Цитата:
Сообщение от trud
А кстати не пробовали подойти с другой стороны. в последнее время на ixbt и подобных ресурсах много обзоров носителей способных обрабатывать чуть ли не полмиллиона IOPS. причем объемы тоже довольно большие. т.е. такому хранилищу большие таблицы должны быть по зубам или это все еще слишком дорого?
Как вы можете такие вещи предлагать?? |
|
11.04.2017, 13:46 | #10 |
Участник
|
А не рассматривали вариант
1. Пересесть в новую базу с теми же справочниками. или 2. Завести новую компанию. Большие таблички секционировать по коду компании. P.S. Сколько объем InventTrans ? |
|
11.04.2017, 13:51 | #11 |
Участник
|
Цитата:
Если честно, не совсем понимаю - пересесть в новую базу и что? Над новой компанией точно не думали.. |
|
13.04.2017, 21:29 | #12 |
Участник
|
Цитата:
Интересно было бы посмотреть объем других таблиц например InventDim, InventSum, Cust/Vend/Trans/TransOpen. А в целом нужно конечно видеть хотя бы топ 25 тяжелых запросов и знать конфигурацию SQL серверов. Ах, да, чистить быстрее всего с помощью TRUNCATE TABLE https://msdn.microsoft.com/ru-ru/library/ms177570.aspx
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy Последний раз редактировалось ivas; 13.04.2017 в 21:35. |
|
13.04.2017, 22:58 | #13 |
Участник
|
Цитата:
Сообщение от ivas
Ах, да, чистить быстрее всего с помощью TRUNCATE TABLE https://msdn.microsoft.com/ru-ru/library/ms177570.aspx
__________________
любитель портвейна и снов с прокисшей капустой в усах |
|
14.04.2017, 00:43 | #14 |
Участник
|
Тоже неплохой вариант по производительности но после команды DROP TABLE/DATABASE теряется структура таблицы, а отчистка подразумевает удаление только данных
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
11.04.2017, 14:05 | #15 |
Участник
|
Ну как что.
Полегчает резко. База то практически пустая будет. Из транзакционных данных только исходные остатки. |
|
11.04.2017, 14:16 | #16 |
Участник
|
|
|
11.04.2017, 15:33 | #17 |
Участник
|
|
|
11.04.2017, 15:41 | #18 |
Модератор
|
IDMF ?
__________________
-ТСЯ или -ТЬСЯ ? |
|
11.04.2017, 16:08 | #19 |
Участник
|
По моему опыту, сам MS на тех нескольких кейсах, где клиент задавал серьезные вопросы съехал с этой темы, не желая ничего гарантировать, при этом поиск хоть какого-то специалиста по этому инструменту занимал недели.
__________________
Ivanhoe as is.. |
|
11.04.2017, 14:57 | #20 |
Участник
|
330 ГБ не так уж и много. Если вернуться к начальной постановке вопроса - что будет, если ничего не делать?
__________________
Ivanhoe as is.. |
|