PDA

View Full Version : گفتگو: ملاحظات کارایی در قیود و تریگرها هنگام درج داده



mojtaba.baghban
شنبه 28 شهریور 1388, 12:05 عصر
چیزهایی که در پایین می آید صرفا نظر شخصی بنده است خوشحال می شوم نظر شما را هم بدانم
برای چک کردن ورور اطلاعات در جدول 3 راه وجود دارد قیود چک،تریگرهای after و تریگرهای instead of اگر عملیات rollback نشود برای هر یک از این روشها چه اتفاقی می افتد
قیود چک: ابتدا داده ها وارد جدول می شود(بر خلاف تصور که فکر می شود قیود قبل از ورود اطلاعات داده را چک می کند) سپس داده ها چک می شوند
تریگرهای after: ابتدا داده ها وارد جدول اصلی و inserted می شوند سپس داده هی چک می شوند
تریگرهای instead of: ابتدا داده ها وارد جدول inserted می شوند سپس داده ها چک می شوند و سپس وارد جدول اصلی می شوند.
به نظر میرسد که اگر عملیات rollback نشود قیود سرعت بیشتری دارند.
حال اگر داده ها rollback شوند چه اتفاقی می افتد
قیود چک: ابتدا داده ها وارد جدول می شود سپس داده ها چک می شوند و سپس عملیات rollback میشود.
تریگرهای after: ابتدا داده ها وارد جدول اصلی و inserted می شوند سپس داده هی چک می شوند و سپس عملیات rollback میشود.
تریگرهای instead of: ابتدا داده ها وارد جدول inserted می شوند سپس داده ها چک می شوند
ه نظر میرسد که اگر عملیات rollback شود تریگرهای instead of سرعت بیشتری دارند.

محمد سلیم آبادی
شنبه 28 شهریور 1388, 12:43 عصر
در واقع یکی از تفاوت های اصلی قید با تریگر این است که قید از نوع DDL است و تریگر از نوع DML.
برای اطلاعات بیشتر توصیه می کنم مقاله آیا Joe CELKO را در سایت Simple-talk که مربوط به Constraint Yourself! است را مطالعه کنید.

اول از همه منظورتان از قیود چک چیه؟ یعنی CHECK() Constraint یا هر بررسی از PK , FK , Unique Key و ...
دوم اینکه آیا trigger کار چک کردن را انجام می دهد؟ یا اینکه مکانیزم چک کردن را خودمان باید طراحی کنیم؟ مثلا اگر بخواهیم خودمان مکانیزم کلید خارجی را با trigger طراحی کنیم آیا عمل cascade هم به سادگی قابل پیاده سازی است؟

موفق باشید.

mojtaba.baghban
شنبه 28 شهریور 1388, 13:23 عصر
ول از همه منظورتان از قیود چک چیه؟ یعنی CHECK() Constraint یا هر بررسی از PK , FK , Unique Key و ...
منظورم از قیود چک همان constraint check() است

trigger کار چک کردن را انجام می دهد؟ یا اینکه مکانیزم چک کردن را خودمان باید طراحی کنیم؟ مثلا اگر بخواهیم خودمان مکانیزم کلید خارجی را با trigger طراحی کنیم آیا عمل cascade هم به سادگی قابل پیاده سازی است
با دیگر قیود مانند unique,FK,PK,... کاری ندارم

در واقع یکی از تفاوت های اصلی قید با تریگر این است که قید از نوع DDL است و تریگر از نوع DML.
تریگر از نوع DDL نیز وجود دارد

محمد سلیم آبادی
شنبه 28 شهریور 1388, 13:43 عصر
به هر حال اختلاف های قابل توجهی از نظر مکانیزم و ساختار بین این دو مقوله (تریگر و check) وجود دارد به طور مثال
در check() constraint ما نمی توانیم از subquery استفاده کنیم.
یکی از تفاوت های بین دستورات DML و DDL این است که مقدار نامعلوم (Unknown) برای DDL مقدار TRUE است ولی برای DML مقدار FALSE است.

محمد سلیم آبادی
شنبه 28 شهریور 1388, 14:00 عصر
ِتریگر از نوع DDL هم وجود دارد
بله وجود دارد، ولی فکر کنم برای درج و بروزرسانی سطرهای جدول مورد استفاده قرار نمی گیرد، با این نمونه کار نکردم ولی باید مربوط به Alter و Create و Drop باشد ولا غیر.

mojtaba.baghban
شنبه 28 شهریور 1388, 14:03 عصر
در صورتیکه بتوان از هر سه روش استفاده کرد کدام را ترجیح می دهید و به چه دلیل؟

محمد سلیم آبادی
شنبه 28 شهریور 1388, 14:11 عصر
روش استفاده از CHECK را ترجیه می دهم به دلایل زیر:
فهمیدن محدودیت های داده جدول به سادگی صورت خواهد گرفت چون با مشاهده ی دستورات ساخت جدول به موضوع پی می بریم.
بررسی و چک کردن مقادیر جدول برای جامعیت اطلاعات به نظر من به نرمال سازی بانک مرتبط است و نرمالسازی هم به جدول و در نتیجه از CHECK استفاده خواهم کرد.
اگر بخواهم تنها جدولم را منتقل کنم نیازی ندارم که trigger های مربوط به آن هم منتقل کنم در واقع یک بار یک جا و برای همیشه این قید را خواهم گذاشت
و برای بررسی هم در سطح Application از ابزار های validation استفاده خواهم کرد.

و همچنین از after trigger برای چک کردن داده ها استفاده نمی کنم.
موقعی از after trigger استفاده می کنم که باید در هر حالتی یک عملیاتی انجام شود مثلا update یک جدول.

و از روش جایگزین Instead of trigger برای قید چک استفاده می کنم.