Problem:
I have a production SharePoint farm that contains 10 web front ends with dedicated redundant distributed cache servers and BLOB cache configured, recently I developed an ASCX control to retrieve only 1 item from a SP list that contains more than 11K items, the retrieval of the item is based on a CAML query (server-side code), the query takes 2 parameters (ID and Mobile number).
on submit button click event, I am checking if the item is there or not with a boolean function as below:
if (CheckItems()) { lblSuccessMsg.Text = "Applicant Name " + ApplicantName + " " + "ID number " + fID + " " + "Mobile number " + fMobile + "<br/>" + "<br/>" + "<div class='mainDetail'>" + "<div class='details'>Subject: <span>" + Subject + "</span></div><br/>" + "<div class='details'>Stage: <span>" + Stage + "</span></div><br/>" + "<div class='details'>Job: <span>" + Job + "</span>" + "</div>"; ...etc } else { lblFailMsg.Text = "no data exists"; }
Boolean function:
private bool CheckItems() { using (SPSite oSPSite = new SPSite(SPContext.Current.Site.Url)) { using (SPWeb oSPWeb = oSPSite.OpenWeb("relativeurl")) { SPListItemCollectionPosition position = null; do { SPList ApplicantsList = oSPWeb.Lists["listname"]; SPQuery spQuery = new SPQuery(); spQuery.Query = "<Where><And><Eq><FieldRef Name='NationalID' /><Value Type='Text'>" + txtNationalID.Text + "</Value></Eq><Eq><FieldRef Name='MobileNo' /><Value Type='Text'>" + txtMobileNo.Text + "</Value></Eq></And></Where><RowLimit>100</RowLimit>"; SPListItemCollection items = ApplicantsList.GetItems(spQuery); position = items.ListItemCollectionPosition; if (items.Count > 0) { for(int i = 0; i < 100 && i < items.Count; i++) { SPListItem item = items[i]; ApplicantName = item["applicantName"] != null ? item["applicantName"].ToString() : "no data"; NationalID = item["NationalID"] != null ? item["NationalID"].ToString() : "no data"; MobileNo = item["MobileNo"] != null ? item["MobileNo"].ToString() : "no data"; Subject = item["Subject"] != null ? item["Subject"].ToString() : "no data"; Stage = item["Stage"] != null ? item["Stage"].ToString() : "no data"; Job = item["Job"] != null ? item["Job"].ToString() : "no data"; } return true; } else { return false; } } while (position != null); } } }
My questions is:
Is there any problem with the CAML query its self, will it make any bottlenecks/slowness in performance or causing the site to be unavailable?, where this query should be run by large number of users , let's say around 100K users, does the query in the boolean function needs optimization or any further enhancement?
Note: The fields being used in the query are indexed in the SharePoint list.
Your help is much appreciated.