پروژه تحقيقاتي پايگاه داده:
عنوان:
1) مروري بر سيستمهاي بانك اطلاعاتي و مزاياي Oracle
2) معــرفـي POSTGEERSQL
1) مروري بر سيستمهاي بانك اطلاعاتي و مزاياي Oracle
* مقدمه
دانش بشر در گستره علوم و فنون ، طي پنجاه سال گذشته از رشدي بéسابقه برخوردار بوده است و اين رشد و تكامل سريع و بيمانند را بايد متأثر از تماسك علوم مختلف و استفاده پژوهشگران از نتايج دستاوردهاي يكديگر دانست . امروز ديگر كمتر كشف و اختراعي است كه اتفاقي و تصادفي باشد و تقريبا كليه نوآوريها در يافتن ارتباط صحيح بين اطلاعات موجود بشر در عرصههاي گوناگون خلاصه شود . از اينروست كه در نيمه دوم قرن بيستم شاهد هستيم كه كشورهاي توسعه يافته بيش از هر زمان به اطلاعات و سازماندهي و مديريت آنها بها دادهاند . مبالغ هزينه شده در مراكز تحقيقاتي و دانشگاهي ، خود گواه بر اين ادعاست و اين توجه ، پاسخي است به پديده " انفجار اطلاعات " در چند دهه اخير .
در طي سالهاي اخير ، شاهد تحولات عميق در نحوه مديريت سازمانها بر اساس نظريه نوين مديريت سيستماتيك بوده و همگام با آن بطور پيوسته ناظر بر افزايش نياز مديران به اطلاعات و منابع اطلاعاتي هستيم .گفته شود نود درصد از احتياجات لازم براي اخذ يك تصميم را اطلاعات تشكيل دهد و ده درصد باقي مانده تابع انگيزه و سليقه باشد و در اين راستا پيشرفت بشر در زمينه تكنولوژي اطلاعاتي را بطور قطع بايد مرهون كامپيوتر و علوم انفورماتيك دانست .
اين مقاله حاصل مطالعه تجربيات در امر تجزيه و تحليل سيستمهاي گردش اطلاعات و برنامهنويسي كاربردي باشد و حاوي مطالبي اجمالي پيرامون شناخت و نحوه طراحي " سيستمهاي اطلاعاتي " و در نهايت مروري بر بانكهاي اطلاعاتي توسعه يافته در ORACLE باشد .
با گسترش تكنولوژي كامپيوتر ، افزايش سرعت پردازش آنها و كاهش قيمت ، در حقيقت بهتر و بهتر شدن نسبت عملكرد به قيمت ( Price / Performance ) ، تمامي فعاليتهاي علمي ، تكنولوژي ، مالي ، تجاري ، مديريتي و حتي توان تفكر و مرزهاي ذكاوت و انديشه انسان ، افق جديدي يافته است . از همان ابتداي تولد تكنولوژي كامپيوتر ، دانشمندان و محققين زيادي در نقاط مختلف جهان درصدد رسيدن به يك هدف متعالي بودهاند و آن هدف عبارت بوده است از ساخت كامپيوترهايي كه خروجي آن داراي خصوصيتي باشد كه نتوان آنرا با نتيجه تلاش فكري يك انسان متخصص و متفكر فرق نهاد .
بدون شك ، نتيجه چنين خصوصيت و توانايي وراي تصور باشد . فقط توان گفت ، تأثر آن در تراوشات فكري بشر ، توسعه علوم و تكنولوژي فوقالعاده خواهد بود . مگر نه اين است كه انقلاب اول صنعتي فقط توان بازوان انسان را افزايش داد و نه تفكر .
از دنياي كامپيوتر ، بخشهاي سنتي نرمافزاري و سختافزاري آن براي جامعه علمي و صنعتي كشورمان آشناست . اما ، جاي خالي بخشهاي حيــاتي ، توانمنــد و مهمي چـون هـوش مصنوعـي ( Artifical Intelligence - AI ) ، سيستمهـــاي خبــــــره ( Expert or Knowledge Base Systems ) ، تكنـــولــــوژي اطــــلاعـــــــات ( Information Technology - IT ) ، پردازش مـــوازي ( Parallel Prrocessing ) ، مديريت بانكهاي اطلاعاتـي (Database Computer Aided Instruction , Multimedia , Management Systems - DBMS ) Virtual Reality - VR ,،. . . ، و از بين زبانهاي برنامهنويسي ، جاي اكثر زبانهاي هوش مصنوعي و بالاخره زبان Ada ، خاليست .
* مديريت بانكهاي اطلاعاتي
تعاريف متعددي براي بانك اطلاعاتي ( Database ) وجود دارد. يك تعريف نوعي تواند به صورت ذيل باشد :
" يك بانك اطلاعاتي عبارتست از ، مجموعهاي مرتبط از اطلاعات با اضافاتي قابل كنترل ( Controlled Redundancy ) بمنظور بكارگيري در يك يا چند كاربرد بصورت انتخابي و اختياري ، اين اطلاعات طوري جمعآوري شده و تشكيل مجموعه دهند كه مستقل از برنامههايي كه آنها را مورد استفاده قرار خواهند داد باشند. روش افزايش اطلاعات به بانك اطلاعاتي و فراخواني اطلاعات موجود طبق يك روش تعريف شده صورت گيرد . "
مديريت اطلاعات موجود در بانك اطلاعاتي توسط نرمافزار جانبي ديگري صورت گيرد ( Database Management System - DBMS ) . يك نرمافزار مديريت بانكهاي اطلاعاتي اصولا بايد خصوصيات ذيل را داشته باشد :
ـ مستقــــل از نـــوع اطلاعـــات موجـــود در بانك اطلاعاتـي باشــــد ( Data Independence ) . يعنــي نرمافــزار بايد خصوصيت يا تـوان پردازش اطلاعات ( Data Processing ) را از خــود اطلاعــــات ( Data ) تميز دهد .
ـ توان انجام تستهاي لازم بمنظور حصول اطمينان از همگوني اطلاعات ، بايد در بيان آنها منظور شده باشد . به بيان ديگر ، نرمافزار مديريت بانك اطلاعاتي ، تضمين لازم در اين رابطه را ايجاد نموده و در نهايت انسجام اطلاعات ( Data Integrity ) ، در بانك اطلاعاتي حفظ شود .
ـ همزماني و همگوني اطلاعات ( Data Concurrency & Consistency ) ـ از آنجائيكه بانكهاي اطلاعاتي منابعي هستند كه چند كاربر مختلف نياز به دسترسي به اطلاعات موجود در آنها دارند ، نرمافزار مديريت بانك اطلاعاتي بايد همزماني و همگوني اطلاعات در اختيار قرار گرفته شده را ميسر سازد . به عبارت ديگر كاربران مختلف قادر باشند به يك اطلاعات خاص ، بطور همزمان و همگون دسترسي داشته باشند .
ـ قابليت احيا و بازبافت ( Data Recovery ) ـ يك نرمافزار مديريت بانك اطلاعاتي كليه تغييرات اعمال شده روي بانك اطلاعاتي توسط استفاده كنندگان مختلف را پيگيري و ثبت كند ، و پس از پايان كار هر استفاده كننده ، بايد كليه تغييرات اعمال شده بطور اتوماتيك به حالت اول برگردانده شود . از طرفي ، نرمافزار مديريت بانك اطلاعاتي بايد در فواصل زماني معين كليه اطلاعات موجود در بانك را كپي و حفظ نمايـد ( Copy & Back - Up ) .
ـ كنترل دسترسي ( Access Control ) ـ نرمافزار مديريت بانك اطلاعاتي بايد دسترسي افراد مختلف به بخشهاي بانك را كنترل نموده و تشخيص لازم را در رابطه با مجوزهاي مربوطه براي هر كاربر يعني اجازه خواندن ( Read ) و تغيير دادن ( Modify ) اطلاعات را بدهد .
ـ كنترل متمركز ( Centralised Control ) ـ نرمافزار DBMS بايد اطلاعات موجود در بانك اطلاعاتي را يك سرمايه گرانبها و اصلي شركت به حساب آورد . از طرف ديگر ، بايد توان اعمال استاندارهايي از قبيل قفل كردن ركوردها ، جداول و سطوح تنظيم شده اطلاعات را هنگام اعمال چكهاي لازم بمنظور به روز كردن اطلاعات ( Up - dating ) و يافتن اشتباهات ، داشته باشد .
ـ نگهداري ، تعمير و تعميم اطلاعات DBMS- ( Data Maintenance ) بايد قابليت سوار و پياده كردن اطلاعات و سازماندهي مجدد آنها را داشته باشد .
وقتي كه تعداد و نوع اطلاعات چه ساده و يا پيچيده در يك سيستم ، محدود باشد ، امكانات چنداني از طرف نرمافزار مديريت بانك اطلاعاتي براي ثبت و حفظ اطلاعات مورد نياز نيست . اما ، با افزايش گستردگي ، پيچيدگي و تنوع اطلاعات و تعداد كاربران بانك اطلاعاتي ، وجود خصوصيات فوق ضروريست .
* انواع سيستمهاي مديريت بانكهاي اطلاعاتي
اساسا به 5 نوع سيستم مديريت بانك اطلاعاتي توان اشاره كرد :
1 ـ ترتيبي Hierarchic
2 ـ شبكهاي Network
3 ـ مرتبطي Relational
4 ـ متن آزاد FreeText
5 ـ موضوعي OrientedObject
ـ سيستم مديريت ترتيبي بانك اطلاعاتي ( Hierarchic ) ، داراي واحدهاي مختلف اطلاعات ( Data Units ) بصورت ركورد يا ليست است كه در يك ساختار شجرهاي يا شاخهاي مربوط به يك ساختار خاص سازمان يافتهاند . هر واحد اطلاعات فقط و فقط به يـــك شاخــــه قبـــل از خود وابسته باشد ( يك مالك يا صاحب دارد) .امــــا ، ممكــن است داراي چند واحد عضـو باشد . سيستـــم مديريت اطلاعـــات ( Information Management System ) شــــــركــت ( IMS ) , IBM و يــــــا ( Virtual Storage ) , VM ، از اين نوع سيستم مديريت بانك اطلاعاتي است .
ـ سيستم شبكهاي ( Network DBMS ) مديريت اطلاعات تصويري شبكهاي از اطلاعات را در يك شبكه كامپيوتري ارائه دهد . ركورد و يا ليستهاي اطلاعات ممكن است از نظر داخلي بهم مربوط و مرتبط بوده و يا حتي داراي روابط ترتيبي باشند . كه در اينصورت ، از يك ساختار قابل انعطافتري برخوردار خواهند بود . با اين حال ، وقتي كه يك ساختار شبكهاي بصورت بانك اطلاعاتي ، پياده شود ، اعمال تغييرات بعدي روي آن بسيار مشكــل خواهــد بود . سيستــم مديــريت بانــك اطلاعاتــي منســجم ( Integrated Database Management System - IDMS ) ، كه روي ماشينهاي ICL و تحت سيستم عامل VME قابل اجراست ، يك سيتم مديريت بانك اطلاعاتي شبكهاي است كه اكثرا توسط سازمانهاي دولتي بكار گرفته شود .
ـ سيستمهــــــــاي مديـــريت مرتبطـــي بانكهـــــاي اطلاعــاتـــي ( Relational DBMS ) ، طوري در نظر گرفته شدهاند كه اطلاعات را بصورت ركـــــورد ( ليستهاي ) يا جداول دو بعدي در خود نگهدارند . طوري كه هر جدول قابل تصوير روي يك ليست كه شامل چندين ستون و رديف اطلاعات است باشد . ارتباط بين اطلاعات موجود در ستونها و رديف هر ليست توسط نشانگرهاي خاصي حفظ شود . ايجاد جداول جديد ، با انتخاب رديف و ستونهايي از جداول پيشين امكانپذير است . سيستم مديريت بانكهاي اطلاعاتي مرتبطي ، داراي قابليت انعطاف بسيار زياد از نظر توان دسترسي و همچنين سهولت تغيير ساختاري است . البته به علت ضعف ناشي از قابليت انعطاف زياد ، توان عملكرد ( Performance ) تقريبا پائين است . ولي بايد توجه داشت كه اين مشكل روز به روز با ارائه نسخههاي جديدتر حل خواهد شد و نمونههاي زيادي از قبيل سيستمهاي مديريت بانكهاي اطلاعاتي وجود دارند كه Oracle و Ingres از همه شاخصتر باشند .
ـ بانك اطلاعاتي با متن آزاد ( Free Text Database ) ، همانطوري كه از نامش پيداست ، امكان حفظ ، بازنگري و جستجوي اطلاعات متني را كه به زبان انگليسي بوده و يا از يــك ساختار آزاد ( Free Format ) برخوردار باشند را ، ممكن سازد . در حقيقت هر ركورد يا ليست ، شامل خطوط و مجموعه جملاتي است كه متن را تشكيل دهند . اكثر بانكهاي اطلاعات متني ، داراي ساختاري ترتيبي هستند . مانند ، كتابها ، كاتالوگها ، نامهها روزنامهها كه هر يك به نوبه خود از بخشها ، پاراگرافها ، جملات و نهايتا كلمات تشكيل يافتهاند . ساختار هر يك از بانكهاي اطلاعات متني ، بسته به نوع محصول ، متفاوت است . اما ، عليالاصول داراي فايلهاي متن و ايندكس كه به نوبه خود شامل كلمات كليدي و نشانگرهاي خاص است ، ميباشند . اين گونه بانكهاي اطلاعاتي بيشتر براي بازيافت و فراخواني اطلاعات ( Retrieval ) بكار روند ، مانند بانكهاي اطلاعاتي بـــراي فراخوانـــي اطلاعـــات كمكـــي در يك كتابخانه . بانكهاي اطلاعاتي CAIRS, STATUS و BASIS از اين نوع ، قابل ذكر هستند .
* هوش مصنوعي ( Artificial Intelligence - AI )
هوش مصنوعي عبارتست از ايدههاي مطرح در علم كامپيوتر كه هدف آن طراحي سيستمهاي كامپيوتري باهوش است . هدف نهايي آن است كه اين سيستمها خصوصيت ذاتي انسان مانند ايجاد ارتباط از طريق تجربه و هنر حل مسائل و غيره را دارا شوند . به عبارت ديگر ، هوش مصنوعي عبارتست از مجموعه ايدههايي كه به كامپيوتر كمك كند كه باهوش يا ذكاوت شود . اما هوش يا ذكاوت چيست ؟ آيا توانايي طرح دليل است ؟ توانايي كسب و بكارگيري دانش است ؟ و يا توانايي درك ، جابجايي و بكارگيري هر آنچه كه در دنياي فيزيكي است باشد ؟ بدون شك تمامي اينها ، بخشي از هوش و ذكاوت بوده ولي تمامي آن چيزي كه بتوان هوش و ذكاوت ناميد نيست .
باهوش كردن كامپيوترها ، به ما امكان درك بهتر پديده هوش و ذكاوت را دهد . انسان به دلايل زيادي نيازمند باهوش كردن كامپيوترهاست . سادهترين دليل پيچيدهتر شدن زندگي بشر در كره زمين و گسترش ارتباطات و پارامترها و متغيرهايي است كه زندگي او را تحت تأثير قرار دهد . اتخاذ تصميمات به موقع و با بهترين و كاملترين اطلاعات ، مستلزم داشتن توان دسترسي نه تنها به حجم وسيع اطلاعات ، بلكه در نظر گرفتن تأثيرات متقابل آنهاست . مديريت انرژي جهان ، تغذيه و منابع انساني از جمله مواردي است كه بدون بكارگيري توان پردازش كامپيوترها و همچنين كمك از ذكاوتي كه در استنتاجات و تصميمگيريها به انسان كمك كند امكانپذير نيست .
كامپيوتر نه تنها بايد در محاسبات ساده و مهندسي كمك كند ، بلكه بايد در محاسباتي كه نشانگر نوعي هوش و ذكاوت است به عنوان ابزاري قابل اعتماد در كنار انسان باشد . به عنوان مثال در :
** تجارت :
پيشنهاد استراتژي مالي ، ارائه راهنمائيها يا توصيههاي بازاريابي ، ارجاع مسائل خاص به گروههاي تخصصي مربوطه ، خلاصه كردن اخبار ، تصحيح املائي ، انشايي و تدوين نهايي گزارشات .
** مهندسي طراحي :
چك كردن روشهاي طراحي ، فراخواني و بازيابي طراحيهاي انجام شده ، ارائه توصيههايي در جهت بهينهسازي با استفاده از تجارب گذشته بمنظور افزايش قابليت اعتماد و كيفيت محصول همچنين ، كاهش زمان طراحي و كمك در ايجاد محصول و يا محصولات جديد .
** مهندسي توليد :
تدوين فرآيندهاي ساخت ، مطالعه روش مونتاژ و كنترل كيفيت و ساير فعاليتهاي پشتيباني توليد .
** مهندسي كشاورزي :
تدوين برنامه و زمان ضهزني و سمپاشي ، كوددهي ، در تمامي فعاليتهاي كشت ، داشت و برداشت ، مخصوصا برداشت محصولات مختلط و متنوع از يك مزرعه خاص .
** آموزش و تدريس :
بعنوان بهترين ابزار قابل انعطاف آموزشي و كتابي بزرگ در تمامي رشتههاي علوم و مهندسي ، ابزاري مطمئن و جايگزين انواع ميزها ، تابلوها و آزمايشگاههاي برزگ در صنايع .
** بهداشت و درمان :
كمك در تشخيص بيماري و نوع درمان ، انتخاب بهترين آلترناتيو درمان ، مراقبتهاي ويژه از بيماران و ساير فعاليتهاي درماني خصوصا تدوين روش در جراحيهاي پيچيده مانند جراحي انواع تومورها ، جراحي در قاعده جمجمه و يا جراحي روي سلسله عصبي .
* سيستمهاي خبره ( Expert or Knowledge Base System )
خبره كيست ؟ خبره ، كسي است كه قادر است يك نوع مسئله خاص را حل كند . حلي مطمئن و قابل اعتماد . منشاء خبرهگي و مهارت آنها ، نتيجه تجربه ساليان ، كسب دقيق يك دانش خاص با جزئيات گسترده باشد . نمونه اين گونه افراد پزشكان عمومي با سابقه ، جراحان حاذق ، طراحان ماشين مجرب ، و تحليلگران نتايج آزمايشات در اكتشافات معادن تعميركاران تجهيزات تكنولوژيك و ... باشند .
متخصصيــن علوم كامپيوتر تعاريف متفاوتي را براي سيستمهاي خبره ارائه نمودهاند . به زبان ساده ، ميتوان گفت يك سيستم خبره عبارتست از سيستمي كه :
1ـ بتواند يك مسئله واقعي دنياي امروز در زمينه مهندسي ، علوم ، سياسي ، مالي و ... را كه حل آن مستلــزم بكارگيـري و مشــاوره با افــراد خبره است ، تجزيــه و تحليل نمايد .
2ـ بتواند مسئلهاي با خصوصيات فوق را با بكارگيري يك برنامه كامپيوتري كه حاوي تجربه ، روش تجزيه و تحليل و استدلالات يك خبره در آن زمينه خاص است ، به همان نتيجه برسد كه يك فرد خبره رسد ، ( اگر مسئله به او ارجاع شد ) .
در حقيقت در طراحي و ايجاد يك سيستم خبره تلاش بر اين است كه ، برنامهاي كامپيوتري تهيه شود ، كه بتواند جزئيات تجربيات يك فرد خبره يا در حالت ايدهآل ، تجربه بشري در يك زمينه خاص را جمعآوري نموده و طبق يك نظام قانونمند به همان طريقي كه در حافظه يك انسان خبره قرار دارد ، آنها را دستهبندي نموده ، و مجددا به همان روش استدلالي كه فرد خبره آن تجربيات و دانش را بكار گرفت تا به يك راه حل خاص براي يك مسئله تخصصي معين برسد ، استدلال نموده و با خبرهگي و مهارت ارائه طريق نمايد .
در بيست سال گذشته گروههاي تحقيقاتي زيادي در زمينه هوش مصنوعي ، سيستمهاي خبره متعددي كه نيازمند تخصص و تجربه افراد خبره براي حل مسائل خاص باشند ، طراحي و توسعه دادهاند . از جمله ، در زمينههاي تشخيص بيماري و تعيين روش درمان ( Medical Diagnosis & Treatment ) ، آناليز تركيبات و ساختارهاي شيميائـــــي ( Chemical Structure Analysis ) ، اكتشافــــات زميـنشناســــي ( Geological Exploration ) ، انتخــاب نوع پيكربنــدي و ساختـــاري كامپيوتــــر ( Computer Configuration Seclection ) ، تشخيـص و تعمير نوع عيوب كامپيوتــــر ( Computer Fault Diagnosis & Repair ) .
انتخاب موارد كاربردي براي طراحي و توسعه سيستمهاي خبره بسيار زياد است . در حقيقت هر زمان كه تخصص يا دانش در يك زمينه يا زمينههاي خاص مورد نياز شديد بوده ولي تعداد مورد نياز متخصص در دسترس نباشد ، سيستمهاي خبره كامپيوتري توانند با ارائه مشاوره و راه حل ، دانش و تخصص مورد نياز را در اختيار طيف بسيار گستردهتري قرار داده و رفع كمبود نمايند .
از جمله سيستمهاي خبرهاي كه به ميزان قابل توجهي مورد استفاده قرار گرفتهاند موارد ذيل قابل ذكرند :
1ـ سيستــــم PUFF ، با كاربـــرد در زمينه تستهـــاي عملكــرد ريـــوي ( Pulmonary FunctionTests ) تهيه شده در مركز درماني پاسفيك دانشگــاه استنفورد ( Stanford / Pacific Medical Center ) .
2ـ سيستـــم MYCIN ، در زمينـــه معالجــــه بيماريهــاي ميكروبــــي ( Antimicrobial Therapy ) تهيه شده در استنفورد .
3ـ سيستم RI ، براي انتخاب پيكربندي يا ساختار كامپيوترهاي VAX كه توسط شركت DEC و دانشگاه كارنيگـــي ( CMU ) تهيه شده است .
4ـ سيستم ACE ، براي كمك در زمينه تعميرات كابلهاي تلفن كه توسط آزمايشگاههاي بل تهيه شده ( Bell Labs ) است .
* نتيجـــه :
توسعه صنايع ، همراه با گسترش سازمانهاي مختلف ديگري كه براي تأمين نيازمنديهاي روزافزون اجتماع پا به عرصه وجود نهادهاند ، مسائل سازماني و مديريت متعددي را ايجاد كرده است كه حل و فصل آنها با ديد علمي جامع و جهاني مديريــــت" ارتباط مستقيم دارد . با توجه به كمبود نيروي انساني و منابع انساني و منابع مادي و توسعه مراكز خدماتي و توليدي و به اقتضاي پيشرفت تكنولوژي و تكامل ارزشهاي فرهنگي ، استفاده از كامپيوتر بيش از هر زمان ديگر مورد توجه قرار گرفته است .
نرمافزار ORACLE از جمله ابزارهايي است كه بمنظور استفاده هر چه بيشتر از امكانات كامپيوتري اين مراكز ، مورد توجه تحليلگران سيستم و برنامهنويسان كاربردي قرار گرفته است .
ORACLE برنامهاي است كه توسط شركت ORACLE كه سازنده نرمافزارهاي پايگاه دادههاي رابطهاي كامپيوترهاي بزرگ و كوچك باشد ، تهيه گرديده است و كاربران كامپيوترهاي APPLE و يا IBM و سازگار با آن را قادر سازد به دادههاي پايگاههاي اطلاعاتي بسيار بزرگ بطور مشترك دسترسي يابند .
اغلب برنامهنويسان در دنياي كامپيوترهاي بزرگ و كوچك ، ORACLE را بعنوان يكي از سيستمهاي مديريت پايگاه دادههاي رابطهاي و پيشرو DBMSميشناسند . با استفاده از نسخههاي متعدد ORACLEبراي كامپيوترهاي شخصي ، كساني كه با لوتوس Dimension, Super Card , Hyper Card , ( 123 ) و يا dBASEIIIPIUS كار كنند ، ميتوانند به پايگاههاي دادههاي كامپيوترهاي بزرگ مانند SQL/ DS , DB2 , ORACLE دسترســـــي پيــــدا نماينـــد . نرمافــــزار ORACLE با توجه به امكانات SQL( Structured Query Language ) ، و تمامي فرامين آن را پشتيباني كند و قبل از هر مقدمهاي ، بايد با مفاهيم جديد در SQL* PLUS و ابزارهــاي جانبي آن مانند SQL* Forms و ... آشنا گرديد .
SQL در سيستمهاي مديريت پايگاه داده يك زبان پرسوجوي IBM است كه بطور گسترده در كامپيوترهاي بزرگ و كوچك بكار رود . اين زبان بطور روزافزونــي در شبكههاي Client/ Server بعنوان راهي براي ايجاد امكان در كامپيوترهاي شخصي بمنظور دسترسي به منابع مشترك پايگاه داده ، استفاده شود .
SQL كه اصلا توسط ر.د چمبرلين ( D.D . Chamberlin ) و ديگر پژوهشگران مركز تحقيقات IBM تهيه شده است ، ميتواند با انواع مختلف نرمافزارهاي پايگاه دادهاي ، مورد استفاده قرار گيرد .
در اين مقاله تلاش شد كه نرمافزار ORACLE بطور اجمالي معرفي و موارد كاربردي آن همراه با مثالهاي متعدد در اختيار قرار گيرد .
مأخذ: مديريت بانكهاي اطلاعاتي در ORACLE
2) معــرفـي POSGRESQL :
معــرفـي POSGRESQL با سوالاتي كه اغلب در مورد PostgreSQL پرسيده مي شوند:
نگهدارنده اصلي فايل (زبان انگليسي)در حال حاضر : Bruce Momjian pgman@candle.pha.pa.us
نگهدارنده فايل به زبان فارسي: m.taghizadeh@imenafzar.net محمود تقيزاده مهرجردي
آخرين نسخه اين فايل را ميتوانيد از اين آدرس بگيريد http://www.PostgreSQL.org/docs/faqs/FAQ.html
سوالاتي كه در مورد يك سكوي(پلتفرم) خاص است در اين آدرس جواب داده شده اند http://www.PostgreSQL.org/docs/index.html
--------------------------------------------------------------------------------
سوالات عمومي
1.1) PostgreSQL چيست و چگونه بايد آن را تلفظ كرد؟
1.2) قانون كپي رايت (حقوق معنوي) در مورد PostgreSQL به چه صورت است؟
1.3) PostgreSQL روي چه نوع يونيكسهايي اجرا ميشود؟
1.4) روي چه محيطهاي غير يونيكسي ميتوان آن را اجرا كرد؟
1.5) PostgreSQL را از كجا ميتوانم بگيرم؟
1.6) از كجا خدمات پشتيباني بگيرم؟
1.7) آخرين نسخه اعلام شده چيست؟
1.8) چه مستندات و راهنمائيهايي وجود دارند؟
1.9) چگونه ميتوانم ازاشكالات شناخته شده و يا امكاناتي كه در اين پايگاه داده وجود ندارد مطلع شوم؟
1.10) چگونه ميتوانم زبان SQL را ياد بگيرم؟
1.11) آيا PostgreSQL مشكل Y2K دارد يا خير؟
1.12) چگونه ميتوانم به تيم برنامه نويس PostgreSQL ملحق شوم؟
1.13) چگونه ميتوانم يك اشكال را به گروه برنامه نويس اعلام كنم؟
1.14) وضعيت PostgreSQL در مقايسه با ساير DBMSها به چه صورت است؟
1.15) من چگونه ميتوانم از نظر مالي به PostgreSQL كمك كنم؟
سوالات مربوط به استفاده از پايگاه داده
2.1) آيا هيچ درايور ODBC براي PostgreSQL وجود دارد؟
2.2) چه ابزارهايي براي استفاده از PostgreSQL با صفحات وب وجود دارد؟
2.3) آيا PostgreSQL يك واسط كاربري گرافيكي دارد؟
2.4) با چه زبانهاي برنامهنويسي ميتوان با PostgreSQL ارتباط برقرار كرد؟
سوالات مربوط به راهبري
3.1) چگونه ميتوانم PostgreSQL را در شاخهاي غير از /usr/local/pgsql/ نصب كنم؟
3.2) چرا موقعي كه من برنامه postmaster را اجرا مي كنم پيام Bad system call و يا core dump ميگيرم؟
3.3) چرا موقعي كه من سعي ميكنم برنامه postmaster را اجرا كنم خطاي IpcMemoryCreate ميگيرم؟
3.4) چرا موقعي كه من سعي ميكنم برنامه postmaster را اجرا كنم خطاي IpcSemaphoreCreate ميگيرم؟
3.5) چگونه ميتوانم اتصالات ساير ماشينها را كنترل كنم؟
3.6) براي كارايي بالاتر و بهتر پايگاه داده من چه تنظيماتي را بايد انجام دهم؟
3.7) چه امكاناتي براي پيدا كردن اشكال وجود دارد؟
3.8) چرا موقعي كه من ميخواهم به پايگاه داده وصل شوم پيام "Sorry, too many clients" ميگيرم؟
3.9) در شاخه pgsql_tmp چه چيزي قرار دارد؟
3.10) چرا براي به روز كردن نسخه پايگاه داده من بايد كل داده ها را dump و مجدداً restore كنم؟
3.11) از چه سخت افزاري بايد استفاده كنم؟
سوالات عملياتي
4.1) تفاوت بين binary cursors و Normal cursors چيست؟
4.2) من چگونه ميتوانم فقط روي چند رديف اول يا يك رديف تصادفي درخواست SELECT بزنم؟
4.3) من چگونه ميتوانم ليستي از جداول يا ساير چيزهايي كه در psql وجود دارد را ببينم؟
4.4) چگونه يك ستون جدول را حذف ميكنيد؟ چگونه نوع داده آن را عوض كنيم؟
4.5) حداكثر اندازه يك رديف، جدول و خود پايگاه داده چقدر است؟
4.6) چقدر فضاي ديسك سخت براي ذخيره كردن دادههاي يك فايل متني مورد نياز است؟
4.7) چگونه ميتوانم بفهمم كه چه كاربران، پايگاه داده، نمايه و جداولي در سيستم تعريف شده است؟
4.8) چرا درخواستهاي من كند اجرا ميشوند يا چرا از نمايه ها استفاده نميكنند؟
4.9) چگونه ميتوانم نحوه بررسي درخواست را توسط بهينهساز درخواستها مشاهده كنم؟
4.10) نمايه R-tree چيست؟
4.11) بهينه ساز تكويني درخواست چيست؟ (Genetic Query Optimizer)
4.12) چگونه از عبارات منظم براي جستجو استفاده كنم؟ چگونه جستجويي انجام دهم كه حساس به متن نباشد؟ چگونه براي يك جستجوي غير حساس به متن از نمايه استفاده كنم؟
4.13) چگونه ميتوانم در يك درخواست تشخيص دهم كه يك فيلد NULL است؟
4.14) تفاوت بين گونههاي مختلف character چيست؟
4.15.1) چگونه ميتوانم يك فيلد سريال يا افزايشي ايجاد كنم؟
4.15.2) چگونه ميتوانم مقدار يك درج سريالي را بدانم؟
4.15.3) آيا توابع ()nextval و ()currval منجر به ايجاد شرايط race براي ساير كاربران مي شوند؟
4.15.4) چرا اعداد سريالي مربوط به تراكنشهاي abort شده مجدداً استفاده نمي شود؟ چرا بين اعداد سريالي يك فاصله خالي ايجاد مي شود؟
4.16) OID و TID چه هستند؟
4.17) معني بعضي از ترمها و كلماتي كه در PostgreSQL استفاده ميشود چيست؟
4.18) چرا من خطاي "ERROR: Memory exhausted in AllocSetAlloc" ميگيرم؟
4.19) از كجا تشخيص دهم كه ويرايش يا نسخه PostgreSQLيي كه من استفاده ميكنم چيست؟
4.20) چرا در حين اجراي عمليات روي large-objectها خطاي "invalid large obj descriptor"به وجود مي آيد؟
4.21) چگونه يك ستون ايجاد كنم كه مقدار زمان جاري را به عنوان مقدار پيشفرض داشته باشد؟
4.22) چرا زير درخواستهايي كه از IN استفاده ميكنند كند هستند؟
4.23) چگونه ميتوانم يك الحاق خارجي (outer join) انجام دهم؟
4.24) چگونه ميتوان درخواستهايي از چند پايگاه داده توليد كرد؟
4.25) چگونه خروجي يك تابع ميتواند چند رديف يا ستون باشد؟
4.26) در توابع PL/PgSQL چرا نميتوان با اطمينان جداول موقت را ايجاد يا حذف كرد؟
4.27) چه گزينههايي براي تكرار (replication) وجود دارد؟
4.28) چه گزينههايي براي رمزنگاري وجود دارد؟
توسعه PostgreSQL
5.1) من يك تابع نوشتهام. چگونه آن را در psql اجرا كنم؟ چرا با اجراي آن core dump ميگيرم؟
5.2) چگونه ميتوانم در توليد نوعها و توابع جديد و جالب براي PostgreSQL همكاري و مشاركت داشته باشم.
5.3) چگونه ميتوانم يك تابع به زبان C بنويسم كه خروجي آن يك tuple (چند تايي) باشد؟
5.4) من يك فايل منبع را عوض كرده ام چرا در عمليات كامپيل مجدد آن تغيير ديده نميشود؟
--------------------------------------------------------------------------------
سوالات عمومي
1.1) PostgreSQL چيست و چگونه آن را بايد تلفظ كرد؟
PostgreSQL به صورت Post-Gres-Q-L تلفظ ميشود. يك فايل صوتي در آدرس http://www.postfresql.org/postgresql.mp3 براي كساني كه مايلند تلفظ صحيح را بشنوند وجود دارد.
PostgreSQL از روي سيستم مديريت پايگاه داده POSTGRES توسعه داده شده است (هنوز هم بعضي مواقع براي سادگي به آن Postgres گفته ميشود) كه يك نمونه تحقيقاتي از پايگاه دادههاي نسل بعد است. PostgreSQL همان الگوي داده قوي و انواع داده را حفظ كرده است ولي زبان PostQuel را با يك زيرمجموعه پيشرفته از SQL جايگزين كرده است. PostgreSQL متن باز بوده و متن كامل آن در دسترس است.
PostgreSQL توسط يك تيم برنامهنويس كه همگي در گروه پست الكترونيك برنامهنويسان PostgreSQL عضو هستند، انجام ميشود. هماهنگ كننده اصلي در حال حاضر Marc G. Fournier به آدرس scrappy@PostgreSQL.org ميباشد. (براي ديدن نحوه ملحق شدن به اين تيم قسمت 1.6 را ببينيد). اين تيم در حاضر مسئوليت تمام مسائل مربوط به برنامهنويسي PostgreSQL را بر عهده دارد. اين يك پروژه گروهي است و تحت كنترل هيچ شركتي نيست. براي اطلاعات بيشتر در مورد اين تيم به آدرس http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html مراجعه كنيد.
اولين نسخه PostgreSQL توسط Andrew Yu and Jolly Chen به وجود آمد. افراد بسياري در توسعه و رفع اشكال و انتقال آن شركت كردهاند. متن اصلي Postgres كه PostgreSQL از روي آن نوشته شده است، توسط تعداد زيادي دانشجوي كارشناسي ارشدو دانشجوي كارشناسي و تيم برنامهنويسي كه تحت نظر پروفسور Michael Stonebrake در دانشگاه بركلي،كاليفرنيا كار ميكردهاند نوشته شده است.
نام اصلي نرم افزار در دانشگاه بركلي Postgres بود. در سال 1995 بعد از اضافه شدن SQL نام آن به Postgres95 تغيير داده شد. در سال 1996 نام آن به PostgreSQL تغيير داده شد.
1.2) قوانين كپي رايت در مورد PostgreSQL به چه صورت است؟
PostgreSQL تحت قانون كپي رايت زير قرار دارد:
PostgreSQL Data Base Management System
Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group Portions Copyright (c) 1994-6 Regents of the University of California
Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OFCALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
قانون بالا ليسانس BSD كه يك ليسانس كلاسيك براي متنهاي باز است ميباشد. هيچ محدوديتي در مورد نحوه استفاده از متن در آن ديده نميشود. ما آن را دوست داريم و هيچ قصدي براي تغيير آن نداريم.
1.3) PostgreSQL روي چه نوع يونيكسهايي اجرا ميشود؟
در حالت كلي PostgreSQL روي هر پلتفرم (سكوي) سازگار با يونيكس اجرا ميشود. ليست پلتفرمهايي كه تاكنون PostgreSQL روي آنها نصب و تست شده است درقسمت دستورالعملهاي نصب آمده است.
1.4) روي چه محيطهاي غير يونيكسي ميتوان آن را اجرا كرد؟
Client
ميتوان psql, كتابخانه libpq و ساير واسطها و برنامههاي كاربردي را طوري كامپيل كرد كه روي محيطهاي ويندوز نيز اجرا شوند. در اين حالت Client روي ويندوز اجرا ميشود و از طربق شبكه و پروتكل TCP/IP با يك سرور كه روي يك پلتفرم لينوكس در حال اجراست ارتباط برقرار ميكند.يك فايل win32.mak همراه با كدهاي PostgreSQL وجود دارد كه براي كامپيل كردن كتابخانه libpq و برنامه psql ميباشد. PostgreSQL همچنين امكان ارتباط به صورت ODBC را نيز دارد.
Server
با استفاده از Cygwin و كتابخانه Cygnus ميتوان پايگاه داده را روي ويندوز NT و يا Win2K اجرا كرد.براي ديدن اطلاعات بيشتر فايل pgsql/doc/FAQ_MSWIN را كه بهمراه توزبعهاي PostgreSQL آمده است ببينيد و يا اينكه به اين صفحه http://www.PostgreSQL.org/docs/faqs/text/FAQ_MSWIN مراجعه كنيد.
در حال حاضر يك عمليات انتقال PostgreSQL به روي سكوهاي Win NT/2000/XP در جريان است. براي ديدن وضعيت اين پروژه به سايتهاي http://momjian.postgresql.org/main/writings/pgsql/win32.htm و http://techdocs.postgresql.org/guides/Windows مراجعه كنيد.
همچنين يك عمليات انتقال بر روي Novell Netware 6 نيز در حال انجام است كه در سايت http://forge.novell.com ميتوانيد اطلاعات بيشتر را ببينيد.
1.5) PostgreSQL را از كجا ميتوانم بگيرم؟
PostgreSQL را از سايت اصلي آن ftp://ftp.PostgreSQL.org/pub ميتوانيد بگيريد. در صفحه اصلي سايت ليست ساير آدرسهايي كه ميتوانيد PostgreSQL را از آنها بگيريد آمده است.
1.6) از كجا خدمات پشتيباني بگيرم؟
گروه پستي اصلي pgsql-general@PostgreSQL.org ميباشد. اين گروه براي بحث در مورد موضوعات مختلف در زمينه PostgreSQL است. براي عضو شدن در اين گروه پستي يك نامه الكترونيكي به آدرس گروه با محتوياتي كه در ادامه آمده است ارسال كنيد. در قسمت Subject چيزي ننويسيد.
subscribe
end
آدرس گروه: pgsql-general-request@PostgreSQL.org
همچنين يك گروه پستي هم به صورت ارسال چكيده پيامها وجود دارد. براي عضو شدن در اين گروه يك نامه با محتويات زير به اين آدرس ارسال كنيد. pgsql-general-digest-request@PostgreSQL.org
subscribe
end
در اين گروه هر موقع حجم نامهها به 30 كيلوبايت رسيد براي تمام اعضاء ارسال ميشود.
گروه پستي بررسي اِشكالات هم وجود دارد. براي عضو شدن در اين گروه يك نامه با محتويات زير به pgsql-bugs-request@PostgreSQL.org ارسال كنيد.
subscribe
end
گروه پستي مخصوص توسعه دهندگان (برنامهنويسان) نيز وجوددارد. براي عضويت در اين گروه يك نامه به آدرس زير با محتويات مشخص شده ارسال كنيد. pgsql-hackers-request@PostgreSQL.org
subscribe
end
گروههاي پستي ديگري نيز در زمينه PostgreSQL وجود دارد كه ميتوانيد در سايت http://www.postgresql.org ببينيد.
همچنين يك كانال IRC روي Freenode و EFNet بنام PostgreSQL# وجود دارد. شما ميتوانيد از فرمان يونيكسي irc -c '#PostgreSQL' "$USER" irc.phoenix.net. يا irc -c '#PostgreSQL' "$USER" irc.freenode.net استفاده كنيد.
ليست شركتهايي كه از طريق آنها ميتوانيد خدمات پشتيباني تجاري در زمينه PostgreSQL دريافت كنيد در اين آدرس http://techdocs.postgresql.org/companies.php موجود است.
1.7) آخرين نسخه اعلام شده چيست؟
آخرين نسخه PostgreSQL كه وجود دارد 7.4.3 است.
هدف ما آن است كه هر 6 ماه تا 8 ماه يك نسخه جديد ارائه شود.
1.8) چه مستندات و راهنمائيهايي وجود دارند؟
چندين كتابچه و صفحات راهنما و مثالهاي كوچك همراه با متن اصلي PostgreSQL در شاخه doc وجود دارد. براي ديدن صفحات راهنما ميتوانيد به سايت http://www.PostgreSQL.org/docs نيز مراجعه نماييد.
دو كتاب در زمينه PostgreSQL در آدرسهاي http://www.PostgreSQL.org/docs/awbook.htm و http://www.commandprompt.com/ppbook وجود دارد. ليستي از كتابهايي كه قابل خريد است در آدرس http://techdocs.PostgreSQL.org/techdocs/bookreviews.php وجود دارد. همچنين ليستي از مقالات فني در مورد PostgreSQL در آدرس http://techdocs.PostgreSQL.org وجود دارد.
برنامه psql يك دستور d\ دارد كه اطلاعاتي در مورد انواع دادههاي قابل تعريف و عملگرها و توابع و ... به ما نشان ميدهد. در سايت اصلي ما اطلاعات بيشتري را ميتوانيد پيدا كنيد.
1.9) چگونه ميتوانم ازاشكالات شناخته شده و يا امكاناتي كه در اين پايگاه داده وجود ندارد مطلع شوم؟
PostgreSQL يك زير مجموعه پيشرفته از SQL-92 را پشتيباني ميكند. در ليست TODO اِشكالات شناخته شده يا امكاناتي كه وجود ندارد و يا برنامههاي آينده آمده است.
1.10) چگونه ميتوانم زبان SQL را ياد بگيرم؟
كتاب PostgreSQL در آدرس SQL http://www.PostgreSQL.org/docs/awbook.html را آموزش ميدهد. همچنين يك كتاب در آدرس http://www.commandprompt.com/ppbook وجود دارد. يك راهنماي خيلي خوب هم در سايتهاي http://www.intermedia.net/support/sql/sqltut.shtm و http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM و http://sqlcourse.com در مورد SQL وجود دارد.
كتاب ديگري كه ميتوان براي يادگيري SQL از آن استفاده كرد كتاب "SQL را در 21 روز ياد بگيريد، ويرايش دوم" در سايت http://members.tripod.com/er4ebus/sql/index.htm ميباشد.
تعداد زيادي از كاربران كتاب The Practical SQL را ترجيح ميدهند. كتاب ديگر The Complete Refrence SQL انتشارات McGraw-Hill ميباشد.
1.11) آيا PostgreSQL مشكل Y2K دارد يا خير؟
خير،PostgreSQL با تاريخهاي قبل و بعد از 2000 مشكلي ندارد.
1.12) چگونه ميتوانم به تيم برنامه نويس PostgreSQL ملحق شوم؟
ابتدا،آخرين سورس را دونلود كرده و مستندات مربوط به برنامهنويسي PostgreSQL را در سايت مطالعه كنيد. سپس به گروههاي پستي pgsql-patches و pgsql-hackers عضو شويد. در مرحله آخر وصلههاي با كيفيت بالا را به pgsql-patches ارسال كنيد.
تعداد زيادي از برنامهنويسان وجود دارند كه امتياز انجام تغييرات در cvs را دارند. هر كدام از آنها تعداد زيادي وصله با كيفيت بالا به گروه ارسال كردهاند كه اعتماد گردانندگان PostgreSQL را به دست آوردهاند.
1.13) چگونه ميتوانم يك اِشكال را به گروه برنامه نويس اعلام كنم؟
لطفاً صفحه مربوط به اِشكالات PostgreSQL را در سايت http://www.PostgreSQL.org/bugs/bugs.php مشاهده كنيد. در اين سايت نحوه گزارش و ارسال يك اشكال توضيح داده شده است.
همچنين براي ديدن نسخههاي جديدتر PostgreSQL و يا وجود يك وصله جديد از سايت ftp://ftp.PostgreSQL.org/pub بازديد كنيد.
1.14) وضعيت PostgreSQL در مقايسه با ساير DBMSها به چه صورت است؟
راههاي مختلفي براي اندازهگيري و مقايسه نرمافزارها وجود دارد كه عبارتند از امكانات، كارايي، قابليت اعتماد، پشتيباني و قيمت
امكانات
PostgreSQL بيشتر امكانات موجود در سيستمهاي پايگاه داده تجاري بزرگ نظير transactions, subselets, triggers, views, foreign key referential integrity و sophisticated locking را دارد. در PostgreSQL امكاناتي وجود دارد كه پايگاههاي داده ديگر آن را ندارند نظير user-defined typesو Inheritanceو rulesو multi-version concurrency control
كارايي
كارايي PostgreSQL در حد بقيه سيستمهاي تجاري و متن باز است. در بعضي موارد سريعتر و در بعضي موارد از آنها كندتر است. در مقايسه با MySQL براي كاربران بيشتر و درخواستهاي پيچيده و بار زياد خواندن/نوشتن سريعتر است. در درخواستهاي ساده SELECT از MySQL كندتر است. البته MySQL خيلي از امكانات PostgreSQL كه در بالا به آن اشاره شد را ندارد. هدف اصلي ما امكانات و قابليت اعتماد بالاست در ضمن آنكه تلاش ميكنيم تا كارايي آن نيز بهبود يابد. در آدرس http://openacs.org/philosophy/why-not-mysql.html يك مقايسه جالب بين MySQL و PostgreSQL وجود دارد. از طرف ديگر MySQL يك شركت است كه محصول خود را به صورت متن باز ارائه ميكند ولي براي نرمافزار غير متن باز خود احتياج به ليسانس تجاري دارد بر خلاف PostgreSQL كه يك گروه كاملاً متن باز هستند.
قابليت اطمينان
ما فكر ميكنيم كه يك سيستم پايگاه دادهاي كه مطمئن نباشد ارزشي ندارد. ما تمام تلاشمان را براي ارائه كدهاي پايداري كه به خوبي تست شده باشند و كمترين اِشكالات را داشته باشند ميكنيم. هر نسخه جديدي كه ارائه ميشود حداقل يك ماه را در مرحله تست بتا ميگذراند. ما بر اين باور هستيم كه قابليت اطمينان PostgreSQL در مقايسه با ساير سيستمهاي پايگاه داده قابل توجه است و نسخههايي كه تاكنون ارائه شده است نشان ميدهد كه ما توانايي ارائه يك سيستم قوي و محكم و مطمئن را كه آماده بهرهبرداري است داريم.
پشتيباني
گروههاي پستي ما امكان ارتباط و تماس به گروه بزرگي از برنامه نويسان و كاربران را ميدهد كه ميتوانند در حل مشكلات به ديگران كمك كنند. دسترسي مستقيم به برنامهنويسان و گروههاي كاربران و راهنماها و كداصلي باعث ميشود كه پشتيباني PostgreSQL نسبت به ساير پايگاههاي داده به نحو بهتري انجام شود. همچنين امكان ارائه خدمات پشتيباني به صورت تجاري نيز وجود دارد. براي ديدن اطلاعات بيشتر به FAQ section 1.6 مراجعه كنيد.
قيمت
هم براي استفاده تجاري و هم غير تجاري هيچ هزينهاي نبايد پرداخت شود. هيچ محدوديتي براي انجام تغييرات در PostgreSQL توسط استفاده كنندگان وجود ندارد به جز مواردي كه در ليسانس BSD به آن اشاره شده است.
1.15) من چگونه ميتوانم از نظر مالي به PostgreSQL كمك كنم؟
PostgreSQL داراي يك ساختار تشكيلاتي درجه اول است كه آن را مديون Marc Fournier است كه اين ساختار را ايجاد كرده است.
كيفيت يك ساختار براي يك پروژه متن باز بسيار اهميت دارد. يك ساختار خوب ميتواند مانع از حوادثي شود كه در حركت روبهجلوي پروژه خللي وارد ميكنند.
البته اين ساختار تشكيلاتي ارزان نيست. هزينههاي ثابت ماهانه و روزمره براي نگهداري و حفظ اين ساختار مورد نياز است. اگر شما يا شركت شما مايل است كه از نظر مالي به اين حركت كمك كند لطفاً به سايت http://store.pgsql.com/shopping مراجعه كرده و كمك خود را اهدا كنيد.
هر چند در صفحه اصلي عبارت PostgreSQL,Inc ذكر شده است ولي مشاركت عمدتاً براي پشتيباني از پروژه PostgreSQL مي باشد و نه براي يك شركت مشخص. اگر ترجيح ميدهيد ميتوانيد يك چك به آدرس مشخص شده ارسال كنيد.
اگر يك استفاده موفق از PostgreSQL سراغ داريد لطفاً آن را به سايت http://advocacy.postgresql.org گزارش دهيد.
--------------------------------------------------------------------------------
سوالات مربوط به استفاده از پايگاه داده
2.1) آيا هيچ درايور ODBC براي PostgreSQL وجود دارد؟
دو درايور ODBC بنامهاي psqlODBC و OpenLink براي PostgreSQL وجود دارد.
براي گرفتن psqlODBC به سايت http://gborg.postgresql.org/project/psqlodbc/projdisplay.php مراجعه كنيد.
OpenLlink را از اين سايت http://www.openlinksw.com ميتوانيد بگيريد. اين درايور با نرمافزارهاي مختلف ODBC كار ميكند بنابراين شما قادر خواهيد بود با استفاده از OpenLink روي اكثر سكوهايي كه نرمافزارODBCدارند بدون مشكل به PostgreSQL نيز متصل شويد.
اين محصول به كساني كه احتياج به خدمات پشتيباني تجاري دارند فروخته ميشود. ولي نسخه آزاد اين نرمافزار هميشه در درسترس ميباشد. براي كسب اطلاعات بيشتر سوالات خود را به آدرس postgres95@openlink.co.uk ارسال نماييد.
2.2) چه ابزارهايي براي استفاده از PostgreSQL با صفحات وب وجود دارد؟
در سايت http://www.webreview.com براي استفاده از PostgreSQL در صفحات وب راهنماييهاي خوبي وجود دارد.
براي تركيب و استفاده در صفحات وب زبان PHP يك واسط بسيار مناسب است. اطلاعات بيشتر راجع به PHPدر سايت http://www.php.net وجود دارد.
مثالهايي نيز با استفاده از Perl و CGI.pm و mod_perl وجود دارد.
2.3) آيا PostgreSQL يك واسط كاربري گرافيكي دارد؟
چند نرم افزار گرافيكي براي PostgreSQL وجود دارد كه شامل pgAccess درسايت http://www.pgaccess.org و pgAdmin III در سايت http://www.pgadmin.org و RHDB Admin در سايت http://sources.redhat.com/rhdb و Rekall در سايت http://www.thekompany.com/products/rekall ميباشد. همچنين يك phpPgAdmin هم در سايت http://phppgadmin.sourceforge.net وجود دارد كه يك واسط وبي براي مديريت PostgreSQL ميباشد.
براي ديدن اطلاعات بيشتر راجع به نرمافزارهاي گرافيكي براي PostgreSQL به آدرس http://techdocs.postgresql.org/guides/GUITools مراجعه كنيد.
2.4) با چه زبانهاي برنامهنويسي ميتوان با PostgreSQL ارتباط برقرار كرد؟
بيشتر زبانهاي برنامهنويسي ميتوانند با PostgreSQL ارتباط برقرار كنند. به همراه سورس PostgreSQL تعدادي از واسطهاي مورد نياز براي ارتباط با پايگاه داده از طريق زبانهاي مختلف آمده است كه در زير ليست آنها را مشاهده ميكنيد.
C (libpq)
Embedded C (ecpg)
Java (jdbc)
Python (PyGreSQL)
TCL (libpgtcl)
واسطهاي ديگر در سايت http://gborg.postgresql.org در قسمت Drivers/Interfaces وجود دارد.
--------------------------------------------------------------------------------
سوالات مديريتي
3.1) چگونه ميتوانم PostgreSQL را در شاخهاي غير از /usr/local/pgsql/ نصب كنم؟
موقع اجراي دستور configure از گزينه prefix-- استفاده كنيد.
3.2) چرا موقعي كه من برنامه postmaster را اجرا مي كنم پيام Bad system call و يا core dump ميگيرم؟
به دلايل مختلف ممكن است اين اتفاق بيفتد. اما در قدم اول شما مطمئن شويد كه كه امكانات اضافه System V در كرنل شما نصب شده باشد. PostgreSQL براي اجرا شدن نياز به استفاده از امكانات حافظه مشترك و سمافورها دارد.
3.3) چرا موقعي كه من سعي ميكنم برنامه postmaster را اجرا كنم خطاي IpcMemoryCreate ميگيرم؟
احتمالاً قسمت ايجاد حافظه مشترك در كرنل به درستي تنظيم نشده است و يا اينكه بايد فضاي حافظه اشتراكي در كرنل را زياد كرد. ميزان دقيق حافظه مشترك مورد نياز بسته به معماري و نحوه استفاده از بافرها توسط برنامه postmaster دارد. براي بيشتر سيستمها كه با تنظيمات پيشفرض كار ميكنند مقدار اين حافظه حدود 1 مگابايت است. براي ديدن اطلاعات بيشتر راجع به حافظه مشترك و سمافور به PostgreSQL Administrator's Guide مراجعه كنيد.
3.4) چرا موقعي كه من سعي ميكنم برنامه postmaster را اجرا كنم خطاي IpcSemaphoreCreate ميگيرم؟
اگر پيغام خطا (pcSemaphoreCreate: semget failed (No space left on device باشد به اين معني است كه تعداد سمافورهاي تنظيم شده در كرنل كافي نيست. PostgreSQL براي هر فرايندي كه در backend اجرا ميشود به يك سمافور نياز دارد. يك راه حل موقت براي اين مسئله آن است كه postmaster را با اعمال محدوديت روي تعداد فرايندهايي كه ميتواند ايجاد كند اجرا كنيم. براي اينكار از گزينه N- و يك عدد كمتر از 32 استفاده كنيد. راه حل دائمي اين مشكل آن است كه پارامترهاي SEMMNS, SEMMNI كرنل را افزايش دهيم.
در زمان دسترسي خيلي زياد به پايگاه داده، سمافورهاي نامعتبر ميتوانند باعث crash كردن سيستم شوند.
اگر پيغام خطا چيز ديگري باشد احتمالاً به دليل آن است كه كرنل از سمافورها پشتيباني نميكند. براي ديدن اطلاعات بيشتر راهنماي مديريتي PostgreSQL را مطالعه كنيد.
3.5) چگونه ميتوانم اتصالات ساير ماشينها را كنترل كنم؟
به صورت پيش فرض فقط از ماشيني كه PostgreSQL روي آن در حال اجراست ميتوان با استفاده از سوكتهاي يونيكسي به آن متصل شد. ساير ماشينها قادر نيستند به PostgreSQL متصل شوند مگر آنكه گزينه tcp_sockets در فايل postgresql.conf فعال شده و همچنين با اصلاح فايل PGDATA/ph_hba.conf هويتشناسي مبتني بر ميزبان نيز فعال شود. با اين كار ميتوان اتصالات TCP/IP به PostgreSQL ايجاد كرد.
3.6) براي كارايي بالاتر و بهتر پايگاه داده من چه تنظيماتي را بايد انجام دهم؟
به طور حتم استفاده از انديسها باعث بالا رفتن سرعت پاسخگويي به درخواستها خواهد شد. دستور EXPLAIN ANALYZE به شما امكان ديدن نحوه پردازش يك دستور توسط PostgreSQL را ميدهد.
اگر شما تعداد زيادي INSERT داريد سعي كنيد آنها را با قرار دادن در يك فايل با دستور COPY اجرا كنيد. اين دستور به مراتب از INSERT سريعتر است. حتيالامكان سعي كنيد از تراكنشها استفاده نكنيد. تراكنشها مجموعه دستوراتي هستند كه بيند BEGIN و COMMIT ميآيند. اگر يك دستور به صورت عادي اجرا شود PostgreSQL خود آن دستور را به صورت يك تراكنش مستقل نگاه كرده و اجرا ميكند. موقعي كه تغييرات زيادي در پايگاه داده انجام ميشود انديسهاي قبلي را حذف و مجدداً ايجاد كنيد.
استفاده از گزينه o -F- در فرمان postmaster باعث غير فعال كردن ()fsync ميشود. اين دستور بعد از هر تراكنش اطلاعات را روي هاردديسك منتقل ميكند.
براي افزايش تعداد بافرهاي حافظه اشتراكي از گزينه B- به همراه فرمان postmaster استفاده كنيد. توجه كنيد كه اگر اين عدد خيلي بزرگ باشد ممكن است postmaster اصلاً اجرا نشود. هر بافر 8 كيلو بايت حافظه نياز دارد و تعداد بافرها به طور پيش فرض 64 است.
همچنين ميتوان با گزينه S- ميزان حافظهاي كه براي مرتبسازيهاي موقت توسط PostgreSQL استفاده ميشود را افزايش داد. مقدار پيش فرض 512 كيلو بايت است.
استفاده از دستور CLUSTER نيز براي بالا بردن كارايي موثر ا ست. دستور راهنماي CLUSTER اطلاعات بيشتري در اين زمينه به شما ميدهد.
3.7) چه امكاناتي براي پيدا كردن اشكال وجود دارد؟
PostgerSQL امكانات مختلفي براي گزارش دادن وضعيت خود دارد كه براي اشكال زدايي ميتوان از آنها استفاده كرد.
با استفاده از گزينه enable-assert-- تعداد زيادي ()assert براي مونيتور كردن و توقف برنامه در صورت بروز خطاهاي ناخواسته فعال ميشود.
هم Postmaster و هم postgres گزينههاي زيادي براي اشكال زدايي دارند. موقعي كه postmaster را اجرا ميكنيد خروجي استاندارد و خطا را سمت فايل log ارسال كنيد.
cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &
اين كار يك فايل log در بالاترين شاخه PostgreSQL ايجاد ميكند. اين فايل حاوي اطلاعات مفيدي در مورد مسائل و خطاهايي است كه براي سرور اتفاق افتاده است. براي ديدن جزئيات بيشتر ميتوان از d- به همراه فرمان postmaster استفاده كرد. گزينه d- همچنين يك عدد ميگيرد كه نشان دهنده سطح جزئياتي است كه در Logفايل نوشته ميشود. با بالابردن اين عدد حجم اطلاعات توليد شده در Logفايل نيز افزايش مييابد.
اگر postmaster در حال اجرا نباشد، ميتوانيم postgres را به طور مستقيم از خط فرمان اجرا كرده و دستورات SQL را به آن بدهيم. اين كار فقط براي اشكاليابي توصيه ميشود. توجه كنيد كه در اين حالت يك دستور با كاراكتر newline خاتمه پيدا ميكند و نه با ;. اگر postmaster را با امكانات اشكاليابي كامپيل كرده باشيد ميتوانيد با استفاده از يك برنامه اشكالياب اجراي برنامه را مونيتور كنيد.
اگر postmaster در حال اجرا باشد با دستور psql ميتوان به postgres متصل شد. با پيدا كردن PID فرايند postgres كه psql به آن متصل شده است ميتوان آن را مونيتور كرد. براي اينكار بايد يك برنامه اشكالياب را به آن pid متصل كرد. اگر بخواهيم بالا آمدن postgres را مونيتور كنيم كافي است "PGOPTIONS="-W n و psql را اجرا كنيم. اين كار باعث ميشود كه postgres با n ثانيه تاخير اجرا شود و در اين فاصله شما ميتوانيد برنامه اشكالياب را به آن متصل كرده و با قرار دادن يك نقطه توقف روند اجراي آن را مونيتور كنيد.
postgres گزينههاي s- و A- و t- دارد كه براي پيدا كردن اشكالات بسيار مناسب هستند.
شما ميتوانيد postgreSQL را با امكانات profiling كامپيل كنيد. اين كار باعث ميشود كه زمان اجراي دقيق هر تابع در برنامه مشخص شود. خروجيهاي توليد شده در اين حالت در فايل DLINUX_PROFILE. ريخته ميشود.
3.8) چرا موقعي كه من ميخواهم به پايگاه داده وصل شوم پيام "Sorry, too many clients" ميگيرم؟
شما بايد حداكثر تعداد فرايندهاي همزمان postmaster را افزايش دهيد. مقدار پيش فرض 32 است. براي افزايش آن ميتوان از گزينه N- استفاده كرد و يا فايل postgresql.conf را اصلاح نمود
توجه كنيد كه اگر N- مقداري بيشتر از 32 داشته باشد بايد مقدار B- را نيز افزايش دهيم. اين مقدار بايد حداقل دو برابر مقدار N- باشد. براي اعداد خيلي بالا بايد بعضي از پارامترهاي كرنل را نيز اصلاح كرد. پارامترهايي نظير حداكثر اندازه حافظه اشتراكي SHMMAX ، حداكثر تعداد سمافورها SEMMNI و SEMMNS ، حداكثر تعداد فرايندها NPROC، حداكثر فرايندهاي يك كاربر MAXUPRC و حداكثر فايلهاي باز NFILE و NINODE. يكي از دلايلي كه تعداد اتصالات همزمان postgreSQL محدود است آن است كه نيازهاي PostgreSQL بيش از منابع موجود سيستم نباشد.
3.9) در شاخه pgsql_tmp چه چيزي قرار دارد؟
دراين شاخه فايلهاي موقتي قرار دارد كه با اجراي درخواستها به وجود آمده است. به عنوان مثال اگر براي اجراي دستور order by نياز به انجام مرتب سازي باشد و در صورتي كه حافظه مشخص شده با گزينه S- براي اينكار كافي نباشد سيستم يك فايل موقت در اين شاخه ايجاد ميكند تا عمل مرتب سازي را انجام دهد.
فايلهاي موقت معمولاً به صورت اتوماتيك پاك ميشود اما اگر postgreSQL در حين مرتب سازي crash كند آن فايلها باقي ميمانند. با stop و start كردن برنامه postmaster اين فايلها پاك ميشوند.
3.10) چرا براي به روز كردن نسخه پايگاه داده من بايد كل داده ها را dump و مجدداً restore كنم؟
تيم برنامه نويس postgreSQL در نسخههاي ارائه شده كه فقط minor آنها متفاوت است فقط تغييرات كوچكي اعمال ميكنند؛ بنابراين براي به روز كردن از نسخه 7.2به 7.2.1 نيازي به dump و restore نيست. اما در نسخههايي كه major آنها تغيير ميكند غالباً ساختار داخلي جداول و فايلهاي داده تغيير ميكند. اين تغييرات معمولاً پيچيده هستند. براي انتقال دادههاي موجود در پايگاه داده در اين حالت بايد از dump و restore استفاده كرد.
در نسخههايي كه ساختار روي ديسك تغييري نميكند مي توان از برنامه pg_upgrade براي به روز كردن پايگاه داده استفاده كرد بدون اينكه نيازي به استفاده از dump و restore باشد. در يادداشتي كه به همراه هر توزيع ميآيد ذكر شده است كه آيا برنامه pg_upgrade براي اين توزيع وجود دارد يا خير.
3.11) از چه سخت افزاري بايد استفاده كنم؟
چون اكثر سختافزارهاي PC سازگار هستند مردم فكر ميكنند كه كيفيت آنها نيز يكسان است. در حاليكه اينطور نيست. استفاده از هاردهاي SCSI و حافظههاي ECC و مادربردهاي با كيفيت بالا نسبت به سخت افزارهاي ارزانتر نتايج بهتري از نظر كارايي و پايداري سيستم بهمراه خواهد داشت. PostgreSQL روي بيشتر سخت افزارها اجرا ميشود اما اگر كارايي و اطمينان فاكتورهاي مهمي هستند بايد سخت افزار مناسب استفاده شود. در گروههاي پستي در مورد سخت افزار مناسب و انتخاب آن بحث شده است.
--------------------------------------------------------------------------------
سوالات عملياتي
4.1) تفاوت بين binary cursors و Normal cursors چيست؟
راهنماي دستور DECLARE را مطالعه كنيد.
4.2) من چگونه ميتوانم فقط روي چند رديف اول يا يك رديف تصادفي درخواست SELECT بزنم؟
راهنماي دستور FETCH يا SELECT...LIMIT را ببينيد.
در واقع كل درخواست بايد بررسي و ارزيابي شود حتي اگر شما فقط چند رديف اول را بخواهيد. براي مثال درخواست ORDER BY را در نظر بگيريد. اگر انديس يا نمايهاي براي ORDER BY وجود داشته باشد،postgreSQL ممكن است بتواند فقط چند سطر اول درخواستي را ارزيابي كند و يا اينكه كل درخواست پردازش شود تا تعداد رديفهاي درخواستي توليد شود.
براي انتخاب يك سطر تصادفي به روش زير عمل ميكنيم:
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
4.3) من چگونه ميتوانم ليستي از جداول يا ساير چيزهايي كه در psql وجود دارد را ببينم؟
براي ديدن ليست جداول دستور dt\ را در برنامه psql استفاده كنيد. براي ديدن ليست كامل فرمانها ?\ را اجرا كنيد. راه ديگر خواندن متن برنامه psql است كه در شاخه pgsql/src/bin/psql/describe.c قرار دارد. اين فايل حاوي فرامين SQLيي است كه خروجي را براي دستوراتي كه با \در psql شروع ميشوند توليد ميكنند. راه ديگر اجراي psql با گزينه E-است. اينكار باعث ميشود كه psql قبل از اجرا هر دستور SQLمتناظر آن را نشان دهد. PostgreSQLهمچنين يك برنامه SQLi دارد كه ميتوان با استفاده از آن اطلاعات داخلي پايگاه داده را استخراج كرد.
4.4) چگونه يك ستون جدول را حذف ميكنيد؟ چگونه نوع داده آن را عوض كنيم؟
حذف يك ستون در توزيع 7.3 با استفاده از دستور ALTER TABLE DROP COLUMN اضافه شده است. در نسخههاي قبلي به روش زير عمل كنيد:
BEGIN;
LOCK TABLE old_table;
SELECT ... -- تمام ستونها غير از ستوني كه ميخواهيد آن را حذف كنيد را در اينجا بياوريد
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
COMMIT;
براي عوض كردن نوع داده يك ستون به روش زير عمل كنيد:
BEGIN;
ALTER TABLE tab ADD COLUMN new_col new_data_type;
UPDATE tab SET new_col = CAST(old_col AS new_data_type);
ALTER TABLE tab DROP COLUMN old_col;
COMMIT;
4.5) حداكثر اندازه يك رديف، جدول و خود پايگاه داده چقدر است؟
محدوديتها عبارتند از:
حداكثر اندازه پايگاه داده نامحدود (تا 32 ترابايت وجود دارد)
حداكثر اندازه يك جدول 32 ترابايت
حداكثر ا ندازه يك رديف 1.6 ترابايت
حداكثر اندازه يك فيلد 1 گيگا بايت
حداكثر اندازه رديفهاي يك جدول نا محدود
حداكثر ستونهاي يك جدول بسته به نوع جدول بين 250 تا 6000
حداكثر انديسهاي يك جدول نا محدود
البته در حالت نامحدود نيز ما محدود به حجم هاردديسك و فضاي حافظه خواهيم بود. در صورتي كه مقادير مشخص شده به عنوان نامحدود به صورت غير معمولي بزرك شوند كارايي سيستم كاهش خواهد يافت.
براي ذخيره كردن جداول با اندازه خيلي بزرگ نيازي نيست كه سيستم عامل امكان ايجاد فايلهاي بزرگ را داشته باشد. بلكه جداول خيلي بزرگ به صورت فايلهايي به حجم يك گيگا بايت نگاهداري ميشوند.
اگر اندازه بلوكهاي داده را برابر 32 كيلو بايت قرار دهيم حداكثر اندازه جدول و حداكثر تعداد ستونها 4 برابر خواهد شد.
4.6) چقدر فضاي ديسك سخت براي ذخيره كردن دادههاي يك فايل متني مورد نياز است؟
يك پايگاه داده PostgreSQL تا 5 برابر فضايي روي هاردديسك براي نگاهداري يك فايل متني نياز دارد.
به عنوان مثال يك فايل با 100000 خط را در نظر بگيريد كه در هر خط يك عدد صحيح و يك توضيح متني آمده است. فرض كنيد كه رشته متني به طور متوسط 20 بايت باشد. اندازه فايل برابر 2.8 مگا بايت خواهد بود ولي PostgreSQL براي نگاهداري اين فايل به 6.4 مگا بايت اطلاعات نياز خواهد داشت.
32 bytes: اندازه سرايند هر خط به طور تقريبي
24 bytes: يك عدد صحيح و يك رشته 24 بايتي
+ 4 bytes: اشاره گر روي صفحه به يك چندتايي
----------------------------------------
60 bytes در هر رديف
اندازه صفحات داده در PostgreSQL برابر با 8 كيلو بايت است
8192 تعداد بايتها در هر صفحه
------------------- = 136 تعداد رديفها در يك صفحه پايگاه داده
60 تعداد بايتهاي هر رديف
100000 تعداد رديفها
-------------------- = تعدادصفحات پايگاه داده
128 تعداد رديفها در هر صفحه
735 تعداد صفحات * 8192 تعداد بايتهاي هر صفحه = 6,021,120 مگا بايت
سربار انديسها يا نمايهها از اين مقدار كمتر است ولي چون شامل خود دادهها هم هست ممكن است اندازه آنها هم بزرگ شود.
NULLها به صورت bitmap ذخيره ميشوند و از اينرو فضاي بسيار كمي را اشغال ميكنند.
4.7) چگونه ميتوانم بفهمم كه چه كاربران، پايگاه داده، نمايه و جداولي در سيستم تعريف شده است؟
psql تعداد زيادي دستور دارد كه با \ شروع ميشوند و اين اطلاعات را در اختيار ما قرار ميدهند. براي ديدن آنها دستور ?\ را اجرا كنيد. همچنين جداول سيستمي كه نام آنها با pg_ شروع ميشود نيز اين اطلاعات را در خود دارند. اجراي برنامه psql با گزينه l- نيز باعث نشان دادن ليست تمام پايگاههاي داده ميشود.
همچنين فايل pgsql/src/tutorial/syscat.source نيز فرمانهاي SELECT كه با استفاده از آن ميتوان اطلاعات پايگاه داده را استخراج كرد شرح داده است.
4.8) چرا درخواستهاي من كند اجرا ميشوند يا چرا از نمايه ها استفاده نميكنند؟
به طور معمول براي درخواستها از نمايهها استفاده نميشود. تنها در صورتي از نمايهها استفاده ميشود كه اندازه جدول از يك اندازه حداقل بزرگتر باشد و درخواست هم فقط قسمتي از رديفهاي جدول را انتخاب كرده باشد. دليل اين كار آن است كه دسترسيهاي تصادفي به هاردديسك كه به خاطر نمايهها ايجاد ميشود ممكن است از خواندن مستقيم جدول يا خواندن ترتيبي ركوردها كندتر باشد.
براي تعيين اينكه از نمايه استفاده شود يا خير، PostgreSQL بايد اطلاعات آماري را در مورد يك جدول بداند. اين اطلاعات توسط دستور ANALYZE و VACUUM ANALYZE به دست ميآيد. با استفاده از اين اطلاعات، بهينه ساز از تعداد رديفهاي يك جدول اطلاع پيدا ميكند و بهتر ميتواند تعيين كند كه آيا از نمايه استفاده شود يا خير. اطلاعات آماري همچنين براي تعيين ترتيب الحاق و روشهاي الحاق به صورت بهينه نيز كاربرد دارد. جمع آوري اطلاعات آماري بايد به صورت دورهاي همزمان با تغيير دادههاي جدول انجام شود.
نمايهها به طور معمول همراه با دستور ORDER BY به كار برده نميشوند. براي يك جدول بزرگ يك پيمايش ترتيبي همراه با دستور مرتب سازي از به كار بردن نمايهها سريعتر خواهد بود.
اما اگر همراه با ORDER BY از LIMIT استفاده شود اغلب از نمايهها استفاده ميشود چون فقط قسمتي از جدول برگردانده ميشود. در حقيقت هر چند توابع ()MIN و ()MAX از نمايهها استفاده نميكنند ولي ميتوانيم با استفاده از دستور زير با استفاده از نمايهها و دستور ORDER BY و LIMIT ، آنها را به دست آوريم.
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
اگر شما فكر ميكنيد كه بهينه ساز سيستم در انتخاب پيمايش ترتيبي اشتباه كرده است با دستور 'SET enable_seqscan TO 'off' ميتوانيد ببينيد آيا استفاده از نمايهها باعث افزايش سرعت درخواستها خواهد شد يا خير.
استفاده از نمايهها هنگامي كه از علائم ويژه نظير LIKE و ~ استفاده ميكنيد فقط در بعضي شرايط خاص كه در اينجا ذكر شده است ممكن است:
ابتداي رشته جستجو بايد به طور صريح مشخص باشد براي مثال:
- دستورات LIKE نبايد با علامت % شروع شوند
- الگوهاي منظمي كه با ~ ميآيد حتماً بايد با علامت ^ شروع شود
رشته جستجو نبايد با يك مجموعه از كاراكترها مثل [a-e] شروع شود
جستجوهاي غيرحساس به متن مثل ILIKE و *~ از نمايهها استفاده نميكنند. در عوض از توابع نمايهاي كه در قسمت 4.12 توضيح داده شد استفاده ميكنند.
مقدار پيش فرض locale بايد در initdb استفاده شود.
4.9) چگونه ميتوانم نحوه بررسي درخواست را توسط بهينهساز درخواستها مشاهده كنم؟
راهنماي دستور EXPLAIN را نگاه كنيد.
4.10) نمايه R-tree چيست؟
از نمايه R-Tree براي انديس كردن دادههاي فاصلهاي استفاده ميشود. يك نمايه hash نميتواند جستجوهاي محدودهاي را انجام دهد. نمايه "B-tree" نيز براي انجام جستجوي محدودهاي در يك جهت قابل استفاده است. اما R-Tree ميتواند دادههاي چند بعدي را نيز پشتيباني كند. براي مثال اگر از نمايه R-tree براي گونه Point استفاده شود سرعت درخواستهايي نظير "select all points within a bounding rectangle" به مراتب افزايش مييابد.
مقالهاي كه طراحي R-tree را توضيح داده است
Guttman, A. "R-trees: A Dynamic Index Structure for Spatial Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57.
R-tree ميتواند چندضلعيها و چند وجهي را پشتيباني كند. در تئوري، R-tree ميتواند تعداد بعدهاي بالاتري را نيز پشتيباني كند. در عمل توسعه R-tree نياز به كار بيشتري دارد.
4.11) بهينه ساز تكويني درخواست چيست؟ (Genetic Query Optimizer)
استفاده از GEQO سرعت بهينه سازي درخواست را هنگاميكه تعداد زيادي جدول را با استفاده از الگوريتم ژنتيك الحاق ميكنيم افزايش ميدهد.
4.12) چگونه از عبارات منظم براي جستجو استفاده كنم؟ چگونه جستجويي انجام دهم كه حساس به متن نباشد؟ چگونه براي يك جستجوي غير حساس به متن از نمايه استفاده كنم؟
براي جستجوي عبارت منظم از عملگر ~ استفاده ميكنيم. براي جستجوي غير حساس به متن از عملگر *~ و يا ILIKE استفاده ميكنيم.
روش ديگر انجام جستجوي غير حساس به متن در زير نشان داده شده است.
SELECT *
FROM tab
WHERE lower(col) = 'abc';
اين از نمايههاي استاندارد استفاده نميكند. ولي شما مي توانيد با دستور زير يك نمايه ايجاد كنيد و از آن استفاده كنيد.
CREATE INDEX tabindex ON tab (lower(col));
4.13) چگونه ميتوانم در يك درخواست تشخيص دهم كه يك فيلد NULL است؟
با استفاده از توابع IS NULL و IS NOT NULL ميتوانيم NULL بودن يك فيلد را تست كنيم.
4.14) تفاوت بين گونههاي مختلف character چيست؟
Type Internal Name Notes
--------------------------------------------------
VARCHAR(n) varchar اندازه، حداكثر طول را نشان مي دهد بدون اضافه شدن كاراكتر اضافه
CHAR(n) bpchar كاراكترهاي بلانك براي پر شدن طول مشخص شده استفاده ميشود
TEXT text حداكثر طول را مشخص نميكند
BYTEA bytea آرايهاي از بايت با طول متغير
"char" char يك كاراكتر
نام داخلي گونهها را در system catalogue و بعضي از پيغامهاي خطا ميتوان ديد.
چهار گونه اول همگي از نوع varlena هستند (4 بايت اول روي ديسك طول را مشخص ميكند كه به دنبال آن دادهها قرار دارند.)بنابراين فضاي واقعي استفاده شده روي ديسك از اندازه تعريف شده بيشتر است. اما اين گونهها را ميتوان فشرده كرد كه اينكار باعث ميشود فضاي كمتري روي ديسك اشغال كنند.
براي ذخيره رشتههاي با طول متغير(VARCHAR(n بهترين انتخاب است. در اين گونه حداكثر طول رشته محدود است بر خلاف text كه هيچ محدوديتي روي حداكثر اندازه رشته نميگذارد.(در اين گونه حداكثر طول يك رشته يك گيگا بايت خواهد بود)
گونه (CHAR(n براي ذخيره دادههاي با طول يكسان است.يك گونهي (CHAR(n با كاراكترهاي بلانك (خالي) پر ميشود تا به طول مشخص شده برسد در حاليكه گونه VARCHAR كاراكترها را به همان صورت كه هستند ذخيره ميكند. گونه BYTEA براي ذخيره دادههاي باينري است به خصوص دادههاي باينري كه شامل بايتهاي NULL هستند. از نظر كارايي تمام اين گونهها يكسان هستند.
4.15.1) چگونه ميتوانم يك فيلد سريال يا افزايشي ايجاد كنم؟
PostgreSQL از دادههاي سريال پشتيباني ميكند. براي ايجاد يك فيلد سريال (براي داشتن يك فيلد منحصر به فرد براي هر رديف )به روش زير عمل كنيد:
CREATE TABLE person (
id SERIAL,
name TEXT
);
دستور بالا به طور اتوماتيك به دستور زير تبديل ميشود:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
براي ديدن اطلاعات بيشتر به راهنماي دستور create_sequence مراجعه كنيد. همچنين ميتوان از OIDهر رديف به عنوان يك مقدار منحصر به فرد استفاده كرد. اما در اين حالت براي dump كردن و reloadكردن پايگاه داده بايد دستور pg_dumps را با گزينه o- اجرا كنيد.
4.15.2) چگونه ميتوانم مقدار يك درج سريالي را بدانم؟
يك روش براي گرفتن مقدار بعدي يك فيلد سريال استفاده از تابع ()nextval است. در شبه كُدي كه در ادامه آمده است روش انجام اين كار نشان داده شده است:
new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
با اجراي دستور فوق مقدار جديد را در متغير new_id نيز خواهيدداشت كه ميتوانيد آن را در بقيه درخواستها نيز استفاده كنيد. توجه داشته باشيد كه نام SEQUENCEيي كه به طور اتوماتيك ايجاد شده است به صورت table_serialcolumn_seq خواهد بود. كه در آن table نام جدول و serialcolumn نام فيلد سريال جدول ميباشد.
براي ديدن مقدار نسبت داده شده به فيلد سريال نيز ميتوان از تابع () currval به صورت زير استفاده كرد.
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
و سرانجام شما ميتوانيد از مقدار OID كه خروجي دستور INSERT است براي ديدن مقدار پيش فرض استفاده كنيد. هر چند اين روش در همه پلتفرمها قابل استفاده نيست و ضمن اينكه فيلد oid بعد از عدد 4 ميليارد دوباره صفر ميشود. در زبان perl با استفاده از DBI و DBD::Pg مقدار oidرا ميتوانيد به اين شكل استخراج كنيد: بعد از اجراي ()st->execute$ مقدار oid در متغير sth->pg_oid_status$ ذخيره خواهد شد.
4.15.3) آيا توابع ()nextval و ()currval منجر به ايجاد شرايط race براي ساير كاربران مي شوند؟
خير، استفاده از اين توابع شرايط race را به وجود نمي آورد.
4.15.4) چرا اعداد سريالي مربوط به تراكنشهاي abort شده مجدداً استفاده نمي شود؟ چرا بين اعداد سريالي يك فاصله خالي ايجاد مي شود؟
براي بالا بردن امكان اجراي همزمان تراكنشها، اعداد سريالي به محض اجراي تراكنش به آنها تخصيص مي يابد در اين حالت اگر بعضي از تراكنشها abort شوند بين اعداد سريالي استفاده شده يك فاصله خالي به وجود مي آيد.
4.16) OID و TID چه هستند؟
OID راه حل PostgreSQL براي داشتن يك شناسه منحصر به فرد براي هر رديف است. هر رديف جديدي كه ايجاد مي شود يك OID منحصر به فرد به آن اختصاص مي يابد. تمام OIDهايي كه در حين initdb ايجاد مي شوند از 16384 كمتر هستند و OIDهايي بعداً توليد مي شود از اين عدد بزرگتر خواهد بود. نكته مهم آن است كه OIDها نه تنها در يك جدول شبيه نيستند بلكه در كل پايگاه داده هيچ دو رديفي داراي OID يكسان نخواهد بود.
PostgreSQL از OID در سيستم داخلي خود براي ايجاد ارتباط بين رديفهاي جداول مختلف استفاده مي كند. توصيه مي شود كه يك ستون از نوع OID براي ذخيره اين فيلد در جدول ايجاد كنيد. ساختن يك نمايه براي اين فيلد باعث دسترسي سريعتر به آن خواهد شد.
تمام پايگاههاي داده در PostgreSQL براي گرفتن OID جديد از يك ناحيه مركزي استفاده مي كند. ولي اگر بخواهيم OID را به روش ديگري بگيريم و يا اينكه در حين كپي كردن يك جدول بخواهيم OIDهاي اصلي آن تغيير نكند به روش زير مي توانيم عمل كنيم:
CREATE TABLE new_table(mycol int);
SELECT oid AS old_oid, mycol INTO tmp_table FROM old_table;
COPY tmp_table TO '/tmp/pgtable';
COPY new_table WITH OIDS FROM '/tmp/pgtable';
DROP TABLE tmp_table;
OID يك عدد صحيح 4 بايتي است و بنابراين حداكثر مقدار آن 4 ميليارد خواهد بود و بعد از آن مقدار آن سرريز خواهد شد. البته تا كنون براي كسي اين اتفاق نيفتاده است و تصميم گرداندگان PostgreSQL آن است كه قبل از آنكه اين اتفاق رخ دهد اين مشكل را برطرف كنند.
TIDها براي شناسايي محل فيزيكي يك رديف بر اساس بلوك و آفست مي باشد. TIDها بعد از تغيير پيدا كردن يك رديف و يا بازخواني آن عوض مي شوند. TIDها توسط نمايه ها استفاده مي شوند.
4.17) معني بعضي از ترمها و كلماتي كه در PostgreSQL استفاده ميشود چيست؟
ليست برخي از ترمها و كلماتي كه استفاده مي شوند:
table, relation, class :كلاس، رابطه، جدول
row, record, tuple چندتايي، ركورد، رديف
column, field, attribute صفت، فيلد، ستون
retrieve, select انتخاب، خواندن
replace, updateبه روز كردن، جايگزيني
append, insert درج، اضافه كردن
OID, serial value مقدار سريال
portal, cursor
range variable, table name, table alias
يك ليست عمومي از ترمهاي مورد استفاده در پايگاه داده در آدرس http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.htm وجود دارد.
4.18) چرا من خطاي "ERROR: Memory exhausted in AllocSetAlloc" ميگيرم؟
اين خطا احتمالاً يا به خاطر تمام شدن حافظه مجازي سيستم شماست و يا اينكه كرنل براي برنامه ها در مورد ميزان استفاده از حافظه مجازي محدوديت اعمال كرده است. قبل از اجراي برنامه اصلي يكي از دستورات زير را اجرا كنيد.
ulimit -d 262144
limit datasize 256m
بسته به نوع شل يكي از اين دستورات ممكن است با موفقيت اجرا شود. با اجراي آن دستور محدوديت حافظه مجازي براي برنامه ها برداشته شده و با اين كار احتمالاً درخواستي كه قبلاً خطا مي داده است اجرا خواهد شد.
4.19) از كجا تشخيص دهم كه ويرايش يا نسخه PostgreSQLيي كه من استفاده ميكنم چيست؟
با اجراي دستور ()SELECT version
4.20) چرا حين اجراي عمليات روي large-objectها خطاي "invalid large obj descriptor"به وجود مي آيد؟
شما بايد قبل از شروع دستوراتي كه با large-objectها كار مي كنند BEGIN و بعد از آنها هم يك END بگذاريد. در حال حاضر PostgreSQL هندل large-objectها را در زمان نهايي شدن تراكنش (commitشدن) مي بندد. به همين دليل اولين تلاش براي انجام هر كاري با هندل منجر به خطاي invalid large obj descriptor خواهد شد. براي جلوگيري از اين خطا حتماً بايد از يك تراكنش استفاده كنيد. اين كار همانطور كه قبلاً گفته شد با استفاده از قرار دادن BEGIN و END در ابتدا و انتهاي دستورات انجام مي شود.
اگر اين خطا را در حين استفاده از يك درايور ODBC دريافت كرديد احتمالاً بايد اين دستور را اجرا كنيد: set auto-commit off
4.21) چگونه يك ستون ايجاد كنم كه مقدار زمان جاري را به عنوان مقدار پيشفرض داشته باشد؟
از CURRENT_TIMESTAMP استفاده كنيد در مثال زير نحوه انجام اين كار نشان داده شده است:
CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
4.22) چرا "زير درخواستهايي" كه از IN استفاده ميكنند كند هستند؟
در نسخه هاي قبل از 7.4 عمل الحاق زير درخواست و درخواست اصلي به اين صورت انجام مي شود كه نتايج به دست آمده از زير درخواست به صورت ترتيبي براي هر رديف اعمال مي شود. اگر زيردرخواست رديف هاي كمي را به عنوان خروجي برگرداند و درخواست بيروني رديف هاي زيادي را شامل شود استفاده از IN بهترين روش است در غير اينصورت بهتر است از EXISTS استفاده شود
SELECT *
FROM tab
WHERE col IN (SELECT subcol FROM subtab);
به:
SELECT *
FROM tab
WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col);
براي اجراي سريع اين درخواست بايد براي ستون subcol نمايه ايجاد شده باشد.
در نسخه هاي بعد از 7.4 IN براي الحاق از همان تكنيك پيچيده مورد استفاده در دستورات معمولي استفاده مي كند و بنابراين استفاده از آن نسبت به EXISTS ارجحيت دارد.
4.23) چگونه ميتوانم يك الحاق خارجي (outer join) انجام دهم؟
براي انجام الحاق خارجي به روش زير عمل كنيد:
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
يا
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
درخواستهاي بالا t1.col , t2.col را به هم الحاق مي كند و همچنين رديفهاي t1 كه نظير آنها در t2 نبوده است را نيز برمي گرداند. اگر از RIGHT استفاده شود نتيجه بر عكس است. يعني رديفهاي t2 كه نظير آنها در t1 نباشد را نشان مي دهد و اگر از FULL استفاده شود نتيجه هم شامل رديفهاي t1 است و هم شامل رديفهاي t2. استفاده از كلمه OUTER اختياري است چرا كه اين كلمه به طور ضمني در دستورهاي LEFT, RIGHT, FULL وجود دارد.
در نسخه هاي قبلي پايگاه داده مي توانيم الحاق خارجي را به كمك دستورهاي UNION, NOT IN شبيه سازي كنيم. اين كار در مثال زير نشان داده شده است:
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
4.24) چگونه ميتوان درخواستهايي از چند پايگاه داده توليد كرد؟
در حال حاضر اين كار امكان پذير نيست. PostgreSQL فقط امكان درخواست از پايگاه داده اي را مي دهد كه در حال حاضر به آن متصل باشيد و نميتوان به طور همزمان از دو پايگاه داده استفاده كرد. البته يك برنامه كاربردي خود مي تواند به طور همزمان دو پايگاه داده را مورد استفاده قرار داده و نتايج را با هم تركيب كند ولي نمي تواند در يك درخواست به هر دو پايگاه داده رجوع كند.
4.25) چگونه خروجي يك تابع ميتواند چند رديف يا ستون باشد؟
در نسخه 7.3 خروجي يك تابع مي تواند چند رديف يا چند ستون باشد. براي ديدن اطلاعات بيشتر به سايت زير مراجعه كنيد:http://techdocs.postgresql.org/guides/SetReturningFunctions
4.26) در توابع PL/PgSQL چرا نميتوان با اطمينان جداول موقت را ايجاد يا حذف كرد؟
PL/PgSQL محتواي توابع را ذخيره (cache) مي كند. يك اثر بد جانبي اين كار آن است كه اگر در تابع از يك جدول موقت استفاده شود و بعداً آن جدول حذف و يك جدول جديد به جاي آن ايجاد شود، در فراخواني مجدد آن تابع، محتواي ذخيره شده تابع هنوز به جدول قديمي اشاره مي كند و بنابراين اجراي تابع با اشكال مواجه مي شود. راه حل اين مشكل آن است كه براي جداول موقت از دستور EXECUTE استفاده شود كه اين كار سبب مي شود كه درخواست براي هر بار اجرا مجدداً پيمايش و تفسير شود.
4.27) چه گزينههايي براي تكرار (replication) وجود دارد؟
There are several master/slave replication options available. These allow only the master to make database changes and the slave can only do database reads. The bottom of http://gborg.PostgreSQL.org/genpage?replication_research lists them. A multi-master replication solution is being worked on at http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php.
4.28) چه گزينههايي براي رمزنگاري وجود دارد؟
contrib/pgcrypto شامل توابع رمزنگاري زيادي است كه مي توان از آنها در دستورات SQL استفاده كرد.
براي رمز كردن ارتباط بين client و server پايگاه داده حتماً گزينه SSL را بر روي پايگاه داده فعال كنيم.
در نسخه 7.3 به بعد كلمات عبور كاربران به طور اتوماتيك به صورت رمز شده ذخيره مي شود ولي در نسخه هاي قبلي بايد گزينه PASSWORD_ENCRYPTION را در فايلpostgresql.conf فعال كنيم.
مي توان پايگاههاي داده را روي يك فايل سيستم رمزشده نگاهداري كرد
--------------------------------------------------------------------------------
Extending PostgreSQL
5.1) من يك تابع نوشتهام. چگونه آن را در psql اجرا كنم؟ چرا با اجراي آن core dump ميگيرم؟
دلايل مختلفي مي تواند باعث بروز اين مشكل شود. اما قبل از همه، تابع خود را به صورت جدا تست كنيد.
5.2) چگونه ميتوانم در توليد نوعها و توابع جديد و جالب براي PostgreSQL همكاري و مشاركت داشته باشم؟
كد خود را به گروه پستي pgsql-hackers ارسال كنيد.
5.3) چگونه ميتوانم يك تابع به زبان C بنويسم كه خروجي آن يك tuple (چند تايي) باشد؟
در نسخه هاي 7.3 به بعد يك تابع مي تواند يك جدول را به عنوان خروجي برگرداند. اين ويژگي در توابعي كه به زبانهاي C و PL/PgSQL نوشته ميشوند به طور كامل وجود دارد. راهنما برنامه نويسان را مطالعه كنيد. يك مثال از نحوه برگرداندن يك جدول به عنوان خروجي در contrib/tablefunc آمده است.
5.4) من يك فايل منبع را عوض كرده ام چرا در عمليات كامپيل مجدد آن، تغيير ديده نميشود؟
Makefile براي فايلهاي include شده وابستگيها را به درستي نشان نمي دهد. براي اطمينان از اينكه فايلي كه عوض كرده ايد حتماً دوباره كامپيل ميشود دستور make clean را اجرا كنيد. اگر از كامپيلر gcc استفاده مي كنيد مي توانيد از گزينه enable-depend-- در موقع اجراي برنامه configure استفاده كنيد اين گزينه باعث مي شود كه وابستگيها به طور اتوماتيك توليد شود.
مأخذ:
http://www.postgresql.org/files/documentation/faqs/FAQ_farsi.html
منبع : سايت علمی و پژوهشي آسمان--صفحه اینستاگرام ما را دنبال کنید
اين مطلب در تاريخ: شنبه 23 اسفند 1393 ساعت: 23:21 منتشر شده است
برچسب ها : تحقیق درباره مروري بر سيستمهاي بانك اطلاعاتي و مزاياي Oracle,تحقیق درباره سيستمهاي بانك اطلاعاتي و مزاياي Oracle,تحقیق درباره POSTGEERSQL,