وجود دادههای تکراری (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 است.
نظری داده نشده