إستخدام الـ SqlBulkCopy لإدراج بيانات هائله في الـ SQL Server بكفاءة عاليه

04 يوليه 2017     357 مشاهدة    0 تعليق
تم النشر في #SQL Server  #Bulk Data  #Performance 

سنتحدت اليوم عن الفئة SqlBulkCopy وهي فئة نادرة الإستخدام بالرغم أنها تمتلك العديد من المزايا المفيدة خصوصاً عند التعامل مع كميات هائلة من البيانات.

قد يتعرض الكثير منا لبعض السيناريوهات خلال مسيرته المهنية ويتطلب منه نقل بيانات ضخمة من قاعدة بيانات إلى أخرى, بالتأكيد هنالك أكثر من حل لإتمام عملية النقل, ولكن قد يزداد الموضوع صعوبة إذا كانت البيانات المراد نقلها من ملف إكسل أو XML أو غيرهما.

وقد يصل البعض منا إلى حل ولكن قد يأخذ الموضوع ساعات كثيرة لإتمام عملية نقل هذه البيانات بصوره سليمه. فللذين يهمهم موضوع الأداء Performance في نقل البيانات دعوني أقدم لكم اليوم الفئة SqlBulkCopy والتي تسمح لنا بتحميل أو إدراج بيانات هائلة وبكفاءة عاليه من مصدر بيانات آخر إلى جدول في خادم البيانات SQL Server.

فقد قمت اليوم بمحاولة قراءة جدول المنتجات من قاعدة البيانات الشهيرة Northwind وتحويل الناتج إلى ملف XML, وذلك لعدم إمتلاكي لبيانات من مصدر آخر, وكان الملف الناتج بالصورة التالية:

<Products>
  <Product>
    <ProductID>17</ProductID>
    <ProductName>Alice Mutton</ProductName>
  </Product>
  <Product>
    <ProductID>3</ProductID>
    <ProductName>Aniseed Syrup</ProductName>
  </Product>
  <Product>
    <ProductID>40</ProductID>
    <ProductName>Boston Crab Meat</ProductName>
  </Product>
  <Product>
    <ProductID>60</ProductID>
    <ProductName>Camembert Pierrot</ProductName>
  </Product>
  ...
<Products>

طبعا لم أقم بنسخ جميع الأعمدة في الجدول ولكن يمكنك المحاولة وستلاحظ فرق الأداء. وبعدها قمت بإستخدام الفئة SqlBulkCopy لنقل بيانات ملف الـ XML إلى الـ SQL Server على النحو التالي:

Dim conn As New SqlConnection("Server=.;Database=MyDb;Integrated Security=True")
Dim bulkCopy As New SqlBulkCopy(conn)
Dim ds As New DataSet()

ds.ReadXml("Products.xml")
conn.Open()
bulkCopy.DestinationTableName = "Products"
bulkCopy.WriteToServer(ds.Tables(0))
conn.Close()

في الشيفرة المصدرية أعلاه قمت بإستخدام الفئة DataSet لتحميل البيانات من ملف الـ XML وبعدها تم تحديد الجدول المراد إدراج البيانات فيه وذلك عبر ضبط الخاصية DestinationTableName وأخيراً تم كتابة البيانات في الخادم وذلك بإستخدام الإجراء WriterToServer().

للمعلوميه السيناريو الذي تم تطبيقة لم تتجاوز عدد صفوف البيانات فيه 100 صف, لكن للتأكد من فعالية الأداء جرب أن تكون بياناتك ضخمه بالفعل مثل 10000 أو 100000 صف, وستلاحظ الفرق الواضح في الأداء بين الطريقة أعلاه و طريقة إدارج البيانات صفاً بصف بإستخدام جملة الإدراج Insert.

تويتر فيسبوك قوقل + لينكد إن


اكتب تعليقك