ما هي بعض أفضل الممارسات من أجل الاستعلام عن البيانات الثنائية من قاعدة بيانات؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

والشكر

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

المحلول

وإضافة عمود من MD5، وهو الاختباري MD5 من البيانات BLOB. أو، يمكنك إنشاء جدول جديد بنفس المفتاح الأساسي والعمود MD5.

وحدة ذاكرة التخزين المؤقت خارج قاعدة بيانات يمكن الاستفادة من هذا العمود ليس لديهم لاسترداد عمود BLOB مرتين في ذاكرة التخزين المؤقت ضرب.

وOR، هل يمكن إسقاط البيانات BLOB في قاعدة البيانات وتخزينها في نظام الملفات مع قيمة MD5 على أنه اسم الملف مع خادم http كما ملقم ملفات الشبكة.

نصائح أخرى

ودون معرفة متطلباتك بالضبط، وأنا لا يمكن إلا أن بعض التعليقات العامة.

والنقط في أوراكل ليست أكثر سريع من أنواع. تأكد من أنك لا تبني ل العديد من اختناقات الأداء في التصميم الخاص بك، ولا تشغيل اختبارات الأداء على الوظائف التي لا بناء في أقرب وقت ممكن لضمان انها سوف تلبي المتطلبات.

وdbms_lob هو صديقك. وعلى وجه الخصوص قد تجد وظيفة القراءة وSUBSTR (لقراءة أجزاء من سائل) من فائدة.

والابتعاد عن إجراءات C نمط خارجية - انهم من المرجح أن يكون الكثير من اجل ابطاء. PL / وظائف SQL تميل إلى أن تكون أسرع بكثير. أنا لا أعرف عن الإجراءات جافا. كما جافا محرك أكثر اندماجا أوراكل أنها قد تكون جيدة جدا للاستخدام. قد يكون من المفيد القيام دليلا الأولي لمفهوم مقارنة PL / SQL ضد جافا.

ومع جافا، عليك أن تكون قادرا على قراءة البيانات في كما بايت [] تيار والتلاعب لقلوبكم المحتوى باستخدام العالم و جافا. الإجراءات الخارجية للجافا من السهل القيام به - يمكنك حتى مجرد إعطاء أوراكل شفرة المصدر جافا

.

لPL / SQL، أسلوب واحد وجدنا من المفيد جدا هو لتحويل سائل إلى الخام، ويلقي ذلك ل وVARCHAR، ومن ثم تحويل ذلك إلى عرافة، ثم التلاعب عرافة (الجمل) مع وظائف سلسلة أوراكل القياسية. أي بمعنى:

create or replace function retrieve_data_from_blob (
    b blob
    , tag_code
)
as
    lw long raw;
    data varchar(30000);
    result varchar(100);
    amount pls_integer := 30000;
begin
    -- covert blob to long raw.
    -- amount will hold total bytes read.
    dbms_lob.read(b, amount, 1, lw);
    data := util_raw.rawtohex(lw);
    -- retrieve_embedded retrieves data tagged with tag_code
    -- from internal binary structure by reading hex data
    return retrieve_embedded(data, tag_code);
end;
/

وهذا من شأنه أن العمل من أجل النقط تصل إلى 15KB في الحجم. قد وظيفة retrieve_embedded، على سبيل المثال، أن يكون قادرا على قراءة الأولى "بايت" عن طريق القيام substr(data, 1, 8)، وتحويل ذلك إلى عشري عبر to_number(hexdata, 'xxxxxxxx') استخدامه بمثابة إزاحة ... الخ.

يمكن المعلمات التخزين جعل تماما فرق كبير عندما يتعلق الأمر على حد سواء تخزين واسترجاع النقط الصغيرة نسبيا (

ولعل أكبر تأثير على الأداء وتمكين أو تعطيل "في ROW" التخزين - انها بالتأكيد يستحق تجريب

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