سؤال

هل هناك أي مزايا استخدام منشأة SQL العبور جنبا إلى جنب مع SAS؟

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

المحلول

وعلى الرغم من أن هذا السؤال هو واسع أكثر من اللازم، لا أستطيع تقديم إجابة واسعة للغاية.

ووSQL تمريري في SAS يسمح لك بالاتصال مباشرة مع قاعدة بيانات. هذا يصبح من المفيد جدا عند استخدام وظائف محددة قاعدة البيانات. على سبيل المثال سيكون ظائف احصائيات أوراكل. لم يكن لديك ما يدعو للقلق حول كيفية التعامل مع SAS الترميز الخاص بك أو ترجم SQL الخاصة بك.

وبالإضافة إلى ذلك، فقد كان أيضا فائدة لنا التي تمر من خلال SQL يتطلب معالجة قليلا جدا على الجانب SAS. إذا كان لديك مربع SAS مشغولا للغاية، يمكنك أن تختار لإرسال منطق المعالجة مباشرة إلى قاعدة البيانات. وهذا ممكن من دون استخدام SQL تمرير من خلال، ولكن لديك درجة عالية من السيطرة عندما الاستفادة من ذلك.

وهذه ليست بأي حال قائمة شاملة من المزايا، ببساطة بضع الامتيازات على مستوى عال لاستخدام SQL تمريري. إذا كان لديك حالة استخدام أكثر واقعية، ويمكننا مناقشة الاختلافات المحددة في تقنيات الترميز.

نصائح أخرى

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

libname db <database> path=dbserver user=... password=...;
proc sql;
   create table db.new as
   select * from db.largedata where flag=1;
quit;

وهذا من شأنه في الواقع (على الأقل من خلال SAS 9.1.3) سحب جميع البيانات التي تتوافق مع العلم = 1 الى SAS ومن ثم تحميله مرة أخرى إلى قاعدة البيانات. كان هذا هو الملايين من الصفوف أنه يبطئ حقا إلى أسفل.

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

proc sql;
   connect dbase (server=dbserver user=... password=...);
   execute (create table db.new as
   select * from db.largedata where flag=1) as dbase;
   disconnect dbase;
quit;

وأنا فعلت مؤخرا مثال باستخدام أوراكل وطاولة مع حوالي 250،000 الصفوف. أخذت الطريقة الأولى 20 ثانية والطريقة الثانية ل2 ثانية.

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

وهناك مزايا لاستخدام العبور، ولكن ذلك يعتمد على ما كنت تحاول إنجاز. عموما، وأنا استخدم مزود بروك القياسية دون العبور عند القيام استفسار. في الآونة الأخيرة، ومع ذلك، كنت استخدمه لتوليد بعض procs المخزنة.

proc sql;
    connect to mysql(user = 'xxxxx' pass = 'xxxxx' server = 'localhost');
        execute(set @id = &id.) by mysql;
        execute(select (@lit:=image_text) from quality.links_image_text where image_id = @id) by mysql;
        execute(set @lidx = locate('ninja',@lit)) by mysql;
        execute(set @lidx2 = locate(' ',@lit,@lidx)) by mysql;
        execute(set @lidxd = @lidx2 - @lidx) by mysql;
        execute(set @lf = substr(@lit,@lidx,@lidxd)) by mysql;

        create table asdf as
        select &id. as id, a as ws from connection to mysql
        (select @lf as a)
        ;
    disconnect from mysql;
quit;

ومن الواضح أن هذا ليس شيئا يمكن القيام به خارج العبور (على الأقل ليس أن أعرف). لذلك نعم ... كل هذا يتوقف على ما هو عليه كنت تحاول إنجاز.

وببساطة، SQL بيانات المار تعطيك المزيد من السيطرة على ما يحصل إرسالها إلى قاعدة البيانات.

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