يعمل SPQuery على المكتبات ضمن عتبة عرض القائمة، ولكن ليس أكثر من ذلك

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/62609

سؤال

لذلك أقوم بإنشاء جزء ويب يعدد جميع doclibs في الويب الحالي، ويلتقط جميع الملفات المسحوبة ويدرجها في جدول، مما يسمح للمستخدم بتطبيق بعض البيانات التعريفية المطلوبة والتحقق من العديد منها مرة واحدة (50).

يجب أن يعمل جزء الويب هذا على القوائم التي تتجاوز عتبة عرض القائمة (التي تم تعيينها حاليًا على 15000 في الإنتاج)، وكذلك على المواقع الكبيرة جدًا (50000 - 100000+ مستند).

أنا أتبع أفضل ممارسات MS للتعامل مع القوائم الكبيرة هنا: http://msdn.microsoft.com/en-us/library/ee557257.aspx

استخدام SPquery (بدون تعريف CAML على الإطلاق)، واسترداد صفحات مكونة من 2000 عنصر والتحليل بهذه الطريقة.تكمن المشكلة في ذلك في أن جزء الويب يتسبب بالفعل في حدوث مهلة على تلك المواقع الكبيرة جدًا (50 كيلو بايت +).لذلك أحاول أن أكون أكثر ذكاءً بعض الشيء مع CAML الخاص بي، حيث أقوم بسحب العناصر التي تم سحبها فقط:

spQuery.Query = "<Where><IsNotNull>
    <FieldRef Name=\"CheckoutUser\" LookupId=\"TRUE\"/>
</IsNotNull></Where>";
spQuery.RowLimit = 2000;
spQuery.ViewAttributes = "Scope=\"Recursive\"";

أنا أستخدم أ CrossListQueryInfo الاستعلام للاستعلام عن الويب بالكامل باستخدام نفس Caml، وهو يعمل بشكل رائع عندما لا توجد قائمة فوق LVT.إذا كان الأمر كذلك، فأنا ألاحظ هذا الاستثناء وأعيد المحاولة باستخدام SPQuery "الأبطأ" في كل مكتبة على حدة.

من كل ما أقرأه، طالما أن CAML الخاص بي يُرجع عناصر أقل من LVT، فيجب أن يعمل.لكن استخدام CAML أعلاه يسبب الخطأ The attempted operation is prohibited because it exceeds the list view threshold enforced by the administrator ليتم رميها عندما SPList.GetItems(spQuery) يسمى.نظرًا لأنني أقوم بتعيين حد أقصى يبلغ 2000، ألا ينبغي أن يحدث ذلك أبدًا؟يقترح MS تنفيذ SPQuery بدون تعريف CAML على الإطلاق - حيث يتم بشكل أساسي الحصول على جميع العناصر من المكتبة في صفحات يبلغ عددها 2000 صفحة.لذلك لا أستطيع أن أفهم سبب فشل CAML الخاص بي فقط في القوائم التي تتجاوز حد العرض.

يحرر:بعد مزيد من البحث، أحاول الاستفادة من ContentIterator فئة لتلبية احتياجاتي (http://msdn.microsoft.com/en-us/library/microsoft.office.server.utilities.contentiterator.aspx).باستخدام أمثلة من هذا المنصب: http://extreme-sharepoint.com/2012/07/17/data-access-via-caml-queries/

ما زلت أفشل في أداة المحتوى بنفس خطأ LVT.

هل يلزم فهرسة حقل "CheckoutUser" في كل قائمة نريد تنفيذ هذا الاستعلام عليها؟

التحديث 2:يعود ذلك إلى عدم فهرسة حقل "CheckoutUser"، ومحاولة الاستعلام عنه.لسوء الحظ، ليس خيارًا بالنسبة لنا أن نخرج ونفرض هذا الفهرس على كل مكتبة في المزرعة.أعتقد أن خياري الوحيد في هذه المرحلة هو تنفيذ نوع من نظام الترحيل على مواقع كبيرة جدًا لمعالجة العناصر على دفعات.

التحديث النهائي:كحل، قررت فرض فهرسة عمود "CheckoutUser" للمكتبات.ومن المفترض أن يؤدي ذلك إلى تحسين الأداء الإجمالي لجزء الويب بشكل كبير، كما يسمح بدعم المواقع الكبيرة جدًا.سيكون هناك القليل من المتاعب مباشرة بعد النشر، حيث سنحتاج إلى تعيين فهرس العمود يدويًا على القوائم التي تتجاوز عتبة عرض القائمة، ولكن على المدى الطويل سيكون هذا هو الأفضل.

هل كانت مفيدة؟

المحلول

إن فهمي لكيفية عمل "عتبة عرض القائمة" محدود، ومع ذلك، أعتقد أن سبب فشل استعلام CAML الخاص بك هو أنه يتم التصفية في الحقل غير المفهرس، ويتم تطبيق RowLimit "بعد ذلك".

أعتقد أن فهرسة حقل CheckoutUser من شأنها أن تحل مشكلتك، ولكن يبدو أن لديك الكثير من المواقع.

اسمحوا لي أن أقترح نهجا بديلا - الترحيل.نظرًا لفهرسة عمود المعرف في كل قائمة، قم بتنفيذ استعلام CAML حيث تقوم بالتصفية أولاً (مهم جدًا) في عمود المعرف أقل من 2000 على سبيل المثال، وثانيًا في حقل CheckoutUser.إذا لم يُرجع هذا الاستعلام العدد المطلوب من النتائج، فقم بزيادة 2000 إلى 4000 وكرر الأمر.

لم أطبق هذا الحل بنفسي، إنه مجرد فكرة.

نصائح أخرى

إذا كنت تستعلم عن قوائم كبيرة، فيجب عليك بالتأكيد فهرسة الحقول التي تستعلم عنها.لا يحدث التقييد لأنه يتم تخزين الحقول المفهرسة في جدول منفصل في قاعدة البيانات.

أعتقد أن مشاركة مدونتي هذه يجب أن تكون ذات فائدة:http://vrdmn.blogspot.in/2012/11/sharepoint-list-indexes-under-hood.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى sharepoint.stackexchange
scroll top