سؤال

أقوم بتشغيل استفسارات مقابل Oracle 10G باستخدام JDBC (باستخدام أحدث برامج التشغيل و UCP كمستحضرات البيانات) من أجل استرداد CIRL (AVG. حرف 20 ألف). ومع ذلك، يبدو أن الأداء سيئا للغاية: استرجاع الدفعة من 100 اللوصات يستغرق 4s في المتوسط. العملية هي أيضا لا أكون أنا / س ولا وحدة المعالجة المركزية ولا ربط الشبكة من ملاحظاتي.

يبدو إعداد الاختبار الخاص بي مثل هذا:

PoolDataSource dataSource = PoolDataSourceFactory.getPoolDataSource();
dataSource.setConnectionFactoryClassName("...");
dataSource.setConnectionPoolName("...");
dataSource.setURL("...");
dataSource.setUser("...");
dataSource.setPassword("...");

dataSource.setConnectionProperty("defaultRowPrefetch", "1000");
dataSource.setConnectionProperty("defaultLobPrefetchSize", "500000");

final LobHandler handler = new OracleLobHandler();
JdbcTemplate j = new JdbcTemplate(dataSource);

j.query("SELECT bigClob FROM ...",

        new RowCallbackHandler() {

            public void processRow(final ResultSet rs) throws SQLException {

                String result = handler.getClobAsString(rs, "bigClob");

            }

        });

}

لقد جربت أحجام الجلب ولكن دون جدوى. أفعل شيئا خاطئا؟ هل هناك طريقة لتسريع استرجاع clob عند استخدام JDBC؟

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

المحلول 4

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

مما لا شك فيه سيكون هناك خيارات أفضل للتعامل معها مع كابيب كبيرة (خاصة الضغط) في بيئة 11G ولكن أجهزة الصراف الآلي. أنا عالق مع 10G.

لقد اخترت الآن للحصول على طاولة إضافية إلى قاعدة البيانات التي أعمل فيها مسبقا التصنيف في حجم RAW Binary Size. في عمليات النشر السابقة، كان هذا دائما خيارا سريعا للغاية، ومن المرجح أن يستحق مشكلة الحفاظ على ذاكرة التخزين المؤقت المحسوبة دون اتصال بالإنترنت. سيتم تخزين ذاكرة التخزين المؤقت وتحديثها باستخدام عملية مستمرة و AQ حتى يأتي شخص ما بفكرة أفضل.

نصائح أخرى

تجربتي السابقة في استخدام بيانات Oracle Lob Type لتخزين البيانات الكبيرة لم تكن جيدة. فلا بأس عندما تكون أقل من 4K منذ تخزينها محليا مثل Varchar2. بمجرد انتهاء الأمر أكثر من 4K، تبدأ في رؤية الأداء يتحلل. ربما، ربما تكون الأمور قد تحسنت منذ آخر مرة جربتها قبل بضع سنوات، ولكن هنا هي الأشياء التي وجدتها في الماضي لمعلوماتك:

كما يحتاج العملاء للحصول على اللصوص عبر خادم أوراكل، قد تفكر في الوضع التالي المثيرة للاهتمام.

  • سوف تنافس بيانات LOB من ذاكرة التخزين المؤقت SGA محدودة مع نوع بيانات آخر إذا قرر Oracle التخزين المؤقت. كبيانات Clob كبيرة كبيرة، لذلك قد تدفع البيانات الأخرى
  • Get Data Data قراءة القرص الفقراء إذا قرر Oracle عدم تخزينها، وتدفق البيانات إلى العميل.
  • ربما يكون التشرذني شيئا لم تواجهه بعد. سترى ما إذا كانت تطبيقاتك تحذف اللوصات، وتحاول Oracle إعادة استخدام LOB. لا أعرف إذا دعم Oracle عبر الإنترنت إلغاء تجزئة القرص ل LOB (لديهم الفهارس، لكنه يستغرق وقتا طويلا عندما جربنا ذلك السابق).

لقد ذكرت 4S مقابل 100 صور من AVG 20K، لذلك فهي 40 دقيقة لكل صور. تذكر أن كل لوب يجب أن يتعين استرجاعها من خلال مواقع Lob منفصلة (ليس في النتيجة المحددة افتراضيا). هذه رحلة اجتماعية إضافية لكل مندوب، أفترض أن (أنا لست متأكدا 100٪ على هذا الأمر منذ فترة طويلة) إذا كان الأمر كذلك، أفترض أن ستكون ما لا يقل عن 5 مللي أمبير وقت إضافي لكل رحلة ذهابا وإيابا في النظام التسلسلي ، حق؟ إذا كان الأمر كذلك، فإن أدائك هو بالفعل محدود من خلال جلب LOB المتسلسل. يجب أن تكون قادرا على التحقق من ذلك عن طريق تتبع الوقت الذي يقضيه في تنفيذ SQL مقابل محتوى LoB. أو يمكنك التحقق من ذلك عن طريق استبعاد عمود LOB كما اقترح الإجابة السابقة في المنشور، والتي يجب أن تخبرك إذا كانت لوب ذات صلة.

حظا طيبا وفقك الله

الحجم الإجمالي لمجموعة النتائج في عشرة آلاف - تقاس خلال فترة الاسترجاع بأكملها التكاليف الأولية

هل هناك طلب من خلال الاستعلام؟ 10K الصفوف هو الكثير جدا إذا كان يجب فرزها.

أيضا، استرداد PK ليس اختبارا عادلا مقابل استرجاع CLOB بالكامل. يقوم Oracle بتخزين صفوف الجدول مع الكثيرين في كتلة، ولكن سيتم تخزين كل من تطوين (إذا كانت> 4K) خارج الخط، في كل غرفة من الكتل. مسح قائمة PK سيكون بسرعة. أيضا، ربما يكون هناك فهرس على PK، لذلك يمكن لأوراكل فحص كتل الفهرس بسرعة فقط وليس حتى الوصول إلى الجدول.

4 ثوان تبدو عالية بعض الشيء، ولكنها تحتاج إلى 2 ميغابايت تحتاج إلى قراءة من القرص ونقلها عبر الشبكة إلى برنامج Java الخاص بك. يمكن أن تكون الشبكة مشكلة. إذا قمت بإجراء تتبع SQL للجلسة، فسوف يشير إليك بالضبط حيث يتم إنفاق الوقت (يقرأ القرص أو الشبكة).

كان لدي مشكلة مماثلة ووجدت Lobs JDBC إجراء مكالمة شبكة عند الوصول إلى اللصوص.

اعتبارا من برنامج تشغيل Oracle 11.2g JDBC، يمكنك استخدام Prefetch. هذا يسرع الوصول إلى 10 مرات ...

statement1.setFetchSize(1000);
if (statement1 instanceof OracleStatement) {
    ((OracleStatement) statement1).setLobPrefetchSize(250000);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top