naeeme
سه شنبه 19 آبان 1388, 08:07 صبح
ساختار جدول من به صورت زیر هست:
sdId ( bigint, PK)
ordid (bigint, FK)
baid (tinyInt, FK)
slId (bigint)
یک UK هم روی فیلدهای baId و slID دارم. فیلد sdId هم بطور خودکار مقدار میگیره.
من می خوام slId بطور مرتب از یک شروع و افزایش پیدا کنه به شرطی که برای هر baId، slId از یک شروع بشه و دو فیلد baId و slId در کنار هم مقدار یکتایی داشته باشند.
راه حلی که خودم استفاده کردم استفاده از از این کویری بود
SELECT @slId=max(slId)
FROM tb_examcode
WHERE baId=@baId
IF @slId IS NULL
SELECT @slId=0
SELECT @slId = @slId + 1
INSERT INTO tb_examcode
(odId, baId, slId)
VALUES (@odId,@baId,@slId);
SELECT @sdId=sdId
FROM tb_examcode
WHERE slId=@slId
اما مشکلی که وجود داره این هست که اولا در هنگام ترافیک بالا، این SP دقیق عمل نمی کنه و slId رو بطور مرتب درج نمی کنه و همین طور گاهی خطای درج دو مقدار یکسان رو میده. مشکل دیگه این هست که چون حجم اطلاعات بالا رفته، کند عمل می کنه. به خاطر استفاده از تابع MAX هم تابع کندتر از معمول هست.
دنبال راه حلی هستم که اولا دقیق باشه، یعنی واقعا بطور مرتب slId رو تولید کنه، ثانیا به سرعت جواب بده.
در مورد تعداد رکوردهای این جدول بگم که به راحتی در دو سال آینده به بالای 2 میلیون رکورد خواهد رسید و چون این سیستم حداقل طول عمر 4 ساله داره ژس برای تعداد رکورد بالای 5 میلیون باید به راحتی جواب بده.
sdId ( bigint, PK)
ordid (bigint, FK)
baid (tinyInt, FK)
slId (bigint)
یک UK هم روی فیلدهای baId و slID دارم. فیلد sdId هم بطور خودکار مقدار میگیره.
من می خوام slId بطور مرتب از یک شروع و افزایش پیدا کنه به شرطی که برای هر baId، slId از یک شروع بشه و دو فیلد baId و slId در کنار هم مقدار یکتایی داشته باشند.
راه حلی که خودم استفاده کردم استفاده از از این کویری بود
SELECT @slId=max(slId)
FROM tb_examcode
WHERE baId=@baId
IF @slId IS NULL
SELECT @slId=0
SELECT @slId = @slId + 1
INSERT INTO tb_examcode
(odId, baId, slId)
VALUES (@odId,@baId,@slId);
SELECT @sdId=sdId
FROM tb_examcode
WHERE slId=@slId
اما مشکلی که وجود داره این هست که اولا در هنگام ترافیک بالا، این SP دقیق عمل نمی کنه و slId رو بطور مرتب درج نمی کنه و همین طور گاهی خطای درج دو مقدار یکسان رو میده. مشکل دیگه این هست که چون حجم اطلاعات بالا رفته، کند عمل می کنه. به خاطر استفاده از تابع MAX هم تابع کندتر از معمول هست.
دنبال راه حلی هستم که اولا دقیق باشه، یعنی واقعا بطور مرتب slId رو تولید کنه، ثانیا به سرعت جواب بده.
در مورد تعداد رکوردهای این جدول بگم که به راحتی در دو سال آینده به بالای 2 میلیون رکورد خواهد رسید و چون این سیستم حداقل طول عمر 4 ساله داره ژس برای تعداد رکورد بالای 5 میلیون باید به راحتی جواب بده.