حذف ردیف‌های تکراری-SQL Server-دیتابیس-دستور DISTINCT-دستور ROW_NUMBER-AdventureWorks2019

وجود داده‌های تکراری (Duplicate Data) در جداول SQL Server نه‌تنها باعث شلوغی و پیچیدگی پایگاه داده می‌شود، بلکه می‌تواند عملکرد سیستم را به مرور کاهش دهد، مخصوصاً زمانی که روی این جداول حجم بالایی از کوئری‌ها اجرا شود.

در این مقاله، به بررسی چند روش کاربردی برای شناسایی و حذف داده‌های تکراری می‌پردازیم، همراه با مثال‌های عملی از دیتابیس AdventureWorks2019.

سناریوی مشکل داده تکراری

فرض کنید هنگام اجرای یک کوئری INSERT به اشتباه دو بار دستور را اجرا کرده‌اید یا به دلایل دیگر داده‌های تکراری در جدول شما ایجاد شده است.

نمونه کوئری:

SELECT BusinessEntityID, FirstName, LastName
FROM [AdventureWorks2019].[Person].[Person]
WHERE FirstName = 'Ken' AND LastName = 'Myer'

خروجی این کوئری ممکن است دو یا چند ردیف یکسان باشد.

روش اول: شناسایی داده‌های تکراری با DISTINCT

برای مشاهده فقط یک نمونه از داده‌های تکراری می‌توان از دستور DISTINCT استفاده کرد:

SELECT DISTINCT FirstName, LastName
FROM [AdventureWorks2019].[Person].[Person]
WHERE FirstName = 'Ken' AND LastName = 'Myer'

با این روش، مقادیر مشابه فقط یک بار در خروجی نمایش داده می‌شوند و می‌توانید تعداد رکوردهای تکراری را با یک SELECT معمولی مقایسه کنید.

روش دوم: حذف داده‌های تکراری با ROW_NUMBER

برای حذف رکوردهای اضافه و نگه داشتن فقط یک نمونه، می‌توان از تابع تحلیلی ROW_NUMBER() استفاده کرد:

WITH DuplicateRows AS (
    SELECT *, 
           ROW_NUMBER() OVER (PARTITION BY FirstName ORDER BY FirstName) AS RowNumber
    FROM Person.Person
    WHERE FirstName = 'Ken' AND LastName = 'Myer'
)
DELETE FROM DuplicateRows 
WHERE RowNumber > 1

این کوئری با استفاده از PARTITION BY داده‌ها را گروه‌بندی کرده و با ROW_NUMBER() شماره‌گذاری می‌کند. سپس ردیف‌های شماره بزرگ‌تر از ۱ حذف می‌شوند.

نکات مهم قبل از حذف داده‌های تکراری

  • قبل از حذف رکوردها، بکاپ کامل از دیتابیس تهیه کنید.
  • اگر جدول کلید اصلی (Primary Key) یا ایندکس یونیک (Unique Index) ندارد، پیشنهاد می‌شود آن را اضافه کنید تا از ایجاد داده‌های تکراری در آینده جلوگیری شود.
  • حذف داده‌های تکراری در جداول بزرگ بهتر است در زمان‌های کم‌بار (Low Traffic) انجام شود.

دانلود دیتابیس نمونه AdventureWorks2019

🔗 دانلود AdventureWorks2019 از Microsoft

سوالات متداول (FAQ)

۱. آیا DISTINCT داده‌های تکراری را حذف می‌کند؟
خیر. DISTINCT فقط در خروجی کوئری رکوردهای تکراری را حذف می‌کند، اما تغییری در جدول اصلی ایجاد نمی‌کند.

۲. تفاوت ROW_NUMBER با RANK در حذف داده‌های تکراری چیست؟
ROW_NUMBER یک شماره یکتا به هر ردیف اختصاص می‌دهد، درحالی‌که RANK در صورت وجود داده‌های یکسان، شماره‌های تکراری تولید می‌کند. برای حذف داده‌های تکراری، ROW_NUMBER دقیق‌تر است.

۳. چطور می‌توان از ایجاد داده‌های تکراری جلوگیری کرد؟
با استفاده از کلید اصلی، ایندکس یونیک یا اعتبارسنجی داده‌ها در لایه برنامه (Application Layer).

۴. آیا حذف داده‌های تکراری روی عملکرد سرور تأثیر دارد؟
بله، مخصوصاً در جداول بزرگ عملیات حذف می‌تواند باعث قفل‌گذاری (Locking) شود. به همین دلیل باید در زمان مناسب اجرا شود.

تماس و مشاوره

اگر نیاز به شناسایی و حذف داده‌های تکراری، بهینه‌سازی جداول یا طراحی ساختار پایگاه داده دارید، تیم ما آماده ارائه خدمات تخصصی SQL Server است.

نظری داده نشده

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *