none
Что делать если количество элементов списка больше 5000 RRS feed

  • Вопрос

  • Доброго времени суток.

    Я портал немного запустил и в какое то время у нас Задачи перевалили за 5000. Когда это произошло, я просто увеличил порог до 10к и забыл. Сейчас решил, что с этим надо что-то делать.

    Подскажите пожалуйста, какие варианты есть? Старые задачи Переместить в какой нибудь архив? 

    Спасибо.

    16 апреля 2014 г. 5:21

Ответы

  • Доступно, без кода и в картинках : Archive SharePoint List Items in SP 2010 and 2013

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

    Так же задействуем Information Management PolicyArchive List Items in SharePoint 2010

    16 апреля 2014 г. 6:03
  • Пришлось писать скрипт на powershell. Т.к. я в нем вообще был не силен, пришлось покопаться в интернете, ища отдельные нужные мне куски кода. В итоге получился такой скрипт.

    Он делает следующее: Для нужного количества записей в списке "Задачи" запускается рабочий процесс, который был ранее создан. Т.к. у меня такой рабочий процесс один, то использовал индекс в массиве WorkflowAssociations.

    $site = Get-SPSite("http://portal");
    $web = $site.RootWeb;
    $list = $web.Lists["Задачи"];
    
    for($i=0; $i -lt 5; $i++)
    {
        $tid = $list.Items[$i].ID;
        Write-Host "Задача $tid";
    
        if($list.Items[$i].Workflows.Count -gt 0)
        {
            Write-Host "Уже рабочий процесс запущен для задачи $tid";
            continue;
        }
        Write-Host "Получаем рабочие процессы для задачи $tid";
    
        $workflow = $list.WorkflowAssociations[0];
        
        Write-Host "Запускаем рабочий процесс для задачи $tid";
    
        Write-Host "Статус рабочего процесса для $tid - " $site.WorkflowManager.StartWorkflow($list.Items[$i], $workflow, $workflow.AssociationData, $true).StatusText;
        
        if($Error.Count -gt 0)
        {
            Write-Host "Ошибка при запуске рабочего процесса для задачи $tid - " $Error[0];
            $i=6;
            $Error.Clear();
        }
    }


    Может кому пригодится. Немного добавил выводов, чтобы было видно что делается.


  • так же можно через политики перемещать или удалять

    Планирование политики управления информацией

    16 апреля 2014 г. 5:53
    Модератор

Все ответы

  • Добрый день,

    если у вас правильно настроены представления (т.е. все 5000 элементов не отображаются одновременно, происходит разбивка на страницы или фильтрация) и нет custom event reciever'ов, то в принципе страшного ничего нет. Конечно стоит продумать вопрос архивирования, например перемещать в другой список все задачи за прошедший год.

    Программное ограничение наступает тогда, когда вы превысите лимит - код будет падать с ошибкой (не помню код ошибки, давно уже упирался в лимиты).

    А вообще конечно планирование, структура, метаданные и т.д.

    Почитайте Designing large lists and maximizing list performance

    16 апреля 2014 г. 5:37
  • добрый день

    Списки SharePoint, часть V: работа с большими списками

    Это я прочитал. Там написано как оптимизировать большие списки, но не написано как их уменьшить. В начале статьи написано - не увеличивайте это значение. 
    16 апреля 2014 г. 5:40
  • Добрый день,

    если у вас правильно настроены представления (т.е. все 5000 элементов не отображаются одновременно, происходит разбивка на страницы или фильтрация) и нет custom event reciever'ов, то в принципе страшного ничего нет. Конечно стоит продумать вопрос архивирования, например перемещать в другой список все задачи за прошедший год.

    Программное ограничение наступает тогда, когда вы превысите лимит - код будет падать с ошибкой (не помню код ошибки, давно уже упирался в лимиты).

    А вообще конечно планирование, структура, метаданные и т.д.

    Почитайте Designing large lists and maximizing list performance

    Спасибо. Статью почитаю. А подскажите, как сделать перемещение в другой список задач, за прошлый год?
    16 апреля 2014 г. 5:41
  • так же можно через политики перемещать или удалять

    Планирование политики управления информацией

    16 апреля 2014 г. 5:53
    Модератор
  • Доступно, без кода и в картинках : Archive SharePoint List Items in SP 2010 and 2013

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

    Так же задействуем Information Management PolicyArchive List Items in SharePoint 2010

    16 апреля 2014 г. 6:03
  • Спасибо Вам большое за предоставленную информацию. Буду изучать. Пока большой интерес представляет через политики.
    16 апреля 2014 г. 6:06
  • Еще можно, как вариант, выгрузить в SQL с использованием SQL Server Integration Services (SSIS) - How to Archive SharePoint List Items to SQL Server (хорошая статья многим советую почитать для прокачки).
    16 апреля 2014 г. 6:09
  • Посмотрел и попробовал архивирование записей.

    Немного не подходит, или я пока не догоняю как сделать.

    Мне надо чтобы рабочий процесс перелопатил все задачи в списке (их у меня почти 6000) и те задачи, которые закрыты или отклонены и созданы раньше 2013 года - переместить в отдельный список. 

    Инструкции, что в этой теме - действуют на элементы списка,  при его изменении. А мне надо чтобы был список задач всех, только за 2013 год + 2014. Пусть даже такой рабочий процесс будет запускаться только в ручную.

    Подскажите, как это сделать?

    Через SQL как то очень заморочено, не стал вникать пока.

    Если по одному применять рабочий процесс к старым задачам - они уходят в архив. Ну не буду же я все 5000 задач так вручную проходить(((

  • нашел еще решение на PowerShell

    SharePoint vs Powershell – Moving List Items between folders

    единственно решение нужно еще дорабатывать. В статье идет речь о перемещении элементов в списке (в библиотеку) И еще нужно добавть фильтр, что бы работал по условию.

    посмотрите в эту стророну. 


    P/S/ изучил глубже, этим способом не сделашь.

    Модератор
  • Пришлось писать скрипт на powershell. Т.к. я в нем вообще был не силен, пришлось покопаться в интернете, ища отдельные нужные мне куски кода. В итоге получился такой скрипт.

    Он делает следующее: Для нужного количества записей в списке "Задачи" запускается рабочий процесс, который был ранее создан. Т.к. у меня такой рабочий процесс один, то использовал индекс в массиве WorkflowAssociations.

    $site = Get-SPSite("http://portal");
    $web = $site.RootWeb;
    $list = $web.Lists["Задачи"];
    
    for($i=0; $i -lt 5; $i++)
    {
        $tid = $list.Items[$i].ID;
        Write-Host "Задача $tid";
    
        if($list.Items[$i].Workflows.Count -gt 0)
        {
            Write-Host "Уже рабочий процесс запущен для задачи $tid";
            continue;
        }
        Write-Host "Получаем рабочие процессы для задачи $tid";
    
        $workflow = $list.WorkflowAssociations[0];
        
        Write-Host "Запускаем рабочий процесс для задачи $tid";
    
        Write-Host "Статус рабочего процесса для $tid - " $site.WorkflowManager.StartWorkflow($list.Items[$i], $workflow, $workflow.AssociationData, $true).StatusText;
        
        if($Error.Count -gt 0)
        {
            Write-Host "Ошибка при запуске рабочего процесса для задачи $tid - " $Error[0];
            $i=6;
            $Error.Clear();
        }
    }


    Может кому пригодится. Немного добавил выводов, чтобы было видно что делается.


  • на самом деле не совсем понятно как Вы все же решили свою проблему. Что делает рабочий процесс?Каким способом Вы отбираете исполненые задачи за 2013 год?

    я вот набрасал скипт который:

    1. получает элементы которые отвечает требованию (фильтр CAML)

    2. копирует полученные элементы и их вложения

    3. при желании может удалить исходные элементы 

    $delOldItem = $true #удалять или нет  скопированные элементы из начального списка
    $web = Get-SPWeb http://sites/sites/test/
    $oldList = $web.Lists['1'] #название начального списка
    $newList = $web.Lists['2'] #название нового списка
    $spQuery = New-Object Microsoft.SharePoint.SPQuery
    $spQuery.RowLimit = 100
    $spQuery.Query = '<Where><Eq><FieldRef Name="Title" /><Value Type="Text">item 1</Value></Eq></Where>' #фильтр созданный CamlBuilder
    $listItems = $oldList.GetItems($spQuery)
    
    if ($listItems.Count -ne 0)
    {   
        for ($i=0;$i -le $listItems.Count-1;$i++)
        {   
            Write-host $i
            $item = $listItems[$i]
            Write-host $item.Title / $item.ID
            #создаем новый элемент
            $newItem = $newList.Items.Add()
            #Копируем поля в новый элемент
            foreach( $field in $item.Fields)
            {
               
                if (($newItem.Fields.ContainsField($field.InternalName) -eq $true) -and ($field.ReadOnlyField -eq $false) -and ($field.InternalName -ne "Attachments")) 
                {
                   $newItem[$field.InternalName] = $item[$field.InternalName];
                }
            }
             
                  
            foreach ($fileName in $item.Attachments)
            {
                $file = $item.ParentList.ParentWeb.GetFile($item.Attachments.UrlPrefix + $fileName);
                $imageData = $file.OpenBinary();
                $newItem.Attachments.Add($fileName, $imageData);
            } 
            $newItem.Update()
            if ($delItem -eq $true)
            {
                $item.Delete()
            }
        }
        
       
    }
    $web.Dispose()
    
    

    • Предложено в качестве ответа Andrey Osinniy 7 ноября 2014 г. 16:21
    Модератор
  • на самом деле не совсем понятно как Вы все же решили свою проблему. Что делает рабочий процесс?Каким способом Вы отбираете исполненые задачи за 2013 год?


    1. Рабочий процесс смотрит статусы задачи (Completed, Deferred). А также смотрит когда был создан элемент, и сравнивает с диапазоном дат (от 01.01.2005 00:00:00 до 31.12.2012 23:59:59). 

    2. Скрипт просто запускает каждому элементу обработку данного рабочего процесса. Соответственно если по каким либо условиям элемент не удовлетворяет, то он перемещен не будет.

    Лично для меня этого достаточно. Запустить архивацию задач для каждого элемента списка (почти 6000 элементов). Удовлетворенные условию - будут перемещены в список "Архив задач". 

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

    P.S. Спасибо за скрипт. Но мне подходит через рабочий процесс. 

    P.P.S. Вставлю изображение рабочего процесса.

  • спасибо что поделились опытом.

    единственный минус вашего подхода - это производительность. 

    В вашем случае условие находится в рабочем процессе, и что бы понять архивировать или нет, рабочий процесс должен отработать по ВСЕМ элементам.

    в принципе для запуска раз в год это не важно, а вот если элементов очень много, и архивирование необходимо проводить чаще, то предложенный Вами вариант хорошо отъест ресурсы еще забьет очередь рабочих процессов, что может отразится на выполнении РП запущенных к примеру пользователями.

    Модератор
  • Мне до сих пор не понятно, как работает "Параметры политики управления сведениями". Я создал политику на хранение.

    Как ее запустить на выполнение? Или как она вообще будет работать? 

  • спасибо что поделились опытом.

    единственный минус вашего подхода - это производительность. 

    В вашем случае условие находится в рабочем процессе, и что бы понять архивировать или нет, рабочий процесс должен отработать по ВСЕМ элементам.

    в принципе для запуска раз в год это не важно, а вот если элементов очень много, и архивирование необходимо проводить чаще, то предложенный Вами вариант хорошо отъест ресурсы еще забьет очередь рабочих процессов, что может отразится на выполнении РП запущенных к примеру пользователями.

    Просто у нас sharepoint порталом давно никто особо не занимался. Он был и все туда писали задачи и т.д. 

    Потом у нас задач переросло 5000. Я чтобы не разбираться поднял планку. Дальше стали работать. Вот сейчас хочу все таки привести в хороший вид наш портал. Вот и хочу разгрести что есть. Поэтому мне запустить рабочий процесс и обработать весь список задач что были. 

    Дальше уже будем пользоваться всякими политиками, процессами. С которыми еще надо подразобраться

  • Интересно на концептуальном уровне - неужели в системе, к-рая съедает 16Гб памяти на раз-два, нет легального способа подменить работу со списками с ее данными на что-то без глупого ограничения в эти 5000 элементов? Тот же сиквел не напрягаясь работает с выборками в десятки тысяч элементов при такой памяти.
    6 ноября 2014 г. 11:54
  • Как я понимаю, обращение и так идет не только к одной таблице с данными AllDocs

    но предварительно нужно получить гуид сайта (таблица ALLWebs), потом списка (AllLists), потом только братится за данными AllDocs . а еще есть таблица с правами (Perms), при этом нужно обратится к таблице групп пользователей и таблице ....

    вот казалось бы просто данные, а еще кучу внутренней кухни.

    6 ноября 2014 г. 12:51
    Модератор