الحد الأقصى للحجم لاستعلام SQL Server؟ في جملة؟ هل هناك نهج أفضل [مكررة

StackOverflow https://stackoverflow.com/questions/1869753

  •  18-09-2019
  •  | 
  •  

سؤال

ممكن مكررة:
T-SQL حيث العقيد في (...)

ما هو الحد الأقصى للحجم لاستعلام SQL Server؟ (# من الشخصيات)

الحد الأقصى لحجم البند؟ أعتقد أنني رأيت شيئا عن Oracle الذي يحتوي على حد 1000 عنصر ولكن يمكنك التغلب على هذا مع وجود 2 INS معا. مشكلة مماثلة في خادم SQL؟

تحديثإذن ما هو أفضل نهج إذا كنت بحاجة إلى اتخاذ 1000 GUIDs من نظام آخر (قاعدة بيانات غير علنية) وقدم "الانضمام في الكود" مقابل خادم SQL؟ هل يجب إرسال قائمة 1000 GUID إلى جملة في جملة؟ أم أن هناك تقنية أخرى تعمل بشكل أكثر كفاءة؟

لم أختبر هذا لكنني أتساءل عما إذا كان بإمكاني إرسال GUID كوثيقة XML. علي سبيل المثال

<guids>
    <guid>809674df-1c22-46eb-bf9a-33dc78beb44a</guid>
    <guid>257f537f-9c6b-4f14-a90c-ee613b4287f3</guid>
</guids>

ثم قم بعمل نوع من XQuery مقابل الوثيقة والجدول. أقل كفاءة من 1000 عنصر في جملة؟

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

المحلول

كل دفعة SQL لديها لتناسب في حجم دفعة الحد.: 65،536 * حجم حزمة الشبكة.

بخلاف ذلك، يقتصر استفسارك عن ظروف وقت التشغيل. وسوف ينفد عادة من حجم المكدس لأن x في (a، b، c) لا شيء سوى x = a أو x = b أو x = c التي تنشئ شجرة تعبير مشابهة ل x = a أو (x = b OR (x = ج))، لذلك يصبح عميقا جدا بعدد كبير من أو. SQL 7 سوف تصل إلى ذلك في حوالي 10K القيم في, ، لكن مداخن NewDays أعمق بكثير (بسبب X64)، لذلك يمكن أن تذهب عميقا جدا.

تحديث

وجدت بالفعل مقالة أرلندا حول موضوع القوائم / صفائف المرور إلى SQL Server. مع SQL 2008 لديك أيضا الجدول المعلمات قيمة والتي تتيح لك تمرير DataTable بأكملها كمعلمة نوع جدول واحد والانضمام إليها.

XML و XPath هو حل قابل للتطبيق آخر:

SELECT ...
FROM Table
JOIN (
   SELECT x.value(N'.',N'uniqueidentifier') as guid
   FROM @values.nodes(N'/guids/guid') t(x)) as guids
 ON Table.guid = guids.guid;

نصائح أخرى

يتم الكشف عن أقصى حد SQL Server http://msdn.microsoft.com/en-us/library/ms143432.aspx. (هذا هو إصدار 2008)

يمكن أن يكون استعلام SQL varchar (كحد أقصى) ولكنه عرض على أنه يقتصر على حجم حزمة شبكة 65،536 * ولكن حتى الآن ما هو أكثر عرضة لرحلاتكم هو المعلمات 2100 لكل استعلام. إذا اختار SQL تحديد القيم الحرفية في الفقرة، فسوف أظن أنك ستضرب هذا الحد أولا، لكنني لم أختبرها.

تحرير: اختبارها، حتى في ظل المعلمة القسرية التي نجت - لقد طرقت اختبارا سريعا وكان قد تم تنفيذها مع عناصر 30K داخل البند في البند. (SQL Server 2005)

في 100K عناصر، استغرق الأمر بعض الوقت ثم انخفض مع:

MSG 8623، المستوى 16، الدولة 1، السطر 1 نفد معالج الاستعلام من الموارد الداخلية ولا يمكن أن تنتج خطة الاستعلام. هذا حدث نادر ويتوقع فقط لاستفسارات أو استفسارات معقدة للغاية تشير إلى عدد كبير جدا من الجداول أو الأقسام. يرجى تبسيط الاستعلام. إذا كنت تعتقد أنك تلقيت هذه الرسالة في الخطأ، فاتصل بخدمات دعم العملاء لمزيد من المعلومات.

حتى 30K ممكن، ولكن فقط لأنه يمكنك القيام بذلك - لا يعني أنه يجب :)

تحرير: استمر بسبب سؤال إضافي.

عملت 50K، ولكن 60 كيلو سقطت، لذلك في مكان ما هناك على اختبار بلدي الاختبار راجع للشغل.

من حيث كيفية القيام بذلك الانضمام إلى القيم دون استخدام جملة كبيرة، شخصيا أود إنشاء جدول مؤقت، أدخل القيم في جدول Temp هذا، فهرسه ثم استخدمه في انضمامه، مما يمنحه أفضل الفرص يفيد الانضمام. (إن إنشاء الفهرس الموجود في جدول TEMP سيخلق إحصائيات لذلك، مما سيساعد Optimiser كقاعدة عامة، على الرغم من أن 1000 GUID لن يجد الإحصائيات بالضبط مفيدة للغاية.)

لكل دفعة، 65536 * حجم حزمة الشبكة وهو 4K حتى 256 ميغابايت

ومع ذلك، سوف تتوقف في الطريق قبل ذلك ولكن الأمر غير دقيق.

في نهاية المطاف مع أخطاء الذاكرة ولكن لا يمكنني تذكر الخطأ الدقيق. في حالة ضخمة سيكون غير فعال على أي حال.

تحرير: ذكرني REMUS: الخطأ يدور حول "STACK SIZE"

يمكنك تحميل guids في جدول خدش ثم القيام به

... WHERE var IN SELECT guid FROM #scratchtable
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top