PostgreSQL FAQسوالاتي كه اغلب در مورد PostgreSQL‌ پرسيده مي شوند تاريخ آخرين Ø§ØµÙ„Ø§Ø Ø§ÙŠÙ† ÙØ§ÙŠÙ„: 28 شهریور 1383 هجری شمسی نگهدارنده اصلي ÙØ§ÙŠÙ„ (زبان انگليسي)در ØØ§Ù„ ØØ§Ø¶Ø± : 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-2004, 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 OF CALIFORNIA 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 مي‌باشد. P‌ostgreSQL‌ همچنين امكان ارتباط به صورت 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) Iچگونه مي‌توانم در يك درخواست تشخيص دهم كه يك Ùيلد 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 Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید این گزینه باعث Ù…ÛŒ شود Ú©Ù‡ وابستگیها به طور اتوماتیک تولید شود.