نكات شاخصبندي
فهرست زير چندين نكات را در هنگام استفاده از شاخصها متذكر ميشود:
- s براي جداول كوچك، شاخصها هيچ اثري در بهبود اجراي پايگاه دادهاي ندارند.
- s شاخصها بهترين اثر را خواهند داشت اگر ستونهايي كه شاخص ميشوند داراي يك طيف وسيعي از داده باشند.
- s شاخصها ميتوانند پرس و جوي ما را بهينه نمايند وقتي جواب پرس و جوها يك مقدار كمي داده باشد (مثلاً كمتر از 25% دادهها). اگر حجم زيادي از دادهها در يك زمان برگردانده ميشود، شاخصهاي نوع داده سربار محسوب ميشوند و عملاً كارايي ندارند.
- s شاخصها ميتوانند نرخ بازيابي دادهها را بهبود بخشند. به هرحال آنها بهنگام سازي دادهها را كند ميكنند.
- s هميشه روي فيلدهايي شاخصبندي را انجام دهيم كه در عمل اتصال بين جداول استفاده ميشوند. اين روش به طرز قابل ملاحظهاي سرعت اتصال را بالا ميبرد.
- s اكثر سيستمهاي پايگاه دادهاي امكان ايجاد شاخصي روي يك ديد را به ما نميدهند. اگر سيستم پايگاه دادهاي اين اجازه را ميدهد، از شبه جمله GROUP BY به همراه جمله SELECT استفاده كنيم تا ديدي براي مرتبسازي دادههاي آن ديد ايجاد كند (متأسفانه بسياري از سيستمها قادر نيستند از شبه جمله ORDER BY به همراه جمله CREATE VIEW استفاده كنند.
- s روي فيلدهايي كه مرتباً در حال بهنگام شدن يا تغييرند شاخص ايجاد نكنيم.
- s شاخصها و جداول را روي يك درايو فيزيكي ذخيره نكنيم. جداسازي اين اشيا رقابت بين درايو را حذف كرده و در نتيجه پرس و جوها سريعتر خواهد شد.
- s شاخصها نبايد روي فيلدهايي بنا شوند كه شامل تعداد زيادي مقدار NULL هستند.
شاخصبندي روي بيشتر از يك فيلد
SQL همچنين اين امكان را ميدهد كه روي بيشتر از يك فيلد شاخص ايجاد نماييم. اين نوع شاخص يك شاخص مركب ناميده ميشود.
استفاده از كلمه كليدي UNIQUE به همراه CREATE INDEX
شاخصهاي مركب اغلب به همراه كلمه كليدي UNIQUE براي جلوگيري از تكرار ركوردها استفاده ميشوند.
توجه ـ چنانچه كليد اصلي براي يك جدول مشخص شده باشد، شاخصها تلويحاً توسط پايگاه دادهاي ايجاد ميگردند. زيرا ميدانيم كه هر مقدار از داخل كليد اصلي بايد يكتا باشد. محدوديت كليد اصلي و يكتايي هر دو باعث ميشوند كه سيستم، شاخص ايجاد نمايد.
شاخصها و اتصالها
هنگام استفاده از اتصالهاي پيچيده در پرس و جوها، جمله SELECT ميتواند وقت زيادي مصرف كند. اگر جداول بزرگ باشند اين مقدار وقت ممكن است به چندين ثانيه برسد. اين نوع اجرا در يك محيط كلاينت سرور كه تعداد زيادي كاربر در آن واحد در حال كار كردن ميباشند ممكن است مدتهاي زيادي كاربران را در حالت انتظار بگذارد. ايجاد يك شاخص روي فيلدهايي كه اغلب اوقات در اتصالها استفاده ميشوند ميتواند اجراي پرس و جوي شما را به طرز قابل ملاحظهاي بهبود بخشد، به هر حال اگر تعداد زيادي شاخص ايجاد شوند، به جاي بالا بردن سرعت ميتوانند اجراي سيستم را پايين آورند.
ايجاد ديدها View ها
معرفي ديد
يك ديد اغلب به يك جدول مجازي اشاره ميكند و اين به آن معني است كه يك ديد شبيه جدول است و شبيه به يك جدول به آن مراجعه ميشود. به هرحال، ديدها شامل دادههايي مثل جداول نيستند. تنها رسانه موردنياز براي يك ديد، رسانهاي براي نگهداري تعريف ديد است. يك ديد به وسيله يك پرس و جو روي يك يا چند جدول پايگاه دادهاي تعريف ميشود. يك ديد چيزي جز يك پرس و جوي از قبل تعريف شده نيست. ديدها به وسيله جمله CREATE VIEW ايجاد ميشوند.
بعد از اينكه ديد ايجاد شد، ميتوانيم از دستورات SQL زير براي مراجعه به آن ديد استفاده كنيم:
- SELECT
- INSERT
- UPDATE
- DELETE
كاربرد ديدها
ما ميتوانيم از ديدها يا جداول مجازي براي پرس و جوهاي پيچيده استفاده كنيم. بعد از آنكه يك ديد يا مجموعهاي از دادهها ايجاد شدند، ميتوانيم از آن ديد همانند يك جدول استفاده نماييم. به هرحال محدوديتهاي خاصي براي تغيير دادهها در داخل ديدها ممكن است بوجود آيد. وقتي دادهاي در يك جدول تغيير ميكند، ديدهاي ايجاد شده نيز تغيير مينمايند البته بايد توجه داشته باشيم كه ديدها در پايگاه دادهاي همانند جدول فضاي فيزيكي اشغال نميكنند.
نحوه نگارش جمله CREATE VIEW به شكل زير است:
تذكر ـ اگر بلافاصله پس از جمله CREATE VIEW (قبل از كلمه كليدي AS) مستقيماً فهرستي از ستونها را مشخص نكنيم، نام ستونها در ديد همان نام ستونهاي انتخاب شده جدول پايه خواهد بود.کد:CREATE VIEW view – name [(column l, column 2, …)] AS SELECT column – name(s) FROM table – name WHERE condition
تغيير نام ستونها
ديدها نحوه ارائه دادهها را آسان ميكنند. به علاوه با معرفي يك ديد با استفاده از جمله create view اين امكان به ما داده ميشود تا ستونهاي انتخابي را تغيير نام دهيم.
پردازش ديد در SQL ديدها ميتوانند دادههاي جداول را به شكلي خيلي راحتتر از آنچه در ساختار جدول پايگاه دادهاي وجود دارد، ارائه دهند. وقتي چندين پرس و جوي پيچيده را پشتسر هم اجرا ميكنيم، ديدها ميتوانند بينهايت كار را ساده نمايند.
محدوديتهاي استفاده از SELECT
SQL محدوديتهاي مشخصي را در هنگام استفاده از جمله SELECT براي ساختن يك ديد قرار ميدهد. قوائد زير هنگام استفاده از جمله SELECT بكار گرفته ميشوند:
s از عملگر UNION نميتوانيم استفاده كنيم.
s از شبه جمله ORDER نميتوانيم استفاده كنيم اما ميتوانيم از شبه جمله GROUP BY در يك ديد استفاده نماييم تا وظايف مشابه شبه جمله ORDER BY را اجرا كنيم.
تغيير دادهها در يك ديد
همانگونه كه گفته شد، با ايجاد يك ديد با استفاده از يك يا چند جدول فيزيكي در يك پايگاه دادهاي، ميتوانيم يك جدول مجازي بسازيم، تا از دستورات SQL يا يك برنامه كاربردي پايگاه دادهاي استفاده كنيم. بعد از اينكه يك ديد توسط جمله CREATE VIEW … SELECT ايجاد شد، ميتوانيم با استفاده از دستورات پردازش دادهها مثل DELETE, INSERT, UPDATE اعمال بهنگام سازي، درج و حذف دادهها را روي ديد انجام دهيم.
مشكلات تغيير دادهها با استفاده از ديدها
در زير فهرستي از محدوديتهاي متداول كه در هنگام كار با ديدها با آن مواجه هستيم آورده شده است:
ـ نميتوانيم از جملات DELETE در ديدهاي چندين جدول استفاده كنيم.
ـ نميتوانيم از جمله INSERT استفاده كنيم مگر آنكه تمام ستونهاي NOT NULL استفاده شده در جدول اصلي در ديد نيز باشند. اين محدوديت مورد اجرا گذاشته ميشود زيرا پردازنده SQL نميداند كه چه مقاديري را به داخل ستونهاي NOT NULL درج كند.
ـ اگر ركوردهايي را از طريق يك ديد اتصالي درج يا بهنگام كنيم، تمام ركوردهايي كه بهنگام شدهاند بايد متعلق به جدول فيزيكي يكساني باشند.
ـ اگر از شبه جمله DISTINCT براي ايجاد يك ديد استفاده كنيم، نميتوانيم ركوردها را در داخل يك ديد درج يا حذف نماييم.
ـ نميتوانيم يك ستون مجازي (ستوني كه نتيجه يك عبارت يا تابع است) را بهنگام كنيم.
كاربردهاي مشترك ديدها
در اينجا وظايفي كه ديدها ميتوانند اجرا كنند، آمده است:
s تهيه امكانات امنيتي براي كاربر
s تبديل بين واحدها
s ساده كردن و ساخت پرس و جوهاي پيچيده
s خلاصه نمودن دادهها از چندين جدول
ايجاد امنيت با استفاده از ديدها
امروزه تمام سيستمهاي پايگاههاي دادهاي داراي مجموعه كاملي از امكانات امنيتي هستند. كاربران سيستم پايگاه دادهاي معمولاً بسته به راهي كه آنها از پايگاه دادهاي استفاده ميكنند به گروههايي تقسيم ميشوند.
معموليترين نوع اين گروهها اداره كنندگان پايگاه دادهاي، طراحان پايگاه دادهاي، اشخاص وارد كننده اطلاعات و كاربران معمولي ميباشند. اين گروههاي كاربران داراي درجات مختلفي از حق دسترسي به پايگاه دادهاي ميباشند. اداره كننده پايگاه دادهاي احتمالا داراي بيشترين و كاملترين كنترل روي سيستم پايگاه دادهاي است. مثل حق DELETE, INSERT, UPDATE و ALTER در پايگاه دادهاي. كاربران عمومي ممكن است فقط امكان و حق اجراي دستور SELECT را داشته باشند و شايد بتوانند دادهها را از جدول خاصي انتخاب كنند. ديدها در اين حالت براي كنترل اطلاعاتي كه كاربران ميخواهند به آن دسترسي داشته باشند، استفاده ميشوند.
استفاده از ديدها براي تبديل واحدها
ديدها همچنين براي مواقعي سودمند هستند كه ما نياز داريم برخي از دادههاي پايگاه دادهاي را به شكلي متفاوت از دادههاي جدولهاي اصلي نمايش دهيم. مثلاً اگر فيلد amount واقعاً براي ذخيره سازي دلار آمريكا بكار ميرود و نخواهيم كه كاربران كانادايي هر بار مجبور به تبديل پولشان از طريق محاسبه جمعم amount به پول كانادايي باشند، ميتوانيم ديد جديدي بدين منظور ايجاد نماييم.
سادهسازي پرس و جوهاي پيچيده با استفاده از ديدها
ديدها همچنين در مواقعي كه نياز به اجراي چندين پرسوجو داريم، مفيد ميباشند. در اين حالت بعد از اينكه پرسوجوها به ديدهايي تقسيم ميشوند، پرس و جوي نهايي نسبتاً ساده ميباشد؛ همچنين ميتوانيم از ديدهاي جداگانه در مواقعي كه لازم است دوباره استفاده كنيم.
توجه ـ هر وقت در تعريف يك ديد از توابع استفاده ميكنيم، بايد يك نام مستعار براي ستون انتخاب كنيم زيرا هر قلم انتخاب شده يك ستون مجازي در يك جدول مجازي خواهد شد. يك ستون در يك جدول يا يك ديد نميتواند از نحوه نگارش يك تابع استفاده كند.
حذف ديدها با استفاده از جمله DROP VIEW
دستور DROP VIEW يك ديد را از پايگاه دادهاي حذف ميكند. حذف ديد تأثيري در جدول يا جداولي كه اين ديد از روي آنها ساخته شده است، نميگذارد. نحوه نگارش به شكل زير است:
تنها چيزي را كه هنگام حذف يك ديد با استفاده از دستور DROP VIEW بايد درنظر داشته باشيم آن است كه تمام ديدهاي ديگري كه به اين ديد مراجعه ميكنند نامعتبر ميگردند.کد:DROP VIEW view – name
توجه ـ يك ديد ميتواند حذف شود بدون آنكه جدول اصلي تغيير كند و اين مطلب به اين موضوع اشاره ميكند كه چرا ما به ديدها جداول مجازي ميگوييم.
اتصال جداول
يكي از مهمترين و قويترين مشخصههاي SQL، توانايي جمع كردن و پردازش دادهها از طريق جداول مختلف است.
جمله JOIN در SQL اين امكان را به ما ميدهد تا به جاي جداول بزرگ، جداول كوچكتر اختصاصيتري كه نگهداري آنها آسانتر از جداول بزرگ ميباشد، طراحي كنيم.
اتصال جدولها به شرط تساوي
اين اتصال با استفاده از دستور SELECT ايجاد ميشود. هدف از اين اتصال، جور كردن مقادير يك ستون با مقادير ستوني قرينه از جدول ديگر ميباشد. همچنين ميتوانيم خروجي را نيز از طريق گذاشتن شروط بيشتر در شبه جمله WHERE مشروطتر نماييم.
مثــال/
با استفاده از مثــال فوق، كساني كه سفارش پرينتر دادهاند، مشخص ميشوند.کد:SELECT Employees. Name FROM Employees, Orders WHERE Employees. Employee – ID = Orders. Employee – ID AND Orders. Product = ‘Printer’
تذكر ـ اگر دو يا چند جدول را بدون استفاده از شبه جمله WHERE انتخاب كنيم در واقع اتصال كارتزين را اجرا نمودهايم. اين اتصال تمام رديفهاي تمام جداول جلوي شبه جمله FROM را با يكديگر تركيب ميكند. اگر هر جدول 200 رديف داشته باشد، در جدول جواب 40000 رديف (200 * 200) خواهيم داشت. بنابراين هميشه جداول را در شبه جمله WHERE اتصال ميدهيم مگر اينكه واقعاً نياز به اتصال تمام رديفهاي انتخابي داشته باشيم.
اتصال جدولها به شرط عدم تساوي
SQL امكان اتصال جدولها را به شرط عدم تساوي نيز دارد. در اين حالت به جاي علامت مساوي (=) از علامت نامساوي استفاده ميكند. در دنياي واقعي نيز اتصال به شرط تساوي از اتصال به شرط غير تساوي متدوالتر و مرسومتر است ولي به هرحال ممكن است با شرايطي مواجه شويم كه كاربرد موردنظر ما نتايج بهتري را با اتصال به شرط غير تساوي ايجاد كند.