PDA

View Full Version : سوال: بهترین گزینه برای انتخاب 15 تا از 50 تای آخر یک جدول



chaalesh
یک شنبه 19 خرداد 1387, 19:34 عصر
سلام
من میخوام از یه جدولی که دیتا های اون در 200 گروه دسته بندی میشود و روزانه 2000 رکورد به جدول اضافه میشه برای هر گروه هر روز حداقل 20000 بار از 50 آگهی آخرش 15 تا رو رندم انتخاب کنم
مثلا برای گروه x از بین 50 رکورد جدید 15 رکورد تصادفی انتخاب نمایم و این عمل را روزانه 20000 بار انجام بدم

به نظر شما چکار کنم سرعت کار بهتره ؟
برای هر گروه view بسازم ؟ !!
یا اصلا احتیاجی به این کار نیست ؟
یا راه حل بهتری براش پیشنهاد میکنید ؟
در این جدول کلید اصلی ما کد آگهی است. ساختار جدول را عوض کنم چی ؟

ASKaffash
دوشنبه 20 خرداد 1387, 15:32 عصر
با سلام
به شکل ذیل :


Select Top 15 *
From YourTable
Where YourField=?
Order By NewID()

Kamyar.Kimiyabeigi
دوشنبه 20 خرداد 1387, 16:57 عصر
از sql 2000 استفاده ميكنين يا 2005 ؟

ASKaffash
دوشنبه 20 خرداد 1387, 17:25 عصر
از sql 2000 استفاده ميكنين يا 2005 ؟
با سلام
در هردو نسخه تست کردم فرقی نمیکند. درست عمل میکنه

Kamyar.Kimiyabeigi
سه شنبه 21 خرداد 1387, 08:37 صبح
من منظورم با chaalesh بود كه از چه نسخه ايي استفاده ميكنن؟

parsavb
سه شنبه 21 خرداد 1387, 08:55 صبح
در sql 2005 ابتدا با استفاده از group by و having لیست خودتون رو تهیه کرده وسپس با عبارت top اونهائی رو که می خواهید جدا کنید

chaalesh
سه شنبه 21 خرداد 1387, 10:37 صبح
سلام دوستان
1- من از 2000 استفاده میکنم
2- این sql ای که زحمت کشیدید رو میتونم بنویسم ولی منظورم اینه که بهینه باشه
3- کجای sql شما ست میکنه از 50 تای آخری هر شاخه انتخاب کنه؟

ممنون

Arghavan_Reza
سه شنبه 21 خرداد 1387, 18:37 عصر
دوست عزیز از SP زیر استفاده نمایید مشکلتان حل میشه:


CREATE PROCEDURE MyRandomRecords(@Group_Code int) AS

DECLARE @ID int
DECLARE @RandomizedTable TABLE(ID int, Random Float)

DECLARE Tmp_Cursor CURSOR FOR
SELECT TOP 50 ID FROM MyTable WHERE Group_Code = @Group_Code ORDER BY ID DESC

OPEN Tmp_Cursor
FETCH NEXT FROM Tmp_Cursor INTO @ID
WHILE (@@FETCH_STATUS = 0)
BEGIN
INSERT INTO @RandomizedTable (ID, Random) Values (@ID, RAND())
FETCH NEXT FROM Tmp_Cursor INTO @ID
END

CLOSE Tmp_Cursor
DEALLOCATE Tmp_Cursor

SELECT TOP 15 * from @RandomizedTable ORDER BY Random
GO

که در آن :
Group_Code : گروه آگهی
ID : کد آگهی
MyTable : جدول شما

SYNDROME
سه شنبه 21 خرداد 1387, 20:48 عصر
3- کجای sql شما ست میکنه از 50 تای آخری هر شاخه انتخاب کنه؟

برای جدا کردن رکوردها باید از دستور Top استفاده کنید.
اگر می خواهید از آخر جدا کنید نزولی مرتب کنید و سپس Top را برابر 50 قرار دهید.
موفق باشید

chaalesh
چهارشنبه 22 خرداد 1387, 10:24 صبح
با تشکر از جوابهایتان
دوست عزیز : Arghavan_Reza (http://barnamenevis.org/forum/member.php?u=17287)
این sp شما وقتی که من روزانه 2000 فیلد به جدولم اضافه میکنم و هر روز طی 20000 درخواست اقدام به تولید 200 نوع مختلف دسته بندی 50 تائی میکنم تا از اون 15 تامو بکشم بیرون ، به نظر شما سنگین نیست ؟
ممنون میشم دوستان دیگه هم جواب بدن

اصغر (پآچ)
چهارشنبه 22 خرداد 1387, 11:47 صبح
سلام دوستان

ببخشید من پا برهنه می پرم وسط بحثتون من می خوام بدونم از SP چطوری باید در دلفی استفاده کنم؟
اصلا SP چی هست من تا بحال باهاش کار نکردم این هم یه نوع دستور مثل SELECT محسوب میشه؟

بازم معذرت می خوام اگه خیلی بی ربطه آخه منم می خوام از این SP استفاده کنم.

موفق و موید باشی

ASKaffash
چهارشنبه 22 خرداد 1387, 11:59 صبح
سلام
فصل اول این جزوه را مطالعه کنید :
http://barnamenevis.org/forum/showthread.php?t=106494

Arghavan_Reza
چهارشنبه 22 خرداد 1387, 15:29 عصر
نگران نباشید. سعی شده بهینه باشد، به شرط آنکه :
1) ID (کد آگهی) کلید اصلی باشد.
2) روی فیلد Group_Code (گروه آگهی) نیز ایندکس بگذارید.
سرعتش قابل قبوله.

chaalesh
جمعه 24 خرداد 1387, 02:03 صبح
ممنون از همه دوستان و شما دوست عزیز Arghavan_Reza (http://barnamenevis.org/forum/member.php?u=17287)
از همین استفاده میکنم