PDA

View Full Version : کمک - اجرای دستور ALTER TABLE در یک تیبل با 7 میلیون رکورد



arman_Delta2002
پنج شنبه 22 تیر 1391, 08:54 صبح
سلام من چند سوال داشتم که مهمترینش اینه
1- چرا زمانی که دستور ALTER TABLE رو روی یکی از تیبل های خیلی حجیم ام انجام میدم بعد حدود 4 دقیقه خطای بدون پاسخ بودن رو میده و کامل انجام نمشه این تیبل ام حدود 7 میلیون رکورد داره


ALTER TABLE dbo.MaleTabel
ALTER COLUMN MaleName nvarchar(255) NOT NULL
GO

ALTER TABLE dbo.MaleTabel
ADD PRIMARY KEY ([MaleName])
GO


بعد 15 دقیقه این خطا رو داد

Msg 515, Level 16, State 2, Line 2
Cannot insert the value NULL into column 'MaleName', table 'MailDB.dbo.MaleTabel'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
Msg 8111, Level 16, State 1, Line 2
Cannot define PRIMARY KEY constraint on nullable column in table 'MaleTabel'.
Msg 1750, Level 16, State 0, Line 2
Could not create constraint. See previous errors.



2- چرا وقتی که من چند تا تیبل خیلی بزرگ رو پاک کردم باز هم حجم بانکم حمونقدر است و فقط نام تیبل رو پاک کرده و داده های توشو پاک نکرده؟

3- آیا میشه یک فیلد از نوع رشته ای رو به عنوان کلید خارجی تعریف کرد و این کار باعث بشه که داده های تکراری اون سطون از بین بره ؟

baktash.n81@gmail.com
پنج شنبه 22 تیر 1391, 11:55 صبح
سلام
در مورد سئوال اول ... معمولا وقتی اطلاعات توی جدول زیاد باشه تغییر جدول زمانبر و سخت می شه ... اما خطایی که می ده مربوط به اینه که شما یه فیلدی رو داری not null می کنی ... اول مطمئن باش که توی رکوردهات هیجا این فیلد null نباشه ... مثلا اینو اجرا کن ...

Select Count(*) From MaleTabel Where MaleName is null

این Query نباید مقداری برگردونه ...
بعد شما اومدی این فیلد رو کلید اصلی کردی ... پس نباید مقدار تکراری داشته باشه ... با این Query می تونی امتحان کنی ...


Select MaleName,Count(*) from MaleTabel group by (MaleName) having Count(*)>1


اما در کل کار خوبی انجام نمیدی که یه فیلد رشته ایی رو داری کلید اصلی قرار می دی ... با این تعداد رکورد کلا منفجر می شه ...

یکی از راه حل ها می تونه این باشه که شما یه جدول بساز مثل جدول قبلیت بدون اطلاعات بعد تغییرات رو روش اعمال کن ... بعد اطلاعات رو از جدول قبلی بریز تو جدول جدید ... بعد اسماشون رو عوض کن یا از Synonym استفاده کن ...

2- حجم بانک شامل دو فایل هست ... mdf و ldf ... حجمه کدومشون زیاد شده ... ؟! اگه می خوای حجمی رو که یه Table به خودش اختصاص داده رو ببینی ... می تونی بری رو اسم جدول راست کلیک کنی Properties بعد هم storage رو انتخاب کنی ... شاید اونقدر که فکر می کردی جداولت حجم نداشتن ...

برای دستور Shrink هم جستجو کن ...

3 - این مورد رو کلا نفهمیدم ...

arman_Delta2002
پنج شنبه 22 تیر 1391, 16:06 عصر
حدف اصلی من از این کار اینه که ردیف های تکراری رو از بین ببرم واسه همین سعی کردم که کلیدش کنم هرچی مثال تو اینترنت بود واسه پاک کردن داده های تکراری مربوط کار با اعداد بود

حمیدرضاصادقیان
شنبه 24 تیر 1391, 12:18 عصر
سلام.
نیازی به اینکار نیست و خیلی راحت میتونید با کدی که در پست 2 نوشته شده داده های تکراری رو بدست بیارید.

baktash.n81@gmail.com
شنبه 24 تیر 1391, 17:33 عصر
فرض کن برای اسم علی 3 تا رکورد داریم ... کدوم رکورد ها باید حذف بشن ؟؟ یعنی با چه الگوریتمی می خوای تشخیص بدی که کدوم رکورد قراره بمونه و بقیه باید حذف بشن ... ؟! آیا همه فیلدهای دیگه مربوط به این 3 تا رکورد یکی هست ؟!