View Full Version : عدم اجرای این Query با رنج بالای چند میلیون!!!!
مهدی رحیم زاده
پنج شنبه 28 مرداد 1389, 08:52 صبح
با سلام
من این Query رو نوشتم :
CREATE PROCEDURE M_SPTempBonNum @UpReng bigint,@DownReng bigint
AS
IF OBJECT_ID('TempBonNum') IS NULL
CREATE TABLE dbo.TempBonNum(_BonNum bigint NOT NULL PRIMARY KEY);
INSERT INTO TempBonNum VALUES(@DownReng);
WHILE @DownReng * 2 <= @UpReng
BEGIN
INSERT INTO dbo.TempBonNum SELECT _BonNum + @DownReng FROM dbo.TempBonNum;
SET @DownReng =@DownReng * 2;
END
INSERT INTO dbo.TempBonNum
SELECT _BonNum + @DownReng FROM dbo.TempBonNum WHERE _BonNum + @DownReng <= @UpReng;
GO
با رنح های پایین درست جواب میده اما وقتی محدوده رو میرسونم به بالای چهار میلیون دیگه درست داده ها رو Insert نمی کنه.
دلیلش چیه و چکار کنم که درست شه؟
آخه داده های من از چهار میلیون تا 6 میلیونن.
با تشکر
m_omrani
پنج شنبه 28 مرداد 1389, 11:11 صبح
به نظرم منطق SP تون رو بگيد که چه کاري مي کنه. شايد مشکل منطقي داشته باشه (حدسي که من مي زنم همينه).
مهدی رحیم زاده
پنج شنبه 28 مرداد 1389, 16:37 عصر
ببینید قراره که از یک مجموعه اعدادی که مثلا از بین اعداد 4000000 تا 5000000 اعدادی که توی یک Table ثبت نشده رو بدست آورد . برای همین یک جدول کمکی درست می کنیم شامل تمام دده ها و بعد داده های مورد نظر رو با توجه به دوتا جدول پیدا می کنیم .
مشکل اینجاست که جدول کمکی الان باید با این SP ایجاد بشه که توی رنج های بالا درست کار نمیکنه
با تشکر
m_omrani
جمعه 29 مرداد 1389, 00:55 صبح
مساله اينه که شما داريد هربار @DownReng رو در 2 ضرب مي کنيد و بعد با استفاده از SELECT تمامي رکوردهاي جدول TempBonNum رو که تا الان توشه مجدداً توي خود TempBonNum درج مي کنيد:
WHILE @DownReng * 2 <= @UpReng
BEGIN
INSERT INTO dbo.TempBonNum SELECT _BonNum + @DownReng FROM dbo.TempBonNum;
SET @DownReng =@DownReng * 2;
END
فرضاً اگه @DownReng با 2 شروع بشه، رکوردهاي زير توي جدول TempNum شروع به درج مي شه:
قبل از شروع حلقه: 2 درج مي شه
ردگيري الگوريتم در داخل حلقه:
تکرار اول: رکوردهاي مورد درج=4، داده هاي جدول قبل از درج=2، DownReng=2
تکرار دوم: رکوردهاي مورد درج=8,6، داده هاي جدول قبل از درج=2,4، DownReng=4
تکرار سوم: رکوردهاي مورد درج=16,14,12,10، داده هاي جدول قبل از درج=2,4,6,8، DownReng=8
پس از همين سه تکرار جدول TempBonNum داراي اين رکوردها است:
2,4,6,8,10,12,14,16
يعني هر بار تعداد رکوردهاي جدول دو برابر مي شه.
من SP شما رو براي داده هاي 1 تا 6000000 اجرا کردم. SP رو جوري نوشتيد که با مقاديري که مي گيد (4 ميليون و 6 ميليون) فقط 1 حلقه بيشتر نمي زنه. طبيعي هم هست. چون در اولين حلقه @DownReng دو برابر مي شه و به 8 ميليون مي رسه و از 6 ميليون مي زنه بالا. به همين دليل چاره اي نبود جز اين که SP رو با عدد کمي مثل 1 اجرا کنم. اما بعد از 1 دقيقه اجرا در نهايت خطا داد که دور از انتظار هم نبود. چون به سرعت حجم داده هاي مورد درج داره بالا مي ره. نتيجه اجرا رو در زير آوردم:
exec dbo.M_SPTempBonNum 6000000,1
(1 row(s) affected)
(2 row(s) affected)
(4 row(s) affected)
(8 row(s) affected)
(16 row(s) affected)
(32 row(s) affected)
(64 row(s) affected)
(128 row(s) affected)
(256 row(s) affected)
(512 row(s) affected)
(1024 row(s) affected)
(2048 row(s) affected)
(4096 row(s) affected)
(8192 row(s) affected)
(16384 row(s) affected)
(32768 row(s) affected)
(65536 row(s) affected)
(131072 row(s) affected)
(262144 row(s) affected)
(524288 row(s) affected)
(1048576 row(s) affected)
(2097152 row(s) affected)
Msg 2627, Level 14, State 1, Procedure M_SPTempBonNum, Line 10
Violation of PRIMARY KEY constraint 'PK__TempBonN__D13DD0990BC6C43E'. Cannot insert duplicate key in object 'dbo.TempBonNum'.
The statement has been terminated.
Msg 2627, Level 14, State 1, Procedure M_SPTempBonNum, Line 13
Violation of PRIMARY KEY constraint 'PK__TempBonN__D13DD0990BC6C43E'. Cannot insert duplicate key in object 'dbo.TempBonNum'.
The statement has been terminated.
به نظرم يه مشکلي در مورد منطق اين SP وجود داره.
مهدی رحیم زاده
یک شنبه 31 مرداد 1389, 08:19 صبح
راستش این فرمول رو یکی از دوستان برای پر کردن سریع جدول ارائه کرده بودن .
شما چه راه حلی رو پیشنهاد می کنید؟
خیلی خیلی ضروریه برام
با تشکر
m_omrani
یک شنبه 31 مرداد 1389, 22:05 عصر
دقيقاً اين SPROC رو با چه پارامترهايي فراخواني مي کنين؟
مهدی رحیم زاده
دوشنبه 01 شهریور 1389, 08:31 صبح
من اینجوری فراخوانیش می کنم :
M_SPTempBonNum 6000000,4000000
توی اون فرمول بالا عدد دوم درواقع کام حرکت هم هست! چطور میشه که این موضوع رو از اون حذف کرد؟
با تشکر
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.