قبل التمسك بـ Varbinary (Max) دون إرسال بيانات خالية بالفعل إلى خادم SQL؟

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

  •  24-09-2019
  •  | 
  •  

سؤال

أقوم بتخزين البيانات في عمود Varbinary (Max) ، ولأسباب أداء العميل ، يكتب chunking من خلال وظيفة ".write ()" باستخدام SQL Server 2005. هذا يعمل بشكل رائع ولكن بسبب الآثار الجانبية ، أريد تجنب العمود varbinary التحجيم ديناميكيا خلال كل إلحاح.

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

هل هناك أي شيء في SQL يمكن أن يساعدني هنا؟ من الواضح أنني لا أرغب في إرسال مجموعة بايت فارغة إلى خادم SQL ، لأن هذا من شأنه أن يهزم جزئيًا الغرض من تحسين .write.

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

المحلول

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

إذا كنت ترغب في تخصيص كل شيء مسبقًا ، بما في ذلك بيانات الفائض في الصف ، يمكنك استخدام شيء أقرب إلى (مثال على ذلك 10000 بايت):

SELECT CONVERT([varbinary](MAX), REPLICATE(CONVERT(varchar(MAX), '0'), 10000))

نصائح أخرى

بادئ ذي بدء ، مجد للإجابة المقدمة - كانت هذه مساعدة رائعة! ومع ذلك ، هناك تغيير طفيف قد ترغب في مراعاته. يخصص الرمز أعلاه في الواقع الحقل varbinary مع حرف صفر تم تحويله (رمز السداسي 0x30). قد لا يكون هذا ما تريده بالفعل ، خاصة إذا كنت ترغب في إجراء عمليات ثنائية في هذا المجال لاحقًا. ما أعتقد أنه أكثر فائدة هو تخصيص الحقل بقيمة NUL (رمز السداسي 0x00) بحيث يتم إيقاف تشغيل جميع البتات افتراضيًا. للقيام بذلك ، قم ببساطة بإجراء التصحيح التالي:

SELECT CONVERT([varbinary](MAX), REPLICATE(CONVERT(varchar(MAX), CHAR(0)), 10000))

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