Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SharePoint リスト Deep Dive / Deep-dive on SharePo...
Search
Takashi Shinohara
November 19, 2016
Programming
0
850
SharePoint リスト Deep Dive / Deep-dive on SharePoint list
(2017/11/30) ロック エスカレーションに関する記載について修正しました。
Takashi Shinohara
November 19, 2016
Tweet
Share
More Decks by Takashi Shinohara
See All by Takashi Shinohara
Power Automate のパフォーマンス改善レシピ / Power Automate Performance Improvement Recipes
karamem0
0
320
どっちの API SHOW?SharePoint 開発における SharePoint REST API Microsoft Graph API の違い / Which API show? Differences between Microsoft Graph API and SharePoint REST API
karamem0
0
990
Microsoft Ignite 2024 最新情報!Microsoft 365 Agents SDK 概要 / Microsoft Ignite 2024 latest news Microsoft 365 Agents SDK overview
karamem0
0
480
徹底解説!Microsoft 365 Copilot の拡張機能 / Complete guide to Microsoft 365 Copilot extensions
karamem0
1
4.1k
Microsoft Search の Graph コネクタ ハンズオン / Handson for Graph Connector of Microsoft Search
karamem0
0
170
いまだから「検索」を語ろう! SharePoint FAST Search から Microsoft Search セマンティックインデックスまで / Let's talk about search now
karamem0
3
1.6k
徹底解説!Power Platform 導入の成功事例から見る DX 推進のコツ / Tips for DX promotion from Power Platform case studies
karamem0
0
5.3k
どうする Power Pages?Web 開発者からみる Power Pages / How to deal with Power Pages
karamem0
0
1.4k
Fluent UI を理解する / Understanding Fluent UI
karamem0
0
1.1k
Other Decks in Programming
See All in Programming
今だからこそ入門する Server-Sent Events (SSE)
nearme_tech
PRO
3
250
AIでLINEスタンプを作ってみた
eycjur
1
230
速いWebフレームワークを作る
yusukebe
5
1.7k
Ruby×iOSアプリ開発 ~共に歩んだエコシステムの物語~
temoki
0
350
テストカバレッジ100%を10年続けて得られた学びと品質
mottyzzz
2
610
Deep Dive into Kotlin Flow
jmatsu
1
360
請來的 AI Agent 同事們在寫程式時,怎麼用 pytest 去除各種幻想與盲點
keitheis
0
130
為你自己學 Python - 冷知識篇
eddie
1
350
ファインディ株式会社におけるMCP活用とサービス開発
starfish719
0
2k
Laravel Boost 超入門
fire_arlo
3
220
1から理解するWeb Push
dora1998
7
1.9k
ProxyによるWindow間RPC機構の構築
syumai
3
1.2k
Featured
See All Featured
Optimizing for Happiness
mojombo
379
70k
Raft: Consensus for Rubyists
vanstee
140
7.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
131
19k
It's Worth the Effort
3n
187
28k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
Site-Speed That Sticks
csswizardry
10
820
Gamification - CAS2011
davidbonilla
81
5.4k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
The Straight Up "How To Draw Better" Workshop
denniskardys
236
140k
We Have a Design System, Now What?
morganepeng
53
7.8k
Into the Great Unknown - MozCon
thekraken
40
2k
Transcript
SharePoint リスト Deep Dive 篠原敬志 (@karamem0)
自己紹介 • 篠原敬志 (Takashi Shinohara) • Twitter: @karamem0 • Blog:
からめもぶろぐ。(http://blog.karamem0.jp) 2
はじめに • SharePoint は自由にカスタマイズ可能であることが大きなメリットです。 SharePoint を基盤としたシステム開発が数多く行われています。 • しかし SharePoint には製品独自のクセがあるため、通常の
ASP.NET 開発と同 じ手法だと、動かないシステムを構築してしまうことになります。 • 中でも特に重要なリストとの上手な付き合い方を紹介します。 3
スコープ 4 論理層 ファーム Web アプリケーション サイト コレクション サイト リスト/ライブラリ
物理層 サーバー IIS コンテンツ データベース テーブル オブジェクト SPFarm SPWebApplication SPSite SPWeb SPList
リスト≠データベース 5
リストを使うメリット • データ型 • フォーム / ビュー • アクセス許可 •
ワークフロー / イベントレシーバー 6
リストの実体 • リスト定義は [dbo].[AllLists] テーブル • Schema.xml の内容も圧縮バイナリ データとして格納されている •
リスト データは [dbo].[AllUserData] テーブル • 汎用的に入る設計 • bit1~bit1000、datetime1~datetime550、float1~float550、 int1~int750、ntext1~ntext262、nvarchar1~nvarchar262 • スパース列なので tp_ColumnSet を参照すればデータが入っている列だけを XML 形式で取得可能 7
リスト データの取得プロセス (ざっくり) 8 AllLists テーブルからリスト スキーマを取得 AllUserData テーブルからリスト データを取得
アクセス許可にしたがってフィルター リスト スキーマとリスト データをマッピング
リスト データの取得は時間がかかる 9
リスト データの取得のベスト プラクティス • リストにインデックスを付ける • 実際のプロジェクトでは 2 割程度の改善実績 •
CAML を使用する • SPList.Items は全部のデータを見に行ってしまうので CAML を使って取得する 内容を最低限にする • SPListItemCollectionPosition を使ってページングする • CAML よりは LINQ to SharePoint のほうがいいかも • リストへの直接アクセスをやめる • バッチやイベント レシーバーでリスト データをデータベースにコピー • データベース?そこに SQL Server があるじゃろ( ^ω^) 10
5000 件問題 • 5000 件を超えるリストに対してさまざまな制約がかかる • 根本的には SQL Server のロックのエスカレーションが原因
• [dbo].[AllUserData] には 1 以上のサイト コレクションのリスト データが含まれる ので表ロックされるととんでもないことに • 実際はロック エスカレーションが発生する前に WebApplication のしきい値でブ ロックされる 11
ただし SharePoint 2010 まで SharePoint 2013 ではロック エスカレーションは無効化されている 12
5000 件問題のベスト プラクティス • リストを細かい単位で分割する • 年度ごと、組織ごと、etc... • サイトごとテンプレート化しておけば展開も簡単 •
コンテンツ データベースの容量も気にする場合はサイト コレクションを分割する • コンテンツ クエリ検索を使用する • リストが分割されていてもクエリは 1 つ • リアルタイムを要求される検索には不向き • 事前に管理プロパティを登録しておく必要がある • どうしてもリストを分割できない場合はしきい値を変える • ただし SharePoint Online ではできない 13
リストのリレーション • SharePoint の参照列は他のリストにリレーションを持つことが可能 • ただし データベースのリレーションと同じと思っていると死にます (※死にました) 14
リストのリレーションの制約 • 参照は片方向のみ、逆方向は参照できない • 参照先のリストで使える列は 1 つのみ • 1 つのリストに設定できる参照列は
12 まで (変更可) • カスケード (参照整合性) はできる 15
リストのリレーションのベスト プラクティス • リストは正規化しない • リストを分割すると検索にも影響あり • ただしあまり列を作りすぎると SQL Server
で複数行が作成されパフォーマンス が悪くなるので注意 • リレーションの代わりに選択肢列や用語セットを使用する 16
まとめ • リスト≠データベース • リストはテーブルと非常によく似ているが、SharePoint 特有の制限があるため、慎 重に設計しないと面倒なことに • メリットもあるのでご利用は計画的に 17
参考リンク • 大きなリストを設計し、リストのパフォーマンスを最大限に高める (SharePoint Server 2010) https://technet.microsoft.com/ja-jp/library/cc262813.aspx • ソフトウェアの境界と制限 (SharePoint
2013) https://technet.microsoft.com/ja-jp/library/cc262787.aspx • ロックのエスカレーション (データベース エンジン) https://technet.microsoft.com/ja-jp/library/ms184286.aspx 18
参考リンク • SharePoint と SQL ブロッキングの話 https://blogs.technet.microsoft.com/sharepoint_support/2012/07/02/ sharepoint-sql-part1/ https://blogs.technet.microsoft.com/sharepoint_support/2012/07/04/ sharepoint-sql-part2/
https://blogs.technet.microsoft.com/sharepoint_support/2012/07/11/ sharepoint-sql-part3/ • リスト ビューのしきい値に関する FAQ https://blogs.technet.microsoft.com/sharepoint_support/2015/04/14/ faq/ 19