mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
dd67cf365a
Mahmoud Taghizadeh
1256 lines
141 KiB
Plaintext
1256 lines
141 KiB
Plaintext
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 استÙاده
|
||
کنید این گزینه باعث می شود که وابستگیها به
|
||
طور اتوماتیک تولید شود. |