مجموعة بيانات كبيرة (من SQL إلى C#)، وإصلاح وقت التحميل الطويل

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

سؤال

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

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

  1. أكبر دائرة نصف قطرها هو 20 ميلا.أقوم بإنشاء جدول قاعدة بيانات يحتوي على سجلات لكل رمز بريدي في الولايات المتحدة، مرتبطًا بكل رمز بريدي ضمن مسافة 20 ميلًا من هذا الرمز البريدي.تبدو مجموعة البيانات كما يلي (الأسماء مختلفة من أجل الجدال):
    Sourcezip] | [المدينة] | [الدولة] | [Closezip] | [المدينة] | [الدولة] | [مسافة
    فشل:على سبيل المثال، لدى نيويورك 350 ألف سجل من مجموعة البيانات المذكورة أعلاه (والولايات الأخرى أسوأ!).متوسط ​​وقت التحميل على تلك الصفحة؟6 دقائق...لا يحدث.لقد تحققت من ذلك عن طريق تعيين نقاط التوقف، وخلال مرحلة dataadapter.fill() يحدث قطع الاتصال.

  2. (لم يتم تنفيذ هذا مطلقًا بسبب مشكلة لوجستية) أقوم بإجراء اتصال بقاعدة بيانات لكل موظف من نوع zip إلى ملفات zip المستهدفة للوسائط بمسافة x أو أقل.باستثناء أن الملفات المصدر وأهداف الوسائط مجتمعة يمكن أن تصل إلى ما يصل إلى 34 ألف رسالة بريد إلكتروني فردية.اتصالات 34 كيلو ديسيبل؟حتى لو تمكنت من ابتكار طريقة لإعادة استخدام عمليات البحث عن الرمز البريدي، فقد أجريت بعض اختبارات الاختبار في قاعدة البيانات ووجدت أن هناك 500 رمزًا بريديًا مميزًا في نيويورك حيث يعمل الموظفون.اتصالات 500 ديسيبل؟أشك في أن هذا سينجح ولكن يمكن أن أتفاجأ.

  3. أحدث مخططاتي للتغلب على المشكلة هو الأمل في أن يقوم خادم الويب بتشغيل لعبة أفضل من كائن مجموعة بيانات .net من خلال الحصول على مجموعة بيانات جديدة تبدو كما يلي:
    Zip] | [خط الطول] | [خط العرض
    ثم قم بإجراء صيغة المسافة لمعرفة ما إذا كانت البيانات تعمل أم لا.ويعتمد هذا بشكل كبير على المعالجات الموجودة على خادم الويب.هل هذه مقامرة جديرة بالاهتمام، أم أنني سأجد نفس الضرر الناتج عن وقت التحميل في هذه المحاولة أيضًا؟

    هل هناك طريقة أفضل؟

    وأنا أقدر أي مساهمة، حتى لو كانت تؤكد مخاوفي من هذا المشروع فقط قد لا تعمل.

ملاحظات إضافية:ليس لدي سيطرة على الخادم، وأنا أقوم بتشغيل SQL2k :(.أقوم ببرمجة الموقع على برنامج visual studio 2005 Framework 2.0.قد تتم الترقية إلى SQL2005 وVS2008 خلال الأشهر القليلة المقبلة.

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

المحلول

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

SELECT *
FROM Employees_List
   INNER JOIN 
       (Media_List INNER JOIN Distance_List ON Media_List.Zip = Distance_List.Target_Zip)
   ON Employees_List.Zip = Distance_List.Source_Zip
WHERE distance_Miles <=5

بهذه الطريقة يمكنك ضبط العلاقات بين الموظف ووسائل الإعلام باستخدام المسافة.

نصائح أخرى

إذا كانت لديك قاعدة بيانات للرمز البريدي تحتوي على إحداثيات خطوط الطول/خطوط العرض، فيمكنك حساب المسافة بسرعة باستخدام وظيفة Haversine (انظر الإجابة على هذا السؤال).

يؤدي هذا أداءً جيدًا للغاية في تطبيقات الويب مع بيانات الرمز البريدي الأمريكي بالكامل.

سيبدو الاستعلام كشيء مشابه لما يلي:

select * from zip where 
   dbo.udf_Haversine(zip.lat,zip.long, @lat, @lon) < 20   -- (miles)

لا يمكنك تطبيق ذلك على عنوان كل مستلم، ولكنك ستحدد الرموز البريدية ضمن النطاق الخاص بك أولاً (في استعلام متداخل، أو باستخدام CTE)، ثم قم بضم جميع العناوين التي تحتاج إلى إرسال بريد إليها.

يحرر بعد التحقيق، الإجابة باستخدام وظيفة Haversine هي الطريق الذي سأسلكه...إنها ليست مكثفة مثل الوظيفة التي تستخدمها قاعدة بياناتنا (والتي سيتم إصلاحها :))

يجب لا احسب المسافات في كل مرة، فهي عملية حسابية ثقيلة من الطول/العرض إلى الطول/العرض، وإذا كنت تقوم بذلك أكثر من مرة، فهذا غير ضروري.

ومع ذلك، لست متأكدًا من سبب شطب الخيار رقم 2 بالفعل.نحن في الواقع نقوم بشيء مشابه لهذا.ربما أكون في حيرة من أمري بسبب الأرقام، ولكن ما ذكرته لا ينبغي أن يعرقل SQL2k.

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

لن يستغرق تحديد 350 ألف صف (مثالك لنيويورك) 6 دقائق إذا طلبت الجدول والفهرس حسب SOURCEZIP (ALTER TABLE ..ORDER BY (SOURCEZIP)) في MySQL.يجب أن لا يستغرق الأمر سوى جزء من الثانية..سيستغرق ALTER وقتًا طويلاً (أو يمكنك إنشاء الجدول بهذا الترتيب) - ولكن بما أنه جدول ثابت فلن يكون له أي قيمة.

هل تستخدم SQL 2008؟إذا كان الأمر كذلك، فقد تكون ميزات البيانات المكانية الجديدة هي ما تبحث عنه هنا.يمكنك العثور على إحداثيات ضمن نطاق آخر بنفس سهولة استخدام مقارنة "LIKE" على السلاسل.

http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx

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