SlideShare uma empresa Scribd logo
1 de 27
Baixar para ler offline
907: BUILDING SCALABLE, HIGH-
    PERFORMANCE SHAREPOINT
    APPLICATIONS



    SPTechCon
    2009-06-24, dynaTrace software Inc
    Andreas Grabner, andreas.grabner@dynatrace.com
    Technology Strategist



dynaTrace
About me

   • Andreas Grabner
   • Technology Strategist
   • dynaTrace Software (http://www.dynaTrace.com)
   • Blog: http://blog.dynaTrace.com
   • Why Performance is such a big topic for me?




dynaTrace                                            2
Agenda

   • While the development of SharePoint-based services is relatively
     easy, making them perform and scale can be a real challenge. This
     class will show you code in the SharePoint Component Model, so
     you can learn about what the framework is doing under the hood
     when it is used by a WebPart or an external application. This insight
     is vital in order to build high-performing and scalable applications
     based on SharePoint
   • LOTS OF DEMOS!!




dynaTrace                                                                    3
Agenda

   • SharePoint Object Model
       • Considerations when working with lists
       • Different ways to access list content
       • Batch updating lists
       • Memory Considerations & Native Resources
   • WebParts
       • Design Guidelines
       • Performance Considerations
       • How to debug/analyze/profile
   • Tips & Tricks




dynaTrace                                           4
Working with SharePoint Lists (1)

   • Do not treat SharePoint Lists as database tables
       • Use database tables for transient or transactional data.
   • The 2000 Items per List Myth
       • What you read on blogs/articles/...
            • Consider the restriction of a maximum of 2000 items per list container in document
              libraries and lists
            • Create containers (folders) in your list to overcome the 2000 item limit
       • What I think
            • > 2000 is not a problem at all
            • If you only request those items in a list that the user needs in the particular use case
            • Use Row Limits, Paging, queries, ... to selectively retrieve list items

   • Maximum number of items supported in a list with recursive containers
     (folders) is 5 million items




dynaTrace                                                                                                5
Working with SharePoint Lists (2)

   • Consider caching the contents of a list to a DataTable or DataSet if
     the list will be queried multiple times in your application
   • Consider using PortalSiteMapProvider which implements a result
     cache based on SPQuery‘s
   • Use Views to limit the number of columns that are retrieved




dynaTrace                                                                   6
Analyze List Usage Behavior
    • Do not do pre-mature optimization
    • Analyze Usage Patterns of Lists and Views
    • Define Index Columns and modify views to improve query performance




  Analyze usage and performance of all lists in SharePoint   Analyze usage and performance of all views in SharePoint




dynaTrace                                                                                                               7
Access SharePoint Lists from Code (1)

   • Getting Item Count of a List

     DO NOT
     int noOfItems = SPContext.Current.List.Items.Count;

                          ALL List Items are retrieved from the Database




     DO
     int noOfItems = SPContext.Current.List.ItemCount;

                           Item Count is kept redundant in the AllUserData table and also kept in memory




dynaTrace                                                                                                  8
Access SharePoint Lists from Code (2)

   • Iterating through List Items – THE WRONG WAY

     DO NOT
     for (int itemIx=0;itemIx< SPContext.Current.List.Items.Count;itemIx++) {
         SPListItem listItem = SPContext.Current.List.Items[itemIx];
         // do something ...
     }

                       Every access to Count and Items Property queries the whole SharePoint list




                       We end up with 202 SQL Executions with a total exec time of > 1s



dynaTrace                                                                                           9
Access SharePoint Lists from Code (3)

   • Iterating through List Items – THE RIGHT WAY

     DO
     SPListItemCollection items = SPContext.Current.List.Items;
     foreach (SPListItem listItem in items) {
         // do something ...
     }

                       Only first access to the collection queries the data




dynaTrace                                                                     10
Access SharePoint Lists from Code (4)
   • Limit Rows by using SPQuery
            • Accessing the SPList object always requests ALL items in the list
            • Use SPQuery and the RowLimit property to only query a certain amount of
              elements

     DO
     SPQuery query = new SPQuery();
     query.RowLimit = 100;
     SPListItemCollection items = SPContext.Current.List.GetItems(query);
     for (int itemIx=0;itemIx<items.Count;itemIx++) {
         SPListItem listItem = items[itemIx];
         // do something ...
     }

                 SPQuery properties are taken into the generated SQL Statment. Only the first X rows are selected




dynaTrace                                                                                                           11
Access SharePoint Lists from Code (5)

   • Limit Columns by using a View or SPQuery.ViewFields
          • Accessing SPList always returns ALL Fields
          • ONLY request the columns that you really need

     DO
     SPQuery query = new SPQuery(SPContext.Current.ViewContext.View);

     or DO
     SPQuery query = new SPQuery();
     query.ViewFields = "<FieldRef Name='ID'/><FieldRef Name=‘Text Field'/><FieldRef Name=‘XYZ'/>";




                                                                            SELECT clause when accessing SPList




                                                                            SELECT clause when using a View or
                                                                            ViewFields

dynaTrace                                                                                                         12
Access SharePoint Lists from Code (6)
   • Pagine through SPQuery Results
          • Process query results in batches or
          • Use this feature when implementing custom paging

     DO
     SPQuery query = new SPQuery();
     query.RowLimit = 10; // Thats our page size
     do
     {
       SPListItemCollection items = SPContext.Current.List.GetItems(query);
      // do something with the first batch of items...
      query.ListItemCollectionPosition = items.ListItemCollectionPosition;
     } while (query.ListItemCollectionPosition != null)

              Individual SQL Statements are executed for each page of data




                                                                   ListItemCollectionPosition is used in WHERE clause

dynaTrace                                                                                                               13
Updating Data in SharePoint Lists (1)

   • Use Batch Updates when updating multiple items at once

     DO NOT
     for (int itemIx=0;itemIx<newItems;itemIx++) {
       SPListItem newItem = items.Add();
       // fill the individual fields
       newItem.Update();
     }


              Every Update is done separately and requires a roundtrip to the DB




dynaTrace                                                                          14
Updating Data in SharePoint Lists (2)

   • Construct a CAML Update Query and Execute it via SPWeb

     DO
     StringBuilder query = new StringBuilder();
     for (int itemIx=0;itemIx<newItems;itemIx++) {
       query.AppendFormat("<Method ID=”{0}”>" +
             "<SetList>{1}</SetList>" +
             "<SetVar Name=“ID”>New</SetVar>" +
             "<SetVar Name=”Cmd”>Save</SetVar>" +
             "<SetVar Name=”{3}Title”>{2}</SetVar>" +
           "</Method>“, itemIx, listGuid, someValue, "urn:schemas-microsoft-com:office:office#");
     }
     SPContext.Current.Web.ProcessBatchData("<?xml version="1.0" encoding="UTF-8"?>" +
       "<ows:Batch OnError="Return">{0}</ows:Batch>", query.ToString())


              CAML Query is processed in Batch by ProcessBatchData                 Without Batch




                                                                                    Almost 2 seconds difference for
                                                                                         inserting 100 items

dynaTrace                                                                                                        15
Updating Data in SharePoint Lists (3)

   • Use the Web Service API as an alternative
          • http://msdn.microsoft.com/en-us/library/lists.lists.updatelistitems.aspx


     DO
     StringBuilder query = new StringBuilder();
     for (int itemIx=0;itemIx<newItems;itemIx++) {
       query.AppendFormat("<Method ID=”{0}”>" +
             "<SetList>{1}</SetList>" +
             "<SetVar Name=“ID”>New</SetVar>" +
             "<SetVar Name=”Cmd”>Save</SetVar>" +
             "<SetVar Name=”{3}Title”>{2}</SetVar>" +
           "</Method>“, i, listGuid, someValue, "urn:schemas-microsoft-com:office:office#");
     }
     System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
     System.Xml.XmlElement elBatch = xmlDoc.CreateElement("Batch");
     elBatch.SetAttribute("OnError", "Return");
     elBatch.InnerXml = methods.ToString();
     localhost.Lists listService = new SPConsole.localhost.Lists();
     listService.Credentials = System.Net.CredentialCache.DefaultCredentials;
     listService.UpdateListItems(listname, elBatch);




dynaTrace                                                                                      16
Summary on SharePoint Object Model
   • Count List Items
        • SPList.ItemCount instead of SPListItemCollection.Count
   • Iterating through SPList
        • Store SPListItemCollection in variable instead of accessing List property in loop
        • Limit the number of Items retrieved by using SPQuery and RowLimit
   • Limit Columns
        • Use a View or SPQuery to limit the number of columns and rows that will be retrieved
   • Paging through data
        • Make use of SPQuery ListItemCollectionPosition feature to page through data
        • Use an appropriate RowLimit value to define the page size
   • List Updates
        • Do batch updates via WebService Lists.UpdateListItems or SPWeb.ProcessBatchData
   • List Item Collections
        • Store myList.Items in a SPListItemCollection variable when accessed multiple times




dynaTrace                                                                                        17
Interesting Links on SharePoint Lists

   • SharePoint List Performance
       • http://blog.solanite.com/keith/Lists/Posts/Post.aspx?ID=15
       • http://blog.thekid.me.uk/archive/2007/02/24/deleting-a-considerable-
         number-of-items-from-a-list-in-sharepoint.aspx
       • http://blog.solanite.com/keith/Lists/Posts/Post.aspx?ID=15
   • Link Collection about Performance
       • http://blogs.msdn.com/joelo/archive/2007/07/09/capacity-planning-key-
         links-and-info.aspx
   • Information about Row Limit and Paging
       • http://msdn.microsoft.com/en-us/library/cc404818.aspx




dynaTrace                                                                        18
SharePoint Object Model



                           DEMO
 • Whats going on „under the hood“ when using the SharePoint Object
   Model?
 • How to improve SharePoint Data Access?




dynaTrace                                                             19
INEFFICIENT use of RESOURCES

   • SharePoint Object Model
       • SPSite and SPWeb hold references to native COM objects
       • Release SPSite & SPWeb in order to free native resources
       • Querying too much data results in high memory usage
   • Reference
       • SPDisposeCheck tool
         http://blogs.msdn.com/sharepoint/archive/2008/11/12/announcing-
         spdisposecheck-tool-for-sharepoint-developers.aspx
       • http://msdn.microsoft.com/en-us/library/bb687949.aspx
       • http://msdn2.microsoft.com/en-
         us/library/aa973248.aspx#sharepointobjmodel_otherobjectsthatrequire-
         disposal




dynaTrace                                                                       20
INEFFICIENT use of RESOURCES

   • Monitor resources
         • Monitor Memory
         • Monitor Database connections
         • Monitor „critical“ SharePoint objects (SPSite, SPWeb)
         • Identify leaking responsible WebParts


                                                      Identify „leaking“ object instances
Monitor SharePoint Memory -> Growing Heap?




                                                      Identify who allocates those objects




dynaTrace                                                                                    21
Data is REQUESTED in an INEFFICIENT way



                            DEMO
 • How to identify a SPSite/SPWeb Resource Leak?
 • How to identify resource intensive WebParts?
 • How to monitor SharePoint Memory Issues down to the Object Model‘s
   Data Access classes?




dynaTrace                                                               22
Web Parts Design Guidelines

   • Design Web Parts to perform only a single function in order to improve reuse
   • Design Web Parts to be configurable or customizable by users
   • Include a Web Part Manager in custom master pages that will be used by
     Web Part pages
   • Consider using Web Part verbs to allow users to perform discrete actions
   • Consider categorizing your properties to distinguish them from Web Part
     properties
   • Dispose properly of any SharePoint objects and unmanaged resources
     that you create in your Web Parts
       • Many SharePoint Objects hold references to unmanaged objects




dynaTrace                                                                       23
WebPart Troubleshooting

   • Attach to w3wp.exe process
       • Use Process Explorer to find correct w3wp (-ap parameter)
   • Understand ASP.NET Page Execution LifeCycle
       • ASP.NET is the underlying technology
       • Understand where your custom code fits in
   • Be careful with VIEWSTATE
       • Easy to use but comes with many side-effects
       • http://www.sitepoint.com/article/aspnet-performance-tips/2/
   • Memory Management
       • Be careful with allocating too many small short living objects
       • Make sure to free references
   • Resource Management
       • Dispose/Release objects
       • Hold on to resources only as long as you need it




dynaTrace                                                                 24
Tips & Tricks

   • Use RenderContents or CreateChildControl vs. Render
       • http://www.andrewconnell.com/blog/archive/2008/02/18/Understanding-how-Web-
         Parts-are-rendered-why-to-never-use.aspx
   • Turn on IIS-Compression
       • http://planetmoss.blogspot.com/2007/06/dont-forget-iis-compression-
         colleague.html
       • http://www.sitepoint.com/article/aspnet-performance-tips/3/
   • BLOB Caching
       • http://office.microsoft.com/en-us/sharepointserver/HA101762841033.aspx
   • Delay loading core.js
       • http://support.microsoft.com/kb/933823
   • General ASP.NET Performance Tuning
       • http://www.sitepoint.com/article/aspnet-performance-tips/




dynaTrace                                                                          25
Tips & Tricks

   • Pre-Create Personal Site
           • UserProfile.CreatePersonalSite()
           • Can take several seconds per user
           • Do it up-front to avoid heavy load when releasing new SharePoint
             installation



     using (SPSite spSite = new SPSite(@“http://server“))
     {
         ServerContext siteContext = ServerContext.GetContext(spSite);
         UserProfileManager pmManager = new UserProfileManager(siteContext);
         UserProfile spUser = pmManager.GetUserProfile(„domainusername“);
         spUser.CreatePersonalSite();
     }




dynaTrace                                                                       26
References & Contact

   • MS SharePoint Team Blog
       • http://blogs.msdn.com/sharepoint/default.aspx
       • http://blogs.msdn.com/sharepoint/archive/2006/02/27/539689.aspx
   • Contact me for follow up
       • Andreas Grabner
       • Mail: andreas.grabner@dynatrace.com
       • Blog: http://blog.dynatrace.com
       • Web: http://www.dynatrace.com




dynaTrace                                                                  27

Mais conteúdo relacionado

Mais procurados

High Performance JSON Search and Relational Faceted Browsing with Lucene
High Performance JSON Search and Relational Faceted Browsing with LuceneHigh Performance JSON Search and Relational Faceted Browsing with Lucene
High Performance JSON Search and Relational Faceted Browsing with Lucenelucenerevolution
 
SQL Now! How Optiq brings the best of SQL to NoSQL data.
SQL Now! How Optiq brings the best of SQL to NoSQL data.SQL Now! How Optiq brings the best of SQL to NoSQL data.
SQL Now! How Optiq brings the best of SQL to NoSQL data.Julian Hyde
 
Real-time Inverted Search in the Cloud Using Lucene and Storm
Real-time Inverted Search in the Cloud Using Lucene and StormReal-time Inverted Search in the Cloud Using Lucene and Storm
Real-time Inverted Search in the Cloud Using Lucene and Stormlucenerevolution
 
Solr Indexing and Analysis Tricks
Solr Indexing and Analysis TricksSolr Indexing and Analysis Tricks
Solr Indexing and Analysis TricksErik Hatcher
 
Lessons from the Field, Episode II: Applying Best Practices to Your Apache S...
 Lessons from the Field, Episode II: Applying Best Practices to Your Apache S... Lessons from the Field, Episode II: Applying Best Practices to Your Apache S...
Lessons from the Field, Episode II: Applying Best Practices to Your Apache S...Databricks
 
How Clean is your database? Data scrubbing for all skills sets
How Clean is your database? Data scrubbing for all skills setsHow Clean is your database? Data scrubbing for all skills sets
How Clean is your database? Data scrubbing for all skills setsChad Petrovay
 
Solr Recipes Workshop
Solr Recipes WorkshopSolr Recipes Workshop
Solr Recipes WorkshopErik Hatcher
 
Webinar: What's New in Solr 7
Webinar: What's New in Solr 7 Webinar: What's New in Solr 7
Webinar: What's New in Solr 7 Lucidworks
 
Ch06 ado.net fundamentals
Ch06 ado.net fundamentalsCh06 ado.net fundamentals
Ch06 ado.net fundamentalsMadhuri Kavade
 
For Beginners - Ado.net
For Beginners - Ado.netFor Beginners - Ado.net
For Beginners - Ado.netTarun Jain
 
Integrating the Solr search engine
Integrating the Solr search engineIntegrating the Solr search engine
Integrating the Solr search engineth0masr
 
New-Age Search through Apache Solr
New-Age Search through Apache SolrNew-Age Search through Apache Solr
New-Age Search through Apache SolrEdureka!
 
Ingesting and Manipulating Data with JavaScript
Ingesting and Manipulating Data with JavaScriptIngesting and Manipulating Data with JavaScript
Ingesting and Manipulating Data with JavaScriptLucidworks
 
MySQL Performance Schema in Action
MySQL Performance Schema in ActionMySQL Performance Schema in Action
MySQL Performance Schema in ActionSveta Smirnova
 

Mais procurados (20)

High Performance JSON Search and Relational Faceted Browsing with Lucene
High Performance JSON Search and Relational Faceted Browsing with LuceneHigh Performance JSON Search and Relational Faceted Browsing with Lucene
High Performance JSON Search and Relational Faceted Browsing with Lucene
 
SQL Now! How Optiq brings the best of SQL to NoSQL data.
SQL Now! How Optiq brings the best of SQL to NoSQL data.SQL Now! How Optiq brings the best of SQL to NoSQL data.
SQL Now! How Optiq brings the best of SQL to NoSQL data.
 
Elasticsearch speed is key
Elasticsearch speed is keyElasticsearch speed is key
Elasticsearch speed is key
 
Real-time Inverted Search in the Cloud Using Lucene and Storm
Real-time Inverted Search in the Cloud Using Lucene and StormReal-time Inverted Search in the Cloud Using Lucene and Storm
Real-time Inverted Search in the Cloud Using Lucene and Storm
 
Solr Indexing and Analysis Tricks
Solr Indexing and Analysis TricksSolr Indexing and Analysis Tricks
Solr Indexing and Analysis Tricks
 
Fast track to lucene
Fast track to luceneFast track to lucene
Fast track to lucene
 
Lessons from the Field, Episode II: Applying Best Practices to Your Apache S...
 Lessons from the Field, Episode II: Applying Best Practices to Your Apache S... Lessons from the Field, Episode II: Applying Best Practices to Your Apache S...
Lessons from the Field, Episode II: Applying Best Practices to Your Apache S...
 
How Clean is your database? Data scrubbing for all skills sets
How Clean is your database? Data scrubbing for all skills setsHow Clean is your database? Data scrubbing for all skills sets
How Clean is your database? Data scrubbing for all skills sets
 
Solr Recipes Workshop
Solr Recipes WorkshopSolr Recipes Workshop
Solr Recipes Workshop
 
Webinar: What's New in Solr 7
Webinar: What's New in Solr 7 Webinar: What's New in Solr 7
Webinar: What's New in Solr 7
 
Ch06 ado.net fundamentals
Ch06 ado.net fundamentalsCh06 ado.net fundamentals
Ch06 ado.net fundamentals
 
For Beginners - Ado.net
For Beginners - Ado.netFor Beginners - Ado.net
For Beginners - Ado.net
 
Hibernate presentation
Hibernate presentationHibernate presentation
Hibernate presentation
 
Integrating the Solr search engine
Integrating the Solr search engineIntegrating the Solr search engine
Integrating the Solr search engine
 
Building a Search Engine Using Lucene
Building a Search Engine Using LuceneBuilding a Search Engine Using Lucene
Building a Search Engine Using Lucene
 
New-Age Search through Apache Solr
New-Age Search through Apache SolrNew-Age Search through Apache Solr
New-Age Search through Apache Solr
 
Ingesting and Manipulating Data with JavaScript
Ingesting and Manipulating Data with JavaScriptIngesting and Manipulating Data with JavaScript
Ingesting and Manipulating Data with JavaScript
 
MySQL Performance Schema in Action
MySQL Performance Schema in ActionMySQL Performance Schema in Action
MySQL Performance Schema in Action
 
Introduction To Apache Lucene
Introduction To Apache LuceneIntroduction To Apache Lucene
Introduction To Apache Lucene
 
For Beginers - ADO.Net
For Beginers - ADO.NetFor Beginers - ADO.Net
For Beginers - ADO.Net
 

Destaque

Farallon risk group 20111107cs
Farallon risk group 20111107csFarallon risk group 20111107cs
Farallon risk group 20111107csShrutiSara
 
Finl syll tec 2032 fall_2011
Finl syll tec 2032 fall_2011Finl syll tec 2032 fall_2011
Finl syll tec 2032 fall_2011pkirk63
 
Hum2220 1030 the emperors of rome
Hum2220 1030 the emperors of romeHum2220 1030 the emperors of rome
Hum2220 1030 the emperors of romeProfWillAdams
 
KTI Perkembangan Smartphone di Jember
KTI   Perkembangan Smartphone di JemberKTI   Perkembangan Smartphone di Jember
KTI Perkembangan Smartphone di Jember21 Memento
 
SharePoint TechCon 2009 - 602
SharePoint TechCon 2009 - 602SharePoint TechCon 2009 - 602
SharePoint TechCon 2009 - 602Andreas Grabner
 
Art4705 historyof photography
Art4705 historyof photographyArt4705 historyof photography
Art4705 historyof photographypkirk63
 
Prototype and Test - Uncertainty
Prototype and Test - UncertaintyPrototype and Test - Uncertainty
Prototype and Test - UncertaintyCharles Sun
 
New culture of_light
New culture of_lightNew culture of_light
New culture of_lightpkirk63
 
祝福世界好友周快樂!
祝福世界好友周快樂!祝福世界好友周快樂!
祝福世界好友周快樂!ysmens2006ys
 
Arh1000 fa2014 syllabus
Arh1000 fa2014 syllabusArh1000 fa2014 syllabus
Arh1000 fa2014 syllabusProfWillAdams
 
Ad group policy1
Ad group policy1Ad group policy1
Ad group policy1denogx
 
Keynote | The Rise and Fall and Rise of Java | James Governor
Keynote | The Rise and Fall and Rise of Java | James GovernorKeynote | The Rise and Fall and Rise of Java | James Governor
Keynote | The Rise and Fall and Rise of Java | James GovernorJAX London
 
Direct Relief FY 2014 Annual Report
Direct Relief FY 2014 Annual ReportDirect Relief FY 2014 Annual Report
Direct Relief FY 2014 Annual ReportDirect Relief
 
Hum1020 1200 the roman republic & satire
Hum1020 1200 the roman republic & satireHum1020 1200 the roman republic & satire
Hum1020 1200 the roman republic & satireProfWillAdams
 

Destaque (20)

Pf sense 2.0
Pf sense 2.0Pf sense 2.0
Pf sense 2.0
 
аветов презентация 3.0
аветов презентация 3.0аветов презентация 3.0
аветов презентация 3.0
 
Virus
VirusVirus
Virus
 
Farallon risk group 20111107cs
Farallon risk group 20111107csFarallon risk group 20111107cs
Farallon risk group 20111107cs
 
Finl syll tec 2032 fall_2011
Finl syll tec 2032 fall_2011Finl syll tec 2032 fall_2011
Finl syll tec 2032 fall_2011
 
Mayra alejandra morales_pulido
Mayra alejandra morales_pulidoMayra alejandra morales_pulido
Mayra alejandra morales_pulido
 
Hum2220 1030 the emperors of rome
Hum2220 1030 the emperors of romeHum2220 1030 the emperors of rome
Hum2220 1030 the emperors of rome
 
KTI Perkembangan Smartphone di Jember
KTI   Perkembangan Smartphone di JemberKTI   Perkembangan Smartphone di Jember
KTI Perkembangan Smartphone di Jember
 
SharePoint TechCon 2009 - 602
SharePoint TechCon 2009 - 602SharePoint TechCon 2009 - 602
SharePoint TechCon 2009 - 602
 
Art4705 historyof photography
Art4705 historyof photographyArt4705 historyof photography
Art4705 historyof photography
 
Prototype and Test - Uncertainty
Prototype and Test - UncertaintyPrototype and Test - Uncertainty
Prototype and Test - Uncertainty
 
Uas tik
Uas tikUas tik
Uas tik
 
New culture of_light
New culture of_lightNew culture of_light
New culture of_light
 
Republic of france
Republic of franceRepublic of france
Republic of france
 
祝福世界好友周快樂!
祝福世界好友周快樂!祝福世界好友周快樂!
祝福世界好友周快樂!
 
Arh1000 fa2014 syllabus
Arh1000 fa2014 syllabusArh1000 fa2014 syllabus
Arh1000 fa2014 syllabus
 
Ad group policy1
Ad group policy1Ad group policy1
Ad group policy1
 
Keynote | The Rise and Fall and Rise of Java | James Governor
Keynote | The Rise and Fall and Rise of Java | James GovernorKeynote | The Rise and Fall and Rise of Java | James Governor
Keynote | The Rise and Fall and Rise of Java | James Governor
 
Direct Relief FY 2014 Annual Report
Direct Relief FY 2014 Annual ReportDirect Relief FY 2014 Annual Report
Direct Relief FY 2014 Annual Report
 
Hum1020 1200 the roman republic & satire
Hum1020 1200 the roman republic & satireHum1020 1200 the roman republic & satire
Hum1020 1200 the roman republic & satire
 

Semelhante a Scaling SharePoint Apps for High Performance

Data Access Options in SharePoint 2010
Data Access Options in SharePoint 2010Data Access Options in SharePoint 2010
Data Access Options in SharePoint 2010Rob Windsor
 
Sharepoint Saturday India Online best practice for developing share point sol...
Sharepoint Saturday India Online best practice for developing share point sol...Sharepoint Saturday India Online best practice for developing share point sol...
Sharepoint Saturday India Online best practice for developing share point sol...Shakir Majeed Khan
 
Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...SPTechCon
 
Examiness hints and tips from the trenches
Examiness hints and tips from the trenchesExaminess hints and tips from the trenches
Examiness hints and tips from the trenchesIsmail Mayat
 
SharePoint TechCon 2009 - 803
SharePoint TechCon 2009 - 803SharePoint TechCon 2009 - 803
SharePoint TechCon 2009 - 803Andreas Grabner
 
Entity Framework: Code First and Magic Unicorns
Entity Framework: Code First and Magic UnicornsEntity Framework: Code First and Magic Unicorns
Entity Framework: Code First and Magic UnicornsRichie Rump
 
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...dotNet Miami
 
Quick Introduction to Sphinx and Thinking Sphinx
Quick Introduction to Sphinx and Thinking SphinxQuick Introduction to Sphinx and Thinking Sphinx
Quick Introduction to Sphinx and Thinking Sphinxhayesdavis
 
SharePoint and jQuery Essentials
SharePoint and jQuery EssentialsSharePoint and jQuery Essentials
SharePoint and jQuery EssentialsMark Rackley
 
Doctrine Data migrations | May 2017
Doctrine Data migrations | May 2017Doctrine Data migrations | May 2017
Doctrine Data migrations | May 2017Petr Bechyně
 
Hibernate in XPages
Hibernate in XPagesHibernate in XPages
Hibernate in XPagesToby Samples
 
Using Atlassian UAL and ActiveObjects for Rapid Plugin Development - AtlasCam...
Using Atlassian UAL and ActiveObjects for Rapid Plugin Development - AtlasCam...Using Atlassian UAL and ActiveObjects for Rapid Plugin Development - AtlasCam...
Using Atlassian UAL and ActiveObjects for Rapid Plugin Development - AtlasCam...Atlassian
 
Python Utilities for Managing MySQL Databases
Python Utilities for Managing MySQL DatabasesPython Utilities for Managing MySQL Databases
Python Utilities for Managing MySQL DatabasesMats Kindahl
 
Full Text Search with Lucene
Full Text Search with LuceneFull Text Search with Lucene
Full Text Search with LuceneWO Community
 

Semelhante a Scaling SharePoint Apps for High Performance (20)

Data Access Options in SharePoint 2010
Data Access Options in SharePoint 2010Data Access Options in SharePoint 2010
Data Access Options in SharePoint 2010
 
Sharepoint Saturday India Online best practice for developing share point sol...
Sharepoint Saturday India Online best practice for developing share point sol...Sharepoint Saturday India Online best practice for developing share point sol...
Sharepoint Saturday India Online best practice for developing share point sol...
 
Full Text Search In PostgreSQL
Full Text Search In PostgreSQLFull Text Search In PostgreSQL
Full Text Search In PostgreSQL
 
Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
 
Examiness hints and tips from the trenches
Examiness hints and tips from the trenchesExaminess hints and tips from the trenches
Examiness hints and tips from the trenches
 
SharePoint TechCon 2009 - 803
SharePoint TechCon 2009 - 803SharePoint TechCon 2009 - 803
SharePoint TechCon 2009 - 803
 
Dapper performance
Dapper performanceDapper performance
Dapper performance
 
Where to save my data, for devs!
Where to save my data, for devs!Where to save my data, for devs!
Where to save my data, for devs!
 
Entity Framework: Code First and Magic Unicorns
Entity Framework: Code First and Magic UnicornsEntity Framework: Code First and Magic Unicorns
Entity Framework: Code First and Magic Unicorns
 
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
 
Quick Introduction to Sphinx and Thinking Sphinx
Quick Introduction to Sphinx and Thinking SphinxQuick Introduction to Sphinx and Thinking Sphinx
Quick Introduction to Sphinx and Thinking Sphinx
 
SharePoint and jQuery Essentials
SharePoint and jQuery EssentialsSharePoint and jQuery Essentials
SharePoint and jQuery Essentials
 
Doctrine Data migrations | May 2017
Doctrine Data migrations | May 2017Doctrine Data migrations | May 2017
Doctrine Data migrations | May 2017
 
Hibernate in XPages
Hibernate in XPagesHibernate in XPages
Hibernate in XPages
 
Orms vs Micro-ORMs
Orms vs Micro-ORMsOrms vs Micro-ORMs
Orms vs Micro-ORMs
 
L12: REST Service
L12: REST ServiceL12: REST Service
L12: REST Service
 
Using Atlassian UAL and ActiveObjects for Rapid Plugin Development - AtlasCam...
Using Atlassian UAL and ActiveObjects for Rapid Plugin Development - AtlasCam...Using Atlassian UAL and ActiveObjects for Rapid Plugin Development - AtlasCam...
Using Atlassian UAL and ActiveObjects for Rapid Plugin Development - AtlasCam...
 
collections
 collections collections
collections
 
Python Utilities for Managing MySQL Databases
Python Utilities for Managing MySQL DatabasesPython Utilities for Managing MySQL Databases
Python Utilities for Managing MySQL Databases
 
Full Text Search with Lucene
Full Text Search with LuceneFull Text Search with Lucene
Full Text Search with Lucene
 

Mais de Andreas Grabner

KCD Munich - Cloud Native Platform Dilemma - Turning it into an Opportunity
KCD Munich - Cloud Native Platform Dilemma - Turning it into an OpportunityKCD Munich - Cloud Native Platform Dilemma - Turning it into an Opportunity
KCD Munich - Cloud Native Platform Dilemma - Turning it into an OpportunityAndreas Grabner
 
OpenTelemetry For GitOps: Tracing Deployments from Git Commit to Production
OpenTelemetry For GitOps: Tracing Deployments from Git Commit to ProductionOpenTelemetry For GitOps: Tracing Deployments from Git Commit to Production
OpenTelemetry For GitOps: Tracing Deployments from Git Commit to ProductionAndreas Grabner
 
Don't Deploy Into the Dark: DORA Metrics for your K8s GitOps Deployments
Don't Deploy Into the Dark: DORA Metrics for your K8s GitOps DeploymentsDon't Deploy Into the Dark: DORA Metrics for your K8s GitOps Deployments
Don't Deploy Into the Dark: DORA Metrics for your K8s GitOps DeploymentsAndreas Grabner
 
Observability and Orchestration of your GitOps Deployments with Keptn
Observability and Orchestration of your GitOps Deployments with KeptnObservability and Orchestration of your GitOps Deployments with Keptn
Observability and Orchestration of your GitOps Deployments with KeptnAndreas Grabner
 
Release Readiness Validation with Keptn for Austrian Online Banking Software
Release Readiness Validation with Keptn for Austrian Online Banking SoftwareRelease Readiness Validation with Keptn for Austrian Online Banking Software
Release Readiness Validation with Keptn for Austrian Online Banking SoftwareAndreas Grabner
 
Adding Security to your SLO-based Release Validation with Keptn
Adding Security to your SLO-based Release Validation with KeptnAdding Security to your SLO-based Release Validation with Keptn
Adding Security to your SLO-based Release Validation with KeptnAndreas Grabner
 
A Guide to Event-Driven SRE-inspired DevOps
A Guide to Event-Driven SRE-inspired DevOpsA Guide to Event-Driven SRE-inspired DevOps
A Guide to Event-Driven SRE-inspired DevOpsAndreas Grabner
 
Jenkins Online Meetup - Automated SLI based Build Validation with Keptn
Jenkins Online Meetup - Automated SLI based Build Validation with KeptnJenkins Online Meetup - Automated SLI based Build Validation with Keptn
Jenkins Online Meetup - Automated SLI based Build Validation with KeptnAndreas Grabner
 
Continuous Delivery and Automated Operations on k8s with keptn
Continuous Delivery and Automated Operations on k8s with keptnContinuous Delivery and Automated Operations on k8s with keptn
Continuous Delivery and Automated Operations on k8s with keptnAndreas Grabner
 
Keptn - Automated Operations & Continuous Delivery for k8s
Keptn - Automated Operations & Continuous Delivery for k8sKeptn - Automated Operations & Continuous Delivery for k8s
Keptn - Automated Operations & Continuous Delivery for k8sAndreas Grabner
 
Shipping Code like a keptn: Continuous Delivery & Automated Operations on k8s
Shipping Code like a keptn: Continuous Delivery & Automated Operations on k8sShipping Code like a keptn: Continuous Delivery & Automated Operations on k8s
Shipping Code like a keptn: Continuous Delivery & Automated Operations on k8sAndreas Grabner
 
Top Performance Problems in Distributed Architectures
Top Performance Problems in Distributed ArchitecturesTop Performance Problems in Distributed Architectures
Top Performance Problems in Distributed ArchitecturesAndreas Grabner
 
Applying AI to Performance Engineering: Shift-Left, Shift-Right, Self-Healing
Applying AI to Performance Engineering: Shift-Left, Shift-Right, Self-HealingApplying AI to Performance Engineering: Shift-Left, Shift-Right, Self-Healing
Applying AI to Performance Engineering: Shift-Left, Shift-Right, Self-HealingAndreas Grabner
 
Monitoring as a Self-Service in Atlassian DevOps Toolchain
Monitoring as a Self-Service in Atlassian DevOps ToolchainMonitoring as a Self-Service in Atlassian DevOps Toolchain
Monitoring as a Self-Service in Atlassian DevOps ToolchainAndreas Grabner
 
How to explain DevOps to your mom
How to explain DevOps to your momHow to explain DevOps to your mom
How to explain DevOps to your momAndreas Grabner
 
DevOps Days Toronto: From 6 Months Waterfall to 1 hour Code Deploys
DevOps Days Toronto: From 6 Months Waterfall to 1 hour Code DeploysDevOps Days Toronto: From 6 Months Waterfall to 1 hour Code Deploys
DevOps Days Toronto: From 6 Months Waterfall to 1 hour Code DeploysAndreas Grabner
 
AWS Summit - Trends in Advanced Monitoring for AWS environments
AWS Summit - Trends in Advanced Monitoring for AWS environmentsAWS Summit - Trends in Advanced Monitoring for AWS environments
AWS Summit - Trends in Advanced Monitoring for AWS environmentsAndreas Grabner
 
DevOps Transformation at Dynatrace and with Dynatrace
DevOps Transformation at Dynatrace and with DynatraceDevOps Transformation at Dynatrace and with Dynatrace
DevOps Transformation at Dynatrace and with DynatraceAndreas Grabner
 
DevOps Pipelines and Metrics Driven Feedback Loops
DevOps Pipelines and Metrics Driven Feedback LoopsDevOps Pipelines and Metrics Driven Feedback Loops
DevOps Pipelines and Metrics Driven Feedback LoopsAndreas Grabner
 
Boston DevOps Days 2016: Implementing Metrics Driven DevOps - Why and How
Boston DevOps Days 2016: Implementing Metrics Driven DevOps - Why and HowBoston DevOps Days 2016: Implementing Metrics Driven DevOps - Why and How
Boston DevOps Days 2016: Implementing Metrics Driven DevOps - Why and HowAndreas Grabner
 

Mais de Andreas Grabner (20)

KCD Munich - Cloud Native Platform Dilemma - Turning it into an Opportunity
KCD Munich - Cloud Native Platform Dilemma - Turning it into an OpportunityKCD Munich - Cloud Native Platform Dilemma - Turning it into an Opportunity
KCD Munich - Cloud Native Platform Dilemma - Turning it into an Opportunity
 
OpenTelemetry For GitOps: Tracing Deployments from Git Commit to Production
OpenTelemetry For GitOps: Tracing Deployments from Git Commit to ProductionOpenTelemetry For GitOps: Tracing Deployments from Git Commit to Production
OpenTelemetry For GitOps: Tracing Deployments from Git Commit to Production
 
Don't Deploy Into the Dark: DORA Metrics for your K8s GitOps Deployments
Don't Deploy Into the Dark: DORA Metrics for your K8s GitOps DeploymentsDon't Deploy Into the Dark: DORA Metrics for your K8s GitOps Deployments
Don't Deploy Into the Dark: DORA Metrics for your K8s GitOps Deployments
 
Observability and Orchestration of your GitOps Deployments with Keptn
Observability and Orchestration of your GitOps Deployments with KeptnObservability and Orchestration of your GitOps Deployments with Keptn
Observability and Orchestration of your GitOps Deployments with Keptn
 
Release Readiness Validation with Keptn for Austrian Online Banking Software
Release Readiness Validation with Keptn for Austrian Online Banking SoftwareRelease Readiness Validation with Keptn for Austrian Online Banking Software
Release Readiness Validation with Keptn for Austrian Online Banking Software
 
Adding Security to your SLO-based Release Validation with Keptn
Adding Security to your SLO-based Release Validation with KeptnAdding Security to your SLO-based Release Validation with Keptn
Adding Security to your SLO-based Release Validation with Keptn
 
A Guide to Event-Driven SRE-inspired DevOps
A Guide to Event-Driven SRE-inspired DevOpsA Guide to Event-Driven SRE-inspired DevOps
A Guide to Event-Driven SRE-inspired DevOps
 
Jenkins Online Meetup - Automated SLI based Build Validation with Keptn
Jenkins Online Meetup - Automated SLI based Build Validation with KeptnJenkins Online Meetup - Automated SLI based Build Validation with Keptn
Jenkins Online Meetup - Automated SLI based Build Validation with Keptn
 
Continuous Delivery and Automated Operations on k8s with keptn
Continuous Delivery and Automated Operations on k8s with keptnContinuous Delivery and Automated Operations on k8s with keptn
Continuous Delivery and Automated Operations on k8s with keptn
 
Keptn - Automated Operations & Continuous Delivery for k8s
Keptn - Automated Operations & Continuous Delivery for k8sKeptn - Automated Operations & Continuous Delivery for k8s
Keptn - Automated Operations & Continuous Delivery for k8s
 
Shipping Code like a keptn: Continuous Delivery & Automated Operations on k8s
Shipping Code like a keptn: Continuous Delivery & Automated Operations on k8sShipping Code like a keptn: Continuous Delivery & Automated Operations on k8s
Shipping Code like a keptn: Continuous Delivery & Automated Operations on k8s
 
Top Performance Problems in Distributed Architectures
Top Performance Problems in Distributed ArchitecturesTop Performance Problems in Distributed Architectures
Top Performance Problems in Distributed Architectures
 
Applying AI to Performance Engineering: Shift-Left, Shift-Right, Self-Healing
Applying AI to Performance Engineering: Shift-Left, Shift-Right, Self-HealingApplying AI to Performance Engineering: Shift-Left, Shift-Right, Self-Healing
Applying AI to Performance Engineering: Shift-Left, Shift-Right, Self-Healing
 
Monitoring as a Self-Service in Atlassian DevOps Toolchain
Monitoring as a Self-Service in Atlassian DevOps ToolchainMonitoring as a Self-Service in Atlassian DevOps Toolchain
Monitoring as a Self-Service in Atlassian DevOps Toolchain
 
How to explain DevOps to your mom
How to explain DevOps to your momHow to explain DevOps to your mom
How to explain DevOps to your mom
 
DevOps Days Toronto: From 6 Months Waterfall to 1 hour Code Deploys
DevOps Days Toronto: From 6 Months Waterfall to 1 hour Code DeploysDevOps Days Toronto: From 6 Months Waterfall to 1 hour Code Deploys
DevOps Days Toronto: From 6 Months Waterfall to 1 hour Code Deploys
 
AWS Summit - Trends in Advanced Monitoring for AWS environments
AWS Summit - Trends in Advanced Monitoring for AWS environmentsAWS Summit - Trends in Advanced Monitoring for AWS environments
AWS Summit - Trends in Advanced Monitoring for AWS environments
 
DevOps Transformation at Dynatrace and with Dynatrace
DevOps Transformation at Dynatrace and with DynatraceDevOps Transformation at Dynatrace and with Dynatrace
DevOps Transformation at Dynatrace and with Dynatrace
 
DevOps Pipelines and Metrics Driven Feedback Loops
DevOps Pipelines and Metrics Driven Feedback LoopsDevOps Pipelines and Metrics Driven Feedback Loops
DevOps Pipelines and Metrics Driven Feedback Loops
 
Boston DevOps Days 2016: Implementing Metrics Driven DevOps - Why and How
Boston DevOps Days 2016: Implementing Metrics Driven DevOps - Why and HowBoston DevOps Days 2016: Implementing Metrics Driven DevOps - Why and How
Boston DevOps Days 2016: Implementing Metrics Driven DevOps - Why and How
 

Último

MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesManik S Magar
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkPixlogix Infotech
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...itnewsafrica
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 

Último (20)

MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App Framework
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 

Scaling SharePoint Apps for High Performance

  • 1. 907: BUILDING SCALABLE, HIGH- PERFORMANCE SHAREPOINT APPLICATIONS SPTechCon 2009-06-24, dynaTrace software Inc Andreas Grabner, andreas.grabner@dynatrace.com Technology Strategist dynaTrace
  • 2. About me • Andreas Grabner • Technology Strategist • dynaTrace Software (http://www.dynaTrace.com) • Blog: http://blog.dynaTrace.com • Why Performance is such a big topic for me? dynaTrace 2
  • 3. Agenda • While the development of SharePoint-based services is relatively easy, making them perform and scale can be a real challenge. This class will show you code in the SharePoint Component Model, so you can learn about what the framework is doing under the hood when it is used by a WebPart or an external application. This insight is vital in order to build high-performing and scalable applications based on SharePoint • LOTS OF DEMOS!! dynaTrace 3
  • 4. Agenda • SharePoint Object Model • Considerations when working with lists • Different ways to access list content • Batch updating lists • Memory Considerations & Native Resources • WebParts • Design Guidelines • Performance Considerations • How to debug/analyze/profile • Tips & Tricks dynaTrace 4
  • 5. Working with SharePoint Lists (1) • Do not treat SharePoint Lists as database tables • Use database tables for transient or transactional data. • The 2000 Items per List Myth • What you read on blogs/articles/... • Consider the restriction of a maximum of 2000 items per list container in document libraries and lists • Create containers (folders) in your list to overcome the 2000 item limit • What I think • > 2000 is not a problem at all • If you only request those items in a list that the user needs in the particular use case • Use Row Limits, Paging, queries, ... to selectively retrieve list items • Maximum number of items supported in a list with recursive containers (folders) is 5 million items dynaTrace 5
  • 6. Working with SharePoint Lists (2) • Consider caching the contents of a list to a DataTable or DataSet if the list will be queried multiple times in your application • Consider using PortalSiteMapProvider which implements a result cache based on SPQuery‘s • Use Views to limit the number of columns that are retrieved dynaTrace 6
  • 7. Analyze List Usage Behavior • Do not do pre-mature optimization • Analyze Usage Patterns of Lists and Views • Define Index Columns and modify views to improve query performance Analyze usage and performance of all lists in SharePoint Analyze usage and performance of all views in SharePoint dynaTrace 7
  • 8. Access SharePoint Lists from Code (1) • Getting Item Count of a List DO NOT int noOfItems = SPContext.Current.List.Items.Count; ALL List Items are retrieved from the Database DO int noOfItems = SPContext.Current.List.ItemCount; Item Count is kept redundant in the AllUserData table and also kept in memory dynaTrace 8
  • 9. Access SharePoint Lists from Code (2) • Iterating through List Items – THE WRONG WAY DO NOT for (int itemIx=0;itemIx< SPContext.Current.List.Items.Count;itemIx++) { SPListItem listItem = SPContext.Current.List.Items[itemIx]; // do something ... } Every access to Count and Items Property queries the whole SharePoint list We end up with 202 SQL Executions with a total exec time of > 1s dynaTrace 9
  • 10. Access SharePoint Lists from Code (3) • Iterating through List Items – THE RIGHT WAY DO SPListItemCollection items = SPContext.Current.List.Items; foreach (SPListItem listItem in items) { // do something ... } Only first access to the collection queries the data dynaTrace 10
  • 11. Access SharePoint Lists from Code (4) • Limit Rows by using SPQuery • Accessing the SPList object always requests ALL items in the list • Use SPQuery and the RowLimit property to only query a certain amount of elements DO SPQuery query = new SPQuery(); query.RowLimit = 100; SPListItemCollection items = SPContext.Current.List.GetItems(query); for (int itemIx=0;itemIx<items.Count;itemIx++) { SPListItem listItem = items[itemIx]; // do something ... } SPQuery properties are taken into the generated SQL Statment. Only the first X rows are selected dynaTrace 11
  • 12. Access SharePoint Lists from Code (5) • Limit Columns by using a View or SPQuery.ViewFields • Accessing SPList always returns ALL Fields • ONLY request the columns that you really need DO SPQuery query = new SPQuery(SPContext.Current.ViewContext.View); or DO SPQuery query = new SPQuery(); query.ViewFields = "<FieldRef Name='ID'/><FieldRef Name=‘Text Field'/><FieldRef Name=‘XYZ'/>"; SELECT clause when accessing SPList SELECT clause when using a View or ViewFields dynaTrace 12
  • 13. Access SharePoint Lists from Code (6) • Pagine through SPQuery Results • Process query results in batches or • Use this feature when implementing custom paging DO SPQuery query = new SPQuery(); query.RowLimit = 10; // Thats our page size do { SPListItemCollection items = SPContext.Current.List.GetItems(query); // do something with the first batch of items... query.ListItemCollectionPosition = items.ListItemCollectionPosition; } while (query.ListItemCollectionPosition != null) Individual SQL Statements are executed for each page of data ListItemCollectionPosition is used in WHERE clause dynaTrace 13
  • 14. Updating Data in SharePoint Lists (1) • Use Batch Updates when updating multiple items at once DO NOT for (int itemIx=0;itemIx<newItems;itemIx++) { SPListItem newItem = items.Add(); // fill the individual fields newItem.Update(); } Every Update is done separately and requires a roundtrip to the DB dynaTrace 14
  • 15. Updating Data in SharePoint Lists (2) • Construct a CAML Update Query and Execute it via SPWeb DO StringBuilder query = new StringBuilder(); for (int itemIx=0;itemIx<newItems;itemIx++) { query.AppendFormat("<Method ID=”{0}”>" + "<SetList>{1}</SetList>" + "<SetVar Name=“ID”>New</SetVar>" + "<SetVar Name=”Cmd”>Save</SetVar>" + "<SetVar Name=”{3}Title”>{2}</SetVar>" + "</Method>“, itemIx, listGuid, someValue, "urn:schemas-microsoft-com:office:office#"); } SPContext.Current.Web.ProcessBatchData("<?xml version="1.0" encoding="UTF-8"?>" + "<ows:Batch OnError="Return">{0}</ows:Batch>", query.ToString()) CAML Query is processed in Batch by ProcessBatchData Without Batch Almost 2 seconds difference for inserting 100 items dynaTrace 15
  • 16. Updating Data in SharePoint Lists (3) • Use the Web Service API as an alternative • http://msdn.microsoft.com/en-us/library/lists.lists.updatelistitems.aspx DO StringBuilder query = new StringBuilder(); for (int itemIx=0;itemIx<newItems;itemIx++) { query.AppendFormat("<Method ID=”{0}”>" + "<SetList>{1}</SetList>" + "<SetVar Name=“ID”>New</SetVar>" + "<SetVar Name=”Cmd”>Save</SetVar>" + "<SetVar Name=”{3}Title”>{2}</SetVar>" + "</Method>“, i, listGuid, someValue, "urn:schemas-microsoft-com:office:office#"); } System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); System.Xml.XmlElement elBatch = xmlDoc.CreateElement("Batch"); elBatch.SetAttribute("OnError", "Return"); elBatch.InnerXml = methods.ToString(); localhost.Lists listService = new SPConsole.localhost.Lists(); listService.Credentials = System.Net.CredentialCache.DefaultCredentials; listService.UpdateListItems(listname, elBatch); dynaTrace 16
  • 17. Summary on SharePoint Object Model • Count List Items • SPList.ItemCount instead of SPListItemCollection.Count • Iterating through SPList • Store SPListItemCollection in variable instead of accessing List property in loop • Limit the number of Items retrieved by using SPQuery and RowLimit • Limit Columns • Use a View or SPQuery to limit the number of columns and rows that will be retrieved • Paging through data • Make use of SPQuery ListItemCollectionPosition feature to page through data • Use an appropriate RowLimit value to define the page size • List Updates • Do batch updates via WebService Lists.UpdateListItems or SPWeb.ProcessBatchData • List Item Collections • Store myList.Items in a SPListItemCollection variable when accessed multiple times dynaTrace 17
  • 18. Interesting Links on SharePoint Lists • SharePoint List Performance • http://blog.solanite.com/keith/Lists/Posts/Post.aspx?ID=15 • http://blog.thekid.me.uk/archive/2007/02/24/deleting-a-considerable- number-of-items-from-a-list-in-sharepoint.aspx • http://blog.solanite.com/keith/Lists/Posts/Post.aspx?ID=15 • Link Collection about Performance • http://blogs.msdn.com/joelo/archive/2007/07/09/capacity-planning-key- links-and-info.aspx • Information about Row Limit and Paging • http://msdn.microsoft.com/en-us/library/cc404818.aspx dynaTrace 18
  • 19. SharePoint Object Model DEMO • Whats going on „under the hood“ when using the SharePoint Object Model? • How to improve SharePoint Data Access? dynaTrace 19
  • 20. INEFFICIENT use of RESOURCES • SharePoint Object Model • SPSite and SPWeb hold references to native COM objects • Release SPSite & SPWeb in order to free native resources • Querying too much data results in high memory usage • Reference • SPDisposeCheck tool http://blogs.msdn.com/sharepoint/archive/2008/11/12/announcing- spdisposecheck-tool-for-sharepoint-developers.aspx • http://msdn.microsoft.com/en-us/library/bb687949.aspx • http://msdn2.microsoft.com/en- us/library/aa973248.aspx#sharepointobjmodel_otherobjectsthatrequire- disposal dynaTrace 20
  • 21. INEFFICIENT use of RESOURCES • Monitor resources • Monitor Memory • Monitor Database connections • Monitor „critical“ SharePoint objects (SPSite, SPWeb) • Identify leaking responsible WebParts Identify „leaking“ object instances Monitor SharePoint Memory -> Growing Heap? Identify who allocates those objects dynaTrace 21
  • 22. Data is REQUESTED in an INEFFICIENT way DEMO • How to identify a SPSite/SPWeb Resource Leak? • How to identify resource intensive WebParts? • How to monitor SharePoint Memory Issues down to the Object Model‘s Data Access classes? dynaTrace 22
  • 23. Web Parts Design Guidelines • Design Web Parts to perform only a single function in order to improve reuse • Design Web Parts to be configurable or customizable by users • Include a Web Part Manager in custom master pages that will be used by Web Part pages • Consider using Web Part verbs to allow users to perform discrete actions • Consider categorizing your properties to distinguish them from Web Part properties • Dispose properly of any SharePoint objects and unmanaged resources that you create in your Web Parts • Many SharePoint Objects hold references to unmanaged objects dynaTrace 23
  • 24. WebPart Troubleshooting • Attach to w3wp.exe process • Use Process Explorer to find correct w3wp (-ap parameter) • Understand ASP.NET Page Execution LifeCycle • ASP.NET is the underlying technology • Understand where your custom code fits in • Be careful with VIEWSTATE • Easy to use but comes with many side-effects • http://www.sitepoint.com/article/aspnet-performance-tips/2/ • Memory Management • Be careful with allocating too many small short living objects • Make sure to free references • Resource Management • Dispose/Release objects • Hold on to resources only as long as you need it dynaTrace 24
  • 25. Tips & Tricks • Use RenderContents or CreateChildControl vs. Render • http://www.andrewconnell.com/blog/archive/2008/02/18/Understanding-how-Web- Parts-are-rendered-why-to-never-use.aspx • Turn on IIS-Compression • http://planetmoss.blogspot.com/2007/06/dont-forget-iis-compression- colleague.html • http://www.sitepoint.com/article/aspnet-performance-tips/3/ • BLOB Caching • http://office.microsoft.com/en-us/sharepointserver/HA101762841033.aspx • Delay loading core.js • http://support.microsoft.com/kb/933823 • General ASP.NET Performance Tuning • http://www.sitepoint.com/article/aspnet-performance-tips/ dynaTrace 25
  • 26. Tips & Tricks • Pre-Create Personal Site • UserProfile.CreatePersonalSite() • Can take several seconds per user • Do it up-front to avoid heavy load when releasing new SharePoint installation using (SPSite spSite = new SPSite(@“http://server“)) { ServerContext siteContext = ServerContext.GetContext(spSite); UserProfileManager pmManager = new UserProfileManager(siteContext); UserProfile spUser = pmManager.GetUserProfile(„domainusername“); spUser.CreatePersonalSite(); } dynaTrace 26
  • 27. References & Contact • MS SharePoint Team Blog • http://blogs.msdn.com/sharepoint/default.aspx • http://blogs.msdn.com/sharepoint/archive/2006/02/27/539689.aspx • Contact me for follow up • Andreas Grabner • Mail: andreas.grabner@dynatrace.com • Blog: http://blog.dynatrace.com • Web: http://www.dynatrace.com dynaTrace 27