راهنمای جامع Plan Cache Commands و DMVs در SQL Server | آموزش تخصصی SQL Server

راهنمای جامع Plan Cache Commands و DMVs در SQL Server

توسط admin | گروه SQL Server | 1405/05/09

نظرات 0

راهنمای جامع Plan Cache Commands و DMVs در SQL Server

مقدمه و دامنه این خانواده

راهنمای جامع Plan Cache Commands و DMVs در SQL Server یک نقشه جامع برای شناخت، مقایسه و انتخاب درست 13 موضوع مرتبط با Plan Cache Commands and DMVs است. اعضای این خانواده از ابزارهای مانیتورینگ و Configuration تا Commandهای عملیاتی را پوشش می‌دهند و هرکدام Scope، Permission و ریسک متفاوتی دارند.

این راهنما برای DBA، Database Developer و مهندس Performance نوشته شده است. پیش‌نیاز، آشنایی با SQL Server Engine، DMVs، Query Store، Plan Cache و اصول Change Management است.

پس از مطالعه می‌توانید اعضای مجموعه را بر اساس هدف، خروجی، ریسک Production و مسیر Rollback دسته‌بندی کنید و برای هر موضوع به مقاله مستقل آن بروید.

دسترسی سریع

  1. تعریف خانواده و معماری
  2. دسته‌بندی اعضا
  3. جدول مقایسه تصمیم‌محور
  4. شش مثال ترکیبی
  5. سناریوهای واقعی و Performance
  6. FAQ، مصاحبه و چک‌لیست

تعریف مجموعه و جایگاه آن در SQL Server

این خانواده شامل 13 عضو است که در چرخه مشاهده State، تحلیل Evidence، اجرای Change و کنترل نتیجه استفاده می‌شوند. تصمیم درست زمانی شکل می‌گیرد که عضو مناسب با Scope مناسب انتخاب شود؛ برای مثال ابزار تشخیصی نباید به‌جای اقدام اصلاحی و Command پاک‌سازی نباید به‌جای Root Cause Analysis استفاده شود.

محورهای مشترک خانواده عبارت‌اند از cacheobjtype، objtype، usecounts، size_in_bytes، plan_handle، Plan Cache، total_worker_time، total_logical_reads. هر عضو فقط بخشی از این زنجیره را پوشش می‌دهد و ترکیب آن‌ها باید بر اساس Runbook و Baseline انجام شود.

نقشه مفهومی و جایگاه: راهنمای جامع Plan Cache Commands و DMVs در SQL Serverنمای فنی اختصاصی راهنمای جامع Plan Cache Commands و DMVs در SQL Server با برچسب‌های cacheobjtype, objtype, usecounts, size_in_bytes, plan_handleنقشه مفهومی و جایگاهراهنمای جامع Plan Cache Commands و DMVs در SQL Servercacheobjtypeobjtypeusecountssize_in_bytessize_in_bytesplan_handlePlan Cache

این تصویر جایگاه راهنمای جامع Plan Cache Commands و DMVs در SQL Server را میان اجزای مرتبط نشان می‌دهد و مشخص می‌کند cacheobjtype چگونه به objtype و usecounts متصل می‌شود.

دسته‌بندی و معرفی اعضای خانواده

sys.dm_exec_cached_plans

مشاهده Cache Entryهای Plan Cache و تحلیل نوع Object، اندازه Plan و تعداد استفاده مجدد

ریسک یا محدودیت اصلی: خواندن این DMV کم‌خطر است، اما تفسیر حجم Cache بدون درنظرگرفتن Memory Pressure می‌تواند نتیجه اشتباه ایجاد کند.

sys.dm_exec_query_stats

تحلیل آمار تجمعی Queryهای Cacheشده شامل CPU، Reads، Writes، Duration و Execution Count

ریسک یا محدودیت اصلی: آمار این DMV با Eviction یا Restart از بین می‌رود و Snapshot دائمی محسوب نمی‌شود.

sys.dm_exec_plan_attributes

استخراج Attributeهای یک Plan Handle مانند dbid، set_options و Cache Keyهای مؤثر بر Reuse

ریسک یا محدودیت اصلی: برای هر Plan باید با APPLY فراخوانی شود و بررسی تعداد زیاد Planها می‌تواند هزینه مانیتورینگ را افزایش دهد.

sys.dm_exec_cached_plan_dependent_objects

مشاهده Objectهای وابسته به یک Cached Plan و بررسی Cursor یا ساختارهای داخلی مرتبط

ریسک یا محدودیت اصلی: این DMV به Plan Handle معتبر وابسته است و روی نسخه‌ها یا انواع Plan مختلف خروجی یکسانی ندارد.

sys.dm_os_memory_cache_counters

تحلیل Counterهای Memory Cache در سطح Instance و تشخیص رشد Cacheهای داخلی SQL Server

ریسک یا محدودیت اصلی: مقایسه مقادیر باید در بازه زمانی انجام شود؛ یک Snapshot منفرد برای تشخیص Memory Leak کافی نیست.

DBCC PROCCACHE

نمایش Summary مربوط به Procedure Cache و توزیع Cache بر اساس نوع Plan

ریسک یا محدودیت اصلی: فرمان تشخیصی است، اما خروجی آن محدودتر از DMVs جدید است و برای تحلیل عمیق باید با DMVها تکمیل شود.

DBCC FREEPROCCACHE

پاک‌سازی کل Plan Cache برای Test کنترل‌شده و بررسی اثر Compile مجدد Queryها

ریسک یا محدودیت اصلی: اجرای سراسری روی Production می‌تواند موج Compile و افزایش CPU ایجاد کند؛ فقط با Change Plan و Scope روشن اجرا شود.

DBCC FREEPROCCACHE(plan_handle)

حذف هدفمند یک Plan مشخص از Cache با استفاده از plan_handle

ریسک یا محدودیت اصلی: Handle باید دقیق و متعلق به همان Instance باشد؛ پس از Eviction ممکن است فوراً نامعتبر شود.

DBCC FREEPROCCACHE(sql_handle)

حذف Planهای مرتبط با یک sql_handle برای Recompile هدفمند Batch

ریسک یا محدودیت اصلی: sql_handle ممکن است چند Statement یا Plan مرتبط را پوشش دهد؛ Scope اثر باید پیش از اجرا بررسی شود.

ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE

پاک‌سازی Procedure Cache فقط برای Database جاری یا Database مشخص بدون اثر مستقیم بر سایر Databaseها

ریسک یا محدودیت اصلی: با وجود Scope محدودتر، باز هم Compile مجدد Queryهای همان Database می‌تواند CPU و Latency را افزایش دهد.

sp_recompile

علامت‌گذاری Stored Procedure، Trigger یا Table برای Compile مجدد در اجرای بعدی

ریسک یا محدودیت اصلی: استفاده مکرر می‌تواند Compile Overhead ایجاد کند و جایگزین رفع Root Cause نیست.

Stored Procedure WITH RECOMPILE

ساخت Stored Procedure با گزینه WITH RECOMPILE برای تولید Plan جدید در هر اجرا

ریسک یا محدودیت اصلی: برای Procedureهای پرتکرار هزینه Compile ممکن است از مزیت Plan اختصاصی بیشتر شود.

EXECUTE ... WITH RECOMPILE

اجرای موردی Stored Procedure با WITH RECOMPILE بدون تغییر دائمی تعریف Procedure

ریسک یا محدودیت اصلی: این روش باید برای مورد خاص استفاده شود و اگر دائماً لازم است طراحی Query یا Plan Strategy باید بازنگری شود.

جدول مقایسه تصمیم‌محور

موضوع یا Commandکاربرد اصلیخروجی یا نکته مهممسیر آموزش
sys.dm_exec_cached_plansمشاهده Cache Entryهای Plan Cache و تحلیل نوع Object، اندازه Plan و تعداد استفاده مجددcacheobjtypeمقاله مستقل
sys.dm_exec_query_statsتحلیل آمار تجمعی Queryهای Cacheشده شامل CPU، Reads، Writes، Duration و Execution Counttotal_worker_timeمقاله مستقل
sys.dm_exec_plan_attributesاستخراج Attributeهای یک Plan Handle مانند dbid، set_options و Cache Keyهای مؤثر بر Reuseplan_handleمقاله مستقل
sys.dm_exec_cached_plan_dependent_objectsمشاهده Objectهای وابسته به یک Cached Plan و بررسی Cursor یا ساختارهای داخلی مرتبطplan_handleمقاله مستقل
sys.dm_os_memory_cache_countersتحلیل Counterهای Memory Cache در سطح Instance و تشخیص رشد Cacheهای داخلی SQL Servernameمقاله مستقل
DBCC PROCCACHEنمایش Summary مربوط به Procedure Cache و توزیع Cache بر اساس نوع PlanDBCC PROCCACHEمقاله مستقل
DBCC FREEPROCCACHEپاک‌سازی کل Plan Cache برای Test کنترل‌شده و بررسی اثر Compile مجدد QueryهاDBCC FREEPROCCACHEمقاله مستقل
DBCC FREEPROCCACHE(plan_handle)حذف هدفمند یک Plan مشخص از Cache با استفاده از plan_handleplan_handleمقاله مستقل
DBCC FREEPROCCACHE(sql_handle)حذف Planهای مرتبط با یک sql_handle برای Recompile هدفمند Batchsql_handleمقاله مستقل
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHEپاک‌سازی Procedure Cache فقط برای Database جاری یا Database مشخص بدون اثر مستقیم بر سایر DatabaseهاDATABASE SCOPED CONFIGURATIONمقاله مستقل
sp_recompileعلامت‌گذاری Stored Procedure، Trigger یا Table برای Compile مجدد در اجرای بعدیsp_recompileمقاله مستقل
Stored Procedure WITH RECOMPILEساخت Stored Procedure با گزینه WITH RECOMPILE برای تولید Plan جدید در هر اجراWITH RECOMPILEمقاله مستقل
EXECUTE ... WITH RECOMPILEاجرای موردی Stored Procedure با WITH RECOMPILE بدون تغییر دائمی تعریف ProcedureEXECUTE WITH RECOMPILEمقاله مستقل

منطق انتخاب و گردش‌کار خانواده

گردش‌کار پیشنهادی با Capture State شروع می‌شود، سپس Evidence در بازه زمانی تحلیل، Change با Scope محدود اجرا و نتیجه با Metricهای Before/After کنترل می‌شود. اگر نتیجه نامطلوب بود، Rollback یا توقف مرحله بعد باید بدون تأخیر انجام شود.

در این خانواده، تفاوت میان Desired State و Actual State مهم است. وجود Configuration به‌تنهایی موفقیت را ثابت نمی‌کند؛ Engine ممکن است به‌دلیل Storage، Permission، Compile Pressure یا محدودیت نسخه به State دیگری برود.

جریان اجرا و داده: راهنمای جامع Plan Cache Commands و DMVs در SQL Serverنمای فنی اختصاصی راهنمای جامع Plan Cache Commands و DMVs در SQL Server با برچسب‌های cacheobjtype, objtype, usecounts, size_in_bytes, plan_handleجریان اجرا و دادهراهنمای جامع Plan Cache Commands و DMVs در SQL Serverراهنمای جامع Plan Cache Commcacheobjtypeobjtypeusecountssize_in_bytesplan_handle

این جریان، مسیر واقعی از ورودی و State اولیه تا نتیجه قابل‌مشاهده در راهنمای جامع Plan Cache Commands و DMVs در SQL Server را نمایش می‌دهد؛ نقاط کنترل cacheobjtype، objtype و size_in_bytes در آن برجسته شده‌اند.

مثال‌های ترکیبی خانواده

مثال ترکیبی 1: اندازه Plan Cache

این مثال ترکیبی نشان می‌دهد اعضای خانواده چگونه برای سناریوی اندازه Plan Cache کنار هم قرار می‌گیرند.

SELECT COUNT_BIG(*) AS cached_plans, SUM(CONVERT(bigint,size_in_bytes))/1024 AS cache_kb FROM sys.dm_exec_cached_plans;
خروجیتفسیر
مرحلهاندازه Plan Cache
خروجیsys.dm_exec_cached_plans

نکته فنی: خروجی را در Repository زمان‌دار ذخیره و با SLA و Baseline مقایسه کنید.

مثال ترکیبی 2: Top CPU Query

این مثال ترکیبی نشان می‌دهد اعضای خانواده چگونه برای سناریوی Top CPU Query کنار هم قرار می‌گیرند.

SELECT TOP (10) qs.total_worker_time, qs.execution_count, st.text FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st ORDER BY qs.total_worker_time DESC;
خروجیتفسیر
مرحلهTop CPU Query
خروجیsys.dm_exec_query_stats

نکته فنی: خروجی را در Repository زمان‌دار ذخیره و با SLA و Baseline مقایسه کنید.

مثال ترکیبی 3: Plan Attributes

این مثال ترکیبی نشان می‌دهد اعضای خانواده چگونه برای سناریوی Plan Attributes کنار هم قرار می‌گیرند.

SELECT TOP (20) cp.plan_handle, pa.attribute, pa.value FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_plan_attributes(cp.plan_handle) AS pa WHERE pa.is_cache_key = 1;
خروجیتفسیر
مرحلهPlan Attributes
خروجیsys.dm_exec_plan_attributes

نکته فنی: خروجی را در Repository زمان‌دار ذخیره و با SLA و Baseline مقایسه کنید.

مثال ترکیبی 4: Memory Cache Counters

این مثال ترکیبی نشان می‌دهد اعضای خانواده چگونه برای سناریوی Memory Cache Counters کنار هم قرار می‌گیرند.

SELECT name, type, pages_kb, entries_count FROM sys.dm_os_memory_cache_counters ORDER BY pages_kb DESC;
خروجیتفسیر
مرحلهMemory Cache Counters
خروجیsys.dm_exec_cached_plan_dependent_objects

نکته فنی: خروجی را در Repository زمان‌دار ذخیره و با SLA و Baseline مقایسه کنید.

مثال ترکیبی 5: Procedure Cache Summary

این مثال ترکیبی نشان می‌دهد اعضای خانواده چگونه برای سناریوی Procedure Cache Summary کنار هم قرار می‌گیرند.

DBCC PROCCACHE WITH NO_INFOMSGS;
خروجیتفسیر
مرحلهProcedure Cache Summary
خروجیsys.dm_os_memory_cache_counters

نکته فنی: خروجی را در Repository زمان‌دار ذخیره و با SLA و Baseline مقایسه کنید.

مثال ترکیبی 6: Recompile هدفمند

این مثال ترکیبی نشان می‌دهد اعضای خانواده چگونه برای سناریوی Recompile هدفمند کنار هم قرار می‌گیرند.

EXEC sys.sp_recompile N'dbo.ProcedureName';
خروجیتفسیر
مرحلهRecompile هدفمند
خروجیDBCC PROCCACHE

نکته فنی: خروجی را در Repository زمان‌دار ذخیره و با SLA و Baseline مقایسه کنید.

سناریوهای واقعی در محیط سازمانی

در Incident Performance، تیم ابتدا باید زمان شروع، Databaseهای درگیر، Queryهای غالب و تغییرات اخیر را مشخص کند. سپس عضو مناسب این خانواده برای مشاهده State انتخاب می‌شود. اجرای Command تغییردهنده پیش از ثبت Evidence، امکان Root Cause Analysis را کاهش می‌دهد.

برای Capacity Planning، Snapshotهای زمان‌دار از Counterها، Query Store و Cache جمع‌آوری می‌شود. Trendهای هفتگی و ماهانه باید کنار Release Calendar و Peak Load قرار بگیرند تا رشد طبیعی از Regression جدا شود.

در Change Window، Owner فنی باید معیار موفقیت، Threshold توقف، زمان مشاهده و دستور Rollback را بنویسد. این ساختار خطای انسانی را کم می‌کند و انتقال دانش میان شیفت‌ها را ساده‌تر می‌سازد.

هشدار مهم خانواده

بعضی اعضای Plan Cache Commands and DMVs فقط تشخیصی‌اند و بعضی State یا Cache را تغییر می‌دهند. اجرای مورد تغییردهنده روی Production بدون Baseline، Approval و Monitoring می‌تواند CPU، I/O یا Latency را افزایش دهد.

اشتباهات رایج

  1. یکسان‌دانستن Scope همه اعضای خانواده؛ بعضی Database-level و بعضی Instance-level هستند.
  2. اجرای Command پاک‌سازی برای هر مشکل Performance بدون اثبات Plan یا Cache Root Cause.
  3. نادیده‌گرفتن Restart، Eviction، Cleanup و Reset Condition در تحلیل Counterها.
  4. گرفتن Snapshot بدون Timestamp، Login، Version و Database Context.
  5. تکرار Change موفق قبلی روی Workload جدید بدون بازآزمایی.

Performance Considerations

مانیتورینگ پرتکرار با خروجی بزرگ می‌تواند خود Overhead بسازد. Queryهای Collector باید ستون‌های ضروری، Filter روشن و Interval متناسب داشته باشند. Changeهای Cache یا Configuration نیز باید Compile، Memory، I/O و Latency را هم‌زمان پایش کنند.

برای Repository داخلی، Partitioning یا Retention مناسب، Index روی زمان Capture و شناسه‌های Query یا Plan و Compression می‌تواند هزینه نگهداری History را کنترل کند. Retention بسیار کوتاه Baseline را از بین می‌برد و Retention بسیار بلند بدون Capacity Plan Storage را افزایش می‌دهد.

Best Practices خانواده

  1. هر عضو را بر اساس TopicType و Scope مستند کنید.
  2. Diagnostic Query را از Change Command جدا نگه دارید.
  3. Baseline و معیار موفقیت را پیش از اجرا ثبت کنید.
  4. برای Production از Canary، Change Window و Threshold توقف استفاده کنید.
  5. داده‌های تاریخی را با Reset Condition و Version تفسیر کنید.
  6. پس از Incident، Runbook را با Evidence واقعی به‌روزرسانی کنید.
تصمیم Performance و Best Practices: راهنمای جامع Plan Cache Commands و DMVs در SQL Serverنمای فنی اختصاصی راهنمای جامع Plan Cache Commands و DMVs در SQL Server با برچسب‌های cacheobjtype, objtype, usecounts, size_in_bytes, plan_handleتصمیم Performance و Best Practicesراهنمای جامع Plan Cache Commands و DMVs در SQL Servercacheobjtypeobjtypeusecountssize_in_bytesplan_handlePlan Cache

این پنل تصمیم نشان می‌دهد در سناریوی راهنمای جامع Plan Cache Commands و DMVs در SQL Server چه زمانی مسیر پیشنهادی انتخاب شود، کجا Overhead یا ریسک افزایش می‌یابد و چگونه cacheobjtype با plan_handle سنجیده شود.

سؤالات متداول

راهنمای جامع Plan Cache Commands و DMVs در SQL Server دقیقاً چه مسئله‌ای را حل می‌کند؟

مسئله اصلی، شناخت، مقایسه و انتخاب درست 13 موضوع مرتبط با Plan Cache Commands and DMVs است. ارزش واقعی زمانی ایجاد می‌شود که خروجی با Baseline و Context درست تفسیر شود.

برای شروع کار با راهنمای جامع Plan Cache Commands و DMVs در SQL Server چه پیش‌نیازی لازم است؟

دسترسی مناسب، شناخت Scope، ثبت State اولیه و آشنایی با cacheobjtype و objtype ضروری است.

آیا استفاده از راهنمای جامع Plan Cache Commands و DMVs در SQL Server هزینه زیرساخت را کاهش می‌دهد؟

در صورت استفاده هدفمند، می‌تواند هزینه ناشی از CPU، I/O، Incident و زمان عیب‌یابی را کاهش دهد؛ نتیجه باید با Metric مالی و فنی سنجیده شود.

این موضوع برای پروژه‌های سازمانی چه ارزشی دارد؟

در پروژه سازمانی، استانداردسازی cacheobjtype و usecounts باعث Audit بهتر، تصمیم سریع‌تر و کاهش ریسک Change می‌شود.

راهنمای جامع Plan Cache Commands و DMVs در SQL Server با روش‌های جایگزین چه تفاوتی دارد؟

تفاوت اصلی در Scope، میزان جزئیات، اثر عملیاتی و قابلیت بازگشت است؛ انتخاب باید بر اساس سناریو باشد نه محبوبیت ابزار.

برای پیاده‌سازی حرفه‌ای راهنمای جامع Plan Cache Commands و DMVs در SQL Server می‌توان از خدمات تخصصی استفاده کرد؟

بله، آموزش، مشاوره، طراحی Runbook و اجرای پروژه SQL Server می‌تواند متناسب با Workload و محدودیت سازمان انجام شود.

رایج‌ترین خطا در استفاده از راهنمای جامع Plan Cache Commands و DMVs در SQL Server چیست؟

رایج‌ترین خطا، اقدام بدون Baseline و تفسیر جداگانه cacheobjtype بدون توجه به size_in_bytes است.

راهنمای جامع Plan Cache Commands و DMVs در SQL Server چه اثری بر Performance دارد؟

اثر به نرخ اجرا، Scope و Workload وابسته است. CPU، Logical Reads، Compile، Blocking و Latency باید هم‌زمان بررسی شوند.

Best Practice اصلی برای راهنمای جامع Plan Cache Commands و DMVs در SQL Server چیست؟

با Scope کوچک شروع کنید، State را ثبت کنید، معیار موفقیت تعریف کنید و پس از تغییر، objtype و plan_handle را دوباره اندازه بگیرید.

آیا راهنمای جامع Plan Cache Commands و DMVs در SQL Server در همه نسخه‌های SQL Server یکسان است؟

خیر. Availability گزینه‌ها، Permissionها، ستون‌ها و رفتار ممکن است با Version، Edition و Compatibility Level تفاوت داشته باشد؛ محیط هدف را مستقیماً بررسی کنید.

سؤالات مصاحبه

  1. چگونه Scope و Reset Condition مربوط به راهنمای جامع Plan Cache Commands و DMVs در SQL Server را توضیح می‌دهید؟
  2. برای اندازه‌گیری اثر راهنمای جامع Plan Cache Commands و DMVs در SQL Server چه Baseline و Metricهایی انتخاب می‌کنید؟
  3. تفاوت Diagnostic Action و Change Action در این موضوع چیست؟
  4. اگر cacheobjtype بهتر ولی objtype بدتر شود، تصمیم شما چیست؟
  5. چه Rollback Plan و Audit Trail برای استفاده از راهنمای جامع Plan Cache Commands و DMVs در SQL Server تعریف می‌کنید؟

چک‌لیست نهایی خانواده

  1. تعداد 13 عضو خانواده و Scope هرکدام را تأیید کنید.
  2. Permission و Version محیط هدف را بررسی کنید.
  3. Collector Query و Change Command را در Runbook جدا کنید.
  4. Baseline CPU، I/O، Latency، Compile و Blocking را ذخیره کنید.
  5. Change را مرحله‌ای اجرا و State واقعی را دوباره بخوانید.
  6. مقصد هر مقاله مستقل را برای مطالعه جزئیات مشخص کنید.
  7. نتیجه و Rollback را در Ticket ثبت کنید.

جمع‌بندی

راهنمای جامع Plan Cache Commands و DMVs در SQL Server زمانی بیشترین ارزش را دارد که اعضای آن به‌عنوان یک Workflow دیده شوند، نه مجموعه‌ای از Commandهای جدا. انتخاب عضو مناسب، ثبت Evidence و کنترل اثر، سه ستون اصلی تصمیم درست هستند.

برای ادامه، مقاله مستقل هر عضو را از بخش معرفی مطالعه کنید و فقط Query یا Command متناسب با Scope و ریسک محیط خود را وارد Runbook کنید.

خدمات برنامه‌نویسی و پایگاه داده

برنامه‌نویسی در اصفهان؛ قبول سفارش‌های برنامه‌نویسی و پایگاه داده با شماره 09131253620.

انجام پروژه، آموزش برنامه‌نویسی و آموزش SQL Server توسط مجموعه‌ای معتبر با سابقه فعالیت حرفه‌ای از سال ۱۳۷۵ شمسی تاکنون.

برای سفارش پروژه‌های برنامه‌نویسی، پایگاه داده، سیستم‌های تحت وب و راهکارهای نرم‌افزاری با 09131253620 تماس بگیرید؛ ایتا، واتساپ و تماس مستقیم در دسترس است.

تماس با ما

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر