[Sitecore][SPE] SPE 使って、素早くアイテムを削除
検証環境は次の通りです。
- Sitecore Experience Platform 9.0 rev. 180604 (9.0 Update-2)
- Sitecore PowerShell Extensions 5.0
[space size=”20″]
概要:
ローカルの環境にて開発中、時にはデバッグでコードをステップしてい行くことがよくあります。
ただ、もし、コンテンツにあまりにもたくさんのアイテムがある場合はこの作業が時間がかかります。
特に製品のカタログのような、万以上のアイテムがある場合は、たくさんのアイテムをSPEを使って
いかに早く削除するメモ書きです。
[space size=”10″]
よく使われているのは下記の三つです。
[space size=”10″]
1.SQLデーターベースクエリ
http://sitecoreexperiences.blogspot.com/2017/11/deleting-sitecore-items-in-sql-proceed.html
これは同僚の先輩が書いたクエリです。直接データーベースにてアイテムを削除するので早いです。これは私はプロダクションの環境にて使用することを極めて勧めません。ローカルの環境でディバグの際に便利です。基本的にデータベース内のアイテムデータを直接操作することはお勧めできません。これは走る前にバックアップを取りましょう。また完了後、リンクデータベースの再構築をしましょう。
[space size=”10″]
2.アドメインツールのデーターベースブラウザー
http://sc902.local/sitecore/admin/dbbrowser.aspx
これは、コンテントエディタトラベルと早です。ただ、同じく直接データーベースにてアイテムを削除するので使用する際に要注意です。同じく、走る前にバックアップを取りましょう。また完了後、リンクデータベースの再構築をしましょう。
[space size=”10″]
3.SPE
[space size=”10″]
SPEにてアイテムを削除を簡単にできます。使用するコードによって速度も多少違ってきます。
[space size=”10″]
テストで2000のサブアイテムを削除します。91秒かかります。
[space size=”10″] コード:[space size=”10″]
Measure-Command { $items = Get-ChildItem -Path "master:/sitecore/content/Home/TestB" -Recurse | Where-Object {$_.TemplateID -match "{76036F5E-CBCE-46D1-AF0A-4143F9B557AA}"} write-host "Total to be removed: "$items.count; foreach ($item in $items) { $item | Remove-Item; } write-host "Done!! Time Spent(Seconds):" -NoNewline }| Select-Object -Expand TotalSeconds
[space size=”20″]
テストで2000のサブアイテムを削除します。オプションのPermanentlyを使って、80秒です。
[space size=”10″]
[space size=”10″] コード:[space size=”10″]
Measure-Command { $items = Get-ChildItem -Path "master:/sitecore/content/Home/Test1" -Recurse | Where-Object {$_.TemplateID -match "{76036F5E-CBCE-46D1-AF0A-4143F9B557AA}"} write-host "Total to be removed: "$items.count; foreach ($item in $items) { $item | Remove-Item -Permanently; } write-host "Done!! Time Spent(Seconds):" -NoNewline }| Select-Object -Expand TotalSeconds
[space size=”20″]
テストで2000のサブアイテムを削除します。
Sitecore.Data.BulkUpdateContext ブロックを使って、速度が56秒です。
[space size=”10″]
[space size=”10″] コード:[space size=”10″]
Measure-Command { New-UsingBlock (New-Object Sitecore.Data.BulkUpdateContext) { $items = Get-ChildItem -Path "master:/sitecore/content/Home/Test" -Recurse | Where-Object {$_.TemplateID -match "{76036F5E-CBCE-46D1-AF0A-4143F9B557AA}"} write-host "Total to be removed: "$items.count; foreach ($item in $items) { $item | Remove-Item; } write-host "Done!! Time Spent(Seconds):" -NoNewline } }| Select-Object -Expand TotalSeconds
Sitecore.Data.BulkUpdateContext は大量なデータを扱う場合に使用されています。
これを使用することで、それぞれのアイテムのCRUDにて、インデックスまたイベントの発生を止めることで速度を上げます。
Get-SearchIndex -Name sitecore_master_index | Suspend-SearchIndex New-UsingBlock (New-Object Sitecore.Data.Events.EventDisabler){ New-UsingBlock(New-Object Sitecore.SecurityModel.SecurityDisabler){ #upadte here } } Get-SearchIndex -Name sitecore_master_index | Resume-SearchIndex }