آموزش جامع تابع STATS_DATE در SQL Server با ۱۰ مثال عملی
در بسیاری از اسکریپتهای مدیریتی، عدد یا نام خام بهتنهایی برای تصمیمگیری کافی نیست و باید به Metadata قابل فهم تبدیل شود. در این مقاله، STATS_DATE از سطح مقدماتی تا سناریوهای حرفهای بررسی میشود و هر مثال با خروجی نمونه ارائه شده است.
این تابع برای شناسایی آمار قدیمی، برنامهریزی UPDATE STATISTICS و تحلیل انتخاب Plan نامناسب بسیار کاربردی است. تمرکز آموزش بر این است که STATS_DATE در چه Contextی اجرا شود، نتیجه آن چگونه تفسیر شود و چه زمانی باید از یک DMV یا کاتالوگویوی جایگزین کمک گرفت.
برای مشاهده جایگاه STATS_DATE میان سایر توابع و شمارندهها، راهنمای جامع توابع کمکی کارایی و Metadata در SQL Server را نیز مطالعه کنید.
تعریف و کاربرد اصلی STATS_DATE
تابع STATS_DATE تاریخ و زمان آخرین بهروزرسانی Statistics مشخص روی یک جدول یا View ایندکسشده را برمیگرداند. این تعریف در ظاهر کوتاه است، اما استفاده درست از STATS_DATE به درک مفاهیمی مانند statistics، last updated و sys.stats وابسته است.
قاعده عملی STATS_DATE: ابتدا ورودی و Context را معتبر کنید، سپس خروجی را با نوع داده و معنای واقعی آن تفسیر کنید.
Syntax تابع یا متغیر STATS_DATE
SELECT STATS_DATE ( object_id , stats_id ) AS Result;
پارامترهای STATS_DATE
| پارامتر | توضیح |
|---|
| object_id | شناسه شیء مالک Statistics. |
| stats_id | شناسه Statistics از sys.stats. |
نوع خروجی و رفتار NULL در STATS_DATE
datetime یا NULL اگر Statistics هرگز بهروزرسانی نشده، شیء نامعتبر باشد یا Metadata قابل مشاهده نباشد. در کد تولیدی بهتر است نوع مقصد بهصورت صریح تعیین شود؛ زیرا تبدیل ضمنی میتواند مقایسه، مرتبسازی یا ذخیره نتیجه STATS_DATE را مبهم کند.
مفاهیم کلیدی مرتبط با STATS_DATE
- statistics در مبحث STATS_DATE
- last updated
- sys.stats
- cardinality estimation
- query plan
- auto update
- NULL در مبحث STATS_DATE
تصویر نخست، ارتباط STATS_DATE را با مفاهیم اختصاصی statistics، last updated، sys.stats و cardinality estimation نشان میدهد؛ این روابط مبنای انتخاب ورودی و تفسیر خروجی هستند.
سناریوهای واقعی استفاده از STATS_DATE
سناریوی 1 برای STATS_DATE، «گزارش آمار قدیمی» است. در این حالت باید نتیجه همراه Context پایگاه داده، زمان نمونهبرداری و در صورت نیاز شناسه نشست ثبت شود تا داده برای عیبیابی بعدی ارزش داشته باشد.
سناریوی 2 برای STATS_DATE، «عیبیابی Plan» است. در این حالت باید نتیجه همراه Context پایگاه داده، زمان نمونهبرداری و در صورت نیاز شناسه نشست ثبت شود تا داده برای عیبیابی بعدی ارزش داشته باشد.
سناریوی 3 برای STATS_DATE، «اولویتبندی Maintenance» است. در این حالت باید نتیجه همراه Context پایگاه داده، زمان نمونهبرداری و در صورت نیاز شناسه نشست ثبت شود تا داده برای عیبیابی بعدی ارزش داشته باشد.
سناریوی 4 برای STATS_DATE، «کنترل Auto Stats» است. در این حالت باید نتیجه همراه Context پایگاه داده، زمان نمونهبرداری و در صورت نیاز شناسه نشست ثبت شود تا داده برای عیبیابی بعدی ارزش داشته باشد.
مثالهای عملی STATS_DATE از ساده تا حرفهای
مثال 1: زمان آمار یک ایندکس
stats_id ایندکس را برای دریافت تاریخ Update استفاده میکنیم. این سناریو بهطور اختصاصی برای درک رفتار STATS_DATE طراحی شده است.
SELECT STATS_DATE(
OBJECT_ID(N'dbo.Customers'),
1
) AS LastStatsUpdate;
| LastStatsUpdate |
|---|
| 2026-07-24 03:15:22.000 |
stats_id لزوماً همیشه برابر index_id نیست، پس sys.stats را بررسی کنید. هنگام استفاده سازمانی از STATS_DATE، خروجی نمونه را با داده واقعی محیط خود تطبیق دهید.
مثال 2: فهرست آمار جدول
نام و تاریخ همه Statistics جدول هدف را نمایش میدهیم. این سناریو بهطور اختصاصی برای درک رفتار STATS_DATE طراحی شده است.
SELECT s.stats_id,
s.name,
STATS_DATE(s.object_id, s.stats_id) AS LastUpdated
FROM sys.stats AS s
WHERE s.object_id = OBJECT_ID(N'dbo.Customers')
ORDER BY s.stats_id;
| stats_id | name | LastUpdated |
|---|
| 1 | PK_Customers | 2026-07-24 03:15:22.000 |
این گزارش نقطه شروع ممیزی Statistics است. هنگام استفاده سازمانی از STATS_DATE، خروجی نمونه را با داده واقعی محیط خود تطبیق دهید.
مثال 3: شناسایی آمار قدیمی
Statistics قدیمیتر از هفت روز را فیلتر میکنیم. این سناریو بهطور اختصاصی برای درک رفتار STATS_DATE طراحی شده است.
SELECT s.name,
STATS_DATE(s.object_id, s.stats_id) AS LastUpdated
FROM sys.stats AS s
WHERE s.object_id = OBJECT_ID(N'dbo.Customers')
AND STATS_DATE(s.object_id, s.stats_id) < DATEADD(day, -7, GETDATE());
| name | LastUpdated |
|---|
| IX_Customers_City | 2026-07-10 01:00:00.000 |
قدمت زمانی را همراه میزان تغییر داده تفسیر کنید. هنگام استفاده سازمانی از STATS_DATE، خروجی نمونه را با داده واقعی محیط خود تطبیق دهید.
مثال 4: مدیریت آمار بدون تاریخ
NULL را با وضعیت خوانا نمایش میدهیم. این سناریو بهطور اختصاصی برای درک رفتار STATS_DATE طراحی شده است.
SELECT s.name,
CASE
WHEN STATS_DATE(s.object_id, s.stats_id) IS NULL
THEN N'هنوز تاریخ قابل گزارش نیست'
ELSE CONVERT(nvarchar(30), STATS_DATE(s.object_id, s.stats_id), 121)
END AS StatsStatus
FROM sys.stats AS s
WHERE s.object_id = OBJECT_ID(N'dbo.Customers');
| name | StatsStatus |
|---|
| PK_Customers | 2026-07-24 03:15:22.000 |
NULL میتواند ناشی از وضعیت Statistics یا محدودیت Metadata باشد. هنگام استفاده سازمانی از STATS_DATE، خروجی نمونه را با داده واقعی محیط خود تطبیق دهید.
تصویر دوم، جریان اجرای STATS_DATE را از ورودی و اعتبارسنجی تا تولید خروجی نمایش میدهد و نشان میدهد که query plan در کدام مرحله باید کنترل شود.
ادامه مثالهای پیشرفته STATS_DATE
مثال 5: ترکیب با dm_db_stats_properties
تاریخ را با تعداد تغییرات کنار هم میگذاریم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون STATS_DATE است.
SELECT s.name,
STATS_DATE(s.object_id, s.stats_id) AS LastUpdated,
sp.rows,
sp.modification_counter
FROM sys.stats AS s
OUTER APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) AS sp
WHERE s.object_id = OBJECT_ID(N'dbo.Customers');
| name | LastUpdated | rows | modification_counter |
|---|
| IX_Customers_City | 2026-07-10 01:00:00.000 | 250000 | 42000 |
modification_counter تصمیم Update را دقیقتر از سن تنها میکند. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از STATS_DATE جلوگیری میکند.
مثال 6: اولویتبندی Maintenance
آمار را بر اساس تاریخ قدیمیتر مرتب میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون STATS_DATE است.
SELECT TOP (10)
OBJECT_SCHEMA_NAME(s.object_id) AS SchemaName,
OBJECT_NAME(s.object_id) AS TableName,
s.name AS StatsName,
STATS_DATE(s.object_id, s.stats_id) AS LastUpdated
FROM sys.stats AS s
WHERE OBJECTPROPERTY(s.object_id, N'IsUserTable') = 1
ORDER BY STATS_DATE(s.object_id, s.stats_id);
| SchemaName | TableName | StatsName | LastUpdated |
|---|
| dbo | Orders | IX_Orders_Date | 2026-06-20 02:00:00.000 |
در Database بزرگ، Scope را محدود و زمان اجرا را مدیریت کنید. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از STATS_DATE جلوگیری میکند.
مثال 7: مقایسه پیش و پس از Update
زمان قبل و بعد را در یک Batch نمایشی ثبت میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون STATS_DATE است.
DECLARE @Before datetime = STATS_DATE(OBJECT_ID(N'dbo.Customers'), 1);
UPDATE STATISTICS dbo.Customers PK_Customers WITH RESAMPLE;
SELECT @Before AS BeforeUpdate,
STATS_DATE(OBJECT_ID(N'dbo.Customers'), 1) AS AfterUpdate;
| BeforeUpdate | AfterUpdate |
|---|
| 2026-07-20 02:00:00.000 | 2026-07-25 00:20:00.000 |
UPDATE STATISTICS در محیط تولید باید با برنامه و ارزیابی هزینه انجام شود. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از STATS_DATE جلوگیری میکند.
مثال 8: خطای stats_id اشتباه
ورودی نامعتبر را پیش از تصمیمگیری شناسایی میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون STATS_DATE است.
DECLARE @LastUpdated datetime =
STATS_DATE(OBJECT_ID(N'dbo.Customers'), 9999);
SELECT CASE
WHEN @LastUpdated IS NULL THEN N'stats_id نامعتبر یا غیرقابل مشاهده'
ELSE CONVERT(nvarchar(30), @LastUpdated, 121)
END AS Result;
| Result |
|---|
| stats_id نامعتبر یا غیرقابل مشاهده |
NULL علت واحدی ندارد؛ وجود ردیف در sys.stats را بررسی کنید. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از STATS_DATE جلوگیری میکند.
مثال 9: گزارش آمار خودکار
Statistics خودکار را جدا میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون STATS_DATE است.
SELECT s.name,
s.auto_created,
STATS_DATE(s.object_id, s.stats_id) AS LastUpdated
FROM sys.stats AS s
WHERE s.object_id = OBJECT_ID(N'dbo.Customers')
AND s.auto_created = 1;
| name | auto_created | LastUpdated |
|---|
| _WA_Sys_00000004_12345678 | 1 | 2026-07-22 11:10:00.000 |
آمار خودکار نیز ممکن است برای Queryهای مهم حیاتی باشد. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از STATS_DATE جلوگیری میکند.
مثال 10: کاهش هزینه گزارش
بهجای تکرار STATS_DATE، مقدار را یک بار در APPLY محاسبه میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون STATS_DATE است.
SELECT s.name, x.LastUpdated
FROM sys.stats AS s
CROSS APPLY
(
VALUES(STATS_DATE(s.object_id, s.stats_id))
) AS x(LastUpdated)
WHERE s.object_id = OBJECT_ID(N'dbo.Customers')
AND x.LastUpdated < DATEADD(day, -7, GETDATE());
| name | LastUpdated |
|---|
| IX_Customers_City | 2026-07-10 01:00:00.000 |
محاسبه یکباره شرط و خروجی را هماهنگ نگه میدارد. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از STATS_DATE جلوگیری میکند.
خطاهای رایج در کار با STATS_DATE
خطای 1 در استفاده از STATS_DATE
قدیمی بودن زمانی بهتنهایی کافی نیست؛ حجم تغییر داده و حساسیت Query نیز مهم است. برای رفع این مشکل، ورودی و Context را از منبع معتبر بخوانید و نتیجه STATS_DATE را پیش از ادامه منطق با شرط صریح کنترل کنید.
خطای 2 در استفاده از STATS_DATE
برای جزئیات بیشتر از sys.dm_db_stats_properties استفاده کنید. برای رفع این مشکل، ورودی و Context را از منبع معتبر بخوانید و نتیجه STATS_DATE را پیش از ادامه منطق با شرط صریح کنترل کنید.
خطای 3 در استفاده از STATS_DATE
اجرای بیبرنامه UPDATE STATISTICS روی همه اشیا میتواند هزینه I/O و CPU ایجاد کند. برای رفع این مشکل، ورودی و Context را از منبع معتبر بخوانید و نتیجه STATS_DATE را پیش از ادامه منطق با شرط صریح کنترل کنید.
ملاحظات Performance برای STATS_DATE
از نظر کارایی، STATS_DATE زمانی کمهزینه باقی میماند که روی یک مقدار هدفمند یا مجموعه محدود اجرا شود. فراخوانی آن روی هزاران ردیف بدون Predicate اولیه میتواند CPU و زمان گزارش را افزایش دهد.
اگر گزارش به چند Property از چندین شیء نیاز دارد، استفاده Set-based از کاتالوگویو یا DMV مرتبط با statistics معمولاً بهتر از تکرار STATS_DATE برای هر سلول است.
در Jobهای دورهای، نتیجه STATS_DATE را همراه Timestamp ذخیره کنید، اما Frequency نمونهبرداری را متناسب با سرعت تغییر داده انتخاب کنید. جمعآوری بیش از حد، جدول تاریخچه را بدون ارزش تحلیلی بزرگ میکند.
برای محاسبات عددی پیرامون STATS_DATE، نوع داده را قبل از ضرب یا تفریق ارتقا دهید و در سناریوهای تجمعی، Restart و بازنشانی Baseline را در نظر بگیرید.
Best Practiceهای اختصاصی STATS_DATE
- ورودی STATS_DATE را از نام یا شناسه معتبر و دارای Schema یا Context روشن تأمین کنید.
- نتیجه NULL در STATS_DATE را از مقدار صفر، false یا رشته خالی جدا نگه دارید.
- نوع خروجی STATS_DATE را پیش از ذخیره یا مقایسه به نوع مقصد مناسب تبدیل کنید.
- در گزارشهای بزرگ، گزینه Set-based مرتبط با statistics را ارزیابی کنید.
- زمان Capture، نام Database و در صورت نیاز @@SPID را کنار نتیجه STATS_DATE ثبت کنید.
- مجوز مشاهده Metadata یا DMV را با حداقل سطح دسترسی لازم تنظیم کنید. در مبحث STATS_DATE
- مثالهای STATS_DATE را روی نسخه و Edition واقعی محیط هدف آزمایش کنید.
- برای SQL پویا، خروجی نامی STATS_DATE را با QUOTENAME و پارامترسازی ایمن مصرف کنید.
تصویر سوم، تفاوت روش پرخطر و Best Practice در استفاده از STATS_DATE را مقایسه میکند؛ هدف آن جلوگیری از خطاهای مربوط به قدیمی بودن زمانی بهتنهایی کافی نیست؛ حجم تغییر داده و حساسیت Query نیز مهم است. و بهبود تصمیمگیری فنی است.
سؤالات متداول اختصاصی STATS_DATE
STATS_DATE دقیقاً چه مسئلهای را در SQL Server حل میکند؟
تابع STATS_DATE تاریخ و زمان آخرین بهروزرسانی Statistics مشخص روی یک جدول یا View ایندکسشده را برمیگرداند. در عمل، این تابع برای شناسایی آمار قدیمی، برنامهریزی UPDATE STATISTICS و تحلیل انتخاب Plan نامناسب بسیار کاربردی است. بنابراین استفاده از STATS_DATE زمانی ارزشمند است که خروجی آن در یک تصمیم فنی روشن مصرف شود، نه اینکه فقط برای نمایش عدد یا نام به کار رود.
نوع خروجی STATS_DATE چیست و چگونه باید آن را مدیریت کرد؟
نوع خروجی این ابزار چنین است: datetime یا NULL اگر Statistics هرگز بهروزرسانی نشده، شیء نامعتبر باشد یا Metadata قابل مشاهده نباشد. بهتر است پیش از تبدیل نوع، مقایسه یا درج در جدول گزارش، حالت NULL و محدوده مقدار را صریح کنترل کنید تا رفتار STATS_DATE قابل پیشبینی بماند.
آیا STATS_DATE در گزارشهای سازمانی کاربرد تجاری دارد؟
بله. در سناریوهایی مانند گزارش آمار قدیمی و عیبیابی Plan، خروجی STATS_DATE میتواند کیفیت گزارش مدیریتی را بالا ببرد. ارزش تجاری زمانی ایجاد میشود که این داده به هشدار، ظرفیتسنجی یا کاهش زمان عیبیابی متصل شود.
استفاده از STATS_DATE در پروژههای بزرگ چه مزیتی دارد؟
در پروژه بزرگ، استانداردسازی نحوه استفاده از STATS_DATE باعث میشود تیم توسعه، DBA و پشتیبانی یک تعریف مشترک از statistics و last updated داشته باشند. این هماهنگی خطاهای تفسیر و دوبارهکاری را کاهش میدهد.
تفاوت STATS_DATE با گزینه نزدیک آن چیست؟
STATS_DATE فقط زمان آخرین Update را میدهد، اما sys.dm_db_stats_properties تعداد تغییرات و تعداد ردیف نمونهبرداریشده را نیز نشان میدهد. انتخاب صحیح باید بر اساس حجم داده، نیاز به خروجی Set-based و سطح جزئیات گزارش انجام شود؛ یک تابع scalar همیشه جایگزین کاتالوگویو یا DMV کامل نیست.
برای طراحی اسکریپت حرفهای مبتنی بر STATS_DATE چه خدماتی لازم میشود؟
در پروژههای حساس میتوان منطق STATS_DATE را در قالب رویه مانیتورینگ، Dashboard، گزارش زمانبندیشده یا کنترل Deployment پیاده کرد. تحلیل نیاز، تست روی نسخه واقعی SQL Server و مستندسازی خروجی، بخشهای مهم خدمات مشاوره و انجام پروژه هستند.
رایجترین خطا هنگام کار با STATS_DATE چیست؟
یکی از خطاهای مهم این است که قدیمی بودن زمانی بهتنهایی کافی نیست؛ حجم تغییر داده و حساسیت Query نیز مهم است. همچنین نادیده گرفتن NULL یا Context اجرای Query میتواند نتیجهای ظاهراً معتبر ولی از نظر عملیاتی اشتباه تولید کند.
آیا فراخوانی زیاد STATS_DATE بر Performance اثر میگذارد؟
یک فراخوانی منفرد معمولاً سبک است، اما اجرای STATS_DATE روی مجموعه بسیار بزرگ یا در شرطی که برای هر ردیف محاسبه شود میتواند هزینه ایجاد کند. ابتدا ردیفها را محدود کنید و در گزارشهای وسیع، جایگزین Set-based را ارزیابی کنید.
بهترین روش استفاده از STATS_DATE چیست؟
بهترین روش این است که ورودی STATS_DATE اعتبارسنجی، نوع خروجی صریح، حالت NULL مدیریت و نتیجه همراه زمان و Context ثبت شود. همچنین باید مشخص باشد که خروجی برای نمایش، کنترل ایمنی یا تصمیم کارایی مصرف میشود.
STATS_DATE با کدام نسخههای SQL Server سازگار است؟
در نسخههای رایج SQL Server قابل استفاده است؛ DMV تکمیلی در نسخههای جدیدتر اطلاعات دقیقتری میدهد. با این حال، هنگام انتقال اسکریپت به Azure SQL یا Edition دیگر، Propertyها، مجوزهای Metadata و تفاوتهای پلتفرم را روی همان محیط آزمایش کنید.
سؤالات مصاحبه درباره STATS_DATE
در مصاحبه چگونه تفاوت ورودی و خروجی STATS_DATE را توضیح میدهید؟
پاسخ مناسب باید Syntax یعنی STATS_DATE ( object_id , stats_id )، نوع خروجی و شرایط NULL را توضیح دهد و یک نمونه از گزارش آمار قدیمی ارائه کند.
چه زمانی بهجای STATS_DATE از کاتالوگویو یا DMV استفاده میکنید؟
وقتی گزارش چندین ردیف و چند Property نیاز دارد، روش Set-based معمولاً مناسبتر است؛ STATS_DATE برای تبدیل یا بررسی هدفمند یک مقدار بسیار خواناست.
چگونه نتیجه نامعتبر STATS_DATE را از مقدار false یا صفر جدا میکنید؟
با بررسی صریح IS NULL، اعتبارسنجی ورودی و در صورت نیاز Join با Metadata منبع، علت نتیجه را روشن میکنم. این توضیح بهطور اختصاصی به STATS_DATE مربوط است.
چه نکته Performance درباره STATS_DATE مهم است؟
فراخوانی را پس از محدود کردن مجموعه داده انجام میدهم و از محاسبه تکراری STATS_DATE در SELECT و WHERE جلوگیری میکنم.
یک سناریوی واقعی برای STATS_DATE بیان کنید.
سناریوی مناسب میتواند اولویتبندی Maintenance باشد؛ در آن خروجی همراه Timestamp، نام Database و شناسه نشست ثبت میشود تا قابل پیگیری باشد.
چکلیست نهایی استفاده از STATS_DATE
- Syntax STATS_DATE و ورودیهای آن با نسخه هدف تطبیق داده شده است.
- Context پایگاه داده یا Instance برای STATS_DATE روشن است.
- مجوز لازم برای Metadata یا DMV بررسی شده است. در مبحث STATS_DATE
- NULL، مقدار نامعتبر و حالت مرزی STATS_DATE تست شده است.
- نمونه خروجی با نوع داده واقعی مقایسه شده است. در مبحث STATS_DATE
- در Query بزرگ، هزینه فراخوانی تکراری STATS_DATE اندازهگیری شده است.
- جایگزین Set-based برای گزارش انبوه ارزیابی شده است. در مبحث STATS_DATE
- نتیجه نهایی همراه Timestamp و توضیح عملیاتی ثبت میشود. در مبحث STATS_DATE
جمعبندی آموزش STATS_DATE
STATS_DATE ابزاری کوچک اما مؤثر برای برای شناسایی آمار قدیمی، برنامهریزی UPDATE STATISTICS و تحلیل انتخاب Plan نامناسب بسیار کاربردی است. است. استفاده حرفهای از آن به اعتبارسنجی ورودی، تفسیر نوع خروجی، کنترل NULL و انتخاب Scope مناسب وابسته است.
پس از تسلط بر STATS_DATE، برای مقایسه آن با سایر ابزارهای این مجموعه به مقاله مادر توابع کمکی Performance و Metadata در SQL Server بازگردید.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان
قبول سفارشهای برنامهنویسی و پایگاه داده: 09131253620
انجام پروژههای برنامهنویسی، آموزش برنامهنویسی و آموزش پایگاه داده SQL Server با رویکرد حرفهای، مستند و قابل توسعه انجام میشود.
مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی
از سال ۱۳۷۵ شمسی تاکنون در زمینه طراحی و اجرای پروژههای برنامهنویسی، پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری فعالیت میکنیم.
برای سفارش پروژههای برنامهنویسی و پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری جدید، با شماره تلفن همراه 09131253620 تماس حاصل فرمایید.
ایتا، واتساپ و تماس مستقیم: +989131253620
تماس با ما