PDA

View Full Version : گرفتن اطلاعات از 2000 جدول در database



Masoomeh.H
یک شنبه 02 اسفند 1394, 07:45 صبح
سلام دوستان
من توی دیتابیسم نزدیک به 2000 جدول دارم که می خوام از این جدول ها 3 تا ستونشون رو بخونم و بریزم توی دیتاگریدویو. به نظر شما از چه روشی استفاده کنم که سرعت سیستم رو کم نکنه و برنامه هنگ نکنه؟؟؟؟
پیشاپیش تشکر می کنم

winner1
یک شنبه 02 اسفند 1394, 07:47 صبح
مسلما ایدیو دات نت و سعی کن از پروسیجر ها و ویو ها استفاده کنی البته ایندکس گزاری صحیح هم خیلی مهمه واسه این کار به هیچ عنوان از entity استفاده نکن

Masoomeh.H
یک شنبه 02 اسفند 1394, 07:53 صبح
خوب مسئله اینه که دیتابیسم sqlite هست ولی اسم گذاری این جدول ها روی ترتیب هست. حالا با حلقه فور این کار رو انجام بدم طبیعتا خیلی سرعت رو می گیره.

Mahmoud Zaad
دوشنبه 03 اسفند 1394, 03:55 صبح
سلام
باید از دستور Union استفاده کنی. دستورش به شکل زیر هست:
SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;

البته به جای Union از Union All هم میشه استفاده کرد تا همه رکوردهای تکراری رو بیاره. منبع (http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_union_all)

حالا تنها کاری که باید بکنی این هست که قبل از اجرای دستور Sql، با یه حلقه به تعداد جدولها سلکت بنویسید و اجرا کنید.

string _query="SELECT col1, col2, col3 FROM table1";
for(int i=2;i<=2000;i++)
_query +=" UNION SELECT col1, col2, col3 FROM table"+i.ToString();

اسم جدول رو به جای table و اسم ستون ها رو به جای col1, col2, col3 بنویسید. این میشه کوئری، حالا این کوئری رو اجرا کنید و تمام.

Masoomeh.H
دوشنبه 03 اسفند 1394, 04:02 صبح
حالا تنها کاری که باید بکنی این هست که قبل از اجرای دستور Sql، با یه حلقه به تعداد جدولها سلکت بنویسید و اجرا کنید.

string _query="";
for(int i=1;i<=2000;i++)
_query +="SELECT col1, col2, col3 FROM table"+i.ToString();

اسم جدول رو به جای table و اسم ستون ها رو به جای col1, col2, col3 بنویسید. این میشه کوئری، حالا این کوئری رو اجرا کنید و تمام.


من از همین دستور for استفاده می کنم ولی برنامه هنگ می کنه

Mahmoud Zaad
دوشنبه 03 اسفند 1394, 04:10 صبح
این اصلاً چیزی نیست که برنامه هنگ کنه اصلاً تا اینجاش ربطی به دیتابیس هم نداره یه حلقه ساده است. البته این کد اشکال داشت اصلاح کردم ولی چجوری شما از همین کد استفاده می کردید؟!:متفکر: ولی در موقع اجرای کوئری از backGroundWorker می تونید استفاده کنید. یه سوال هم داشتم این چه بانکیه که 2000 تا جدول مشابه توش هست؟ و اینکه تعداد رکوردهای هر جدول چند تاست حدوداً؟

Masoomeh.H
دوشنبه 03 اسفند 1394, 04:25 صبح
این اصلاً چیزی نیست که برنامه هنگ کنه اصلاً تا اینجاش ربطی به دیتابیس هم نداره یه حلقه ساده است. البته این کد اشکال داشت اصلاح کردم ولی چجوری شما از همین کد استفاده می کردید؟!:متفکر: ولی در موقع اجرای کوئری از backGroundWorker می تونید استفاده کنید. یه سوال هم داشتم این چه بانکیه که 2000 تا جدول مشابه توش هست؟ و اینکه تعداد رکوردهای هر جدول چند تاست حدوداً؟
منظور من از همین کد، همین روش سلکت و حلقه فور بود که داخل این حلقه فور میاد اطلاعات رو می ریزه توی دیتاتیبل. توی برنامه من این روش هنگ می کنه. دیتابیسی که به من دادن تا باهاش کار کنم مربوط به یه سیستمی شبیه سانترال هست که اطلاعات تماس های ورودی و خروجی هر فرد رو ذخیره می کنه. بیشتر برای سازمان های بزرگ کاربرد داره

Mahmoud Zaad
دوشنبه 03 اسفند 1394, 04:44 صبح
خب من گفتم، شما اول باید کوئری رو با حلقه بنویسید بعد اجراش کنید یعنی توی حلقه فقط یک سلکت داریم یعنی به شکل زیر میشه:

string _query="SELECT col1, col2, col3 FROM table1";

for(int i=2;i<=2000;i++)
_query +=" UNION SELECT col1, col2, col3 FROM table"+i.ToString();



//تا اینجا توی حلقه فقط کوئری رو به دست آوردیم بعدش فقط یک سلکت از دیتابیس انجام میدیم
SqliteDataAdapter da = new SqliteDataAdapter(_query, cnn);
DataTable dt=new DataTable();
da.Fill(dt);
dataGridview.DataSource=dt;

یعنی توی دیتابیس برای هر فرد یه جدول درست کردن؟ جالبه، البته ربطی به بحث نداره فقط میخواستم ببینم داستان چیه!

Masoomeh.H
دوشنبه 03 اسفند 1394, 04:48 صبح
خب من گفتم، شما اول باید کوئری رو با حلقه بنویسید بعد اجراش کنید یعنی توی حلقه فقط یک سلکت داریم یعنی به شکل زیر میشه:

string _query="SELECT col1, col2, col3 FROM table1";

for(int i=2;i<=2000;i++)
_query +=" UNION SELECT col1, col2, col3 FROM table"+i.ToString();



//تا اینجا توی حلقه فقط کوئری رو به دست آوردیم بعدش فقط یک سلکت از دیتابیس انجام میدیم
SqliteDataAdapter da = new SqliteDataAdapter(_query, cnn);
DataTable dt=new DataTable();
da.Fill(dt);
dataGridview.DataSource=dt;

یعنی توی دیتابیس برای هر فرد یه جدول درست کردن؟ جالبه، البته ربطی به بحث نداره فقط میخواستم ببینم داستان چیه!
یعنی نیست پرکردن دیتاتیبل داخل حلقه باشه؟؟؟؟؟
حجم اطلاعاتی که ذخیره می کنند خیلی زیاده برای همین میان برای هر نفر یه شماره شناسایی می سازند و برای هرکدوم این شماره شناسایی ها یه جدول می سازند.

golbafan
دوشنبه 03 اسفند 1394, 05:01 صبح
در کل خیلی کار احمقانه ای انجام دادن !!!

اولا که برای این همه داده از sqlite استفاده کردن که اسمش روشه (سبک)
دوما اینکه بجای پارتیشن بندی دیتابیس بر اساس کد کاربر ، اومدن تعداد جدول ها رو زیاد و در نتیجه کوئری ها رو مشکل کردن

اگر امکان داره دیتابیس رو بفرستید روی sqlserver یا mysql یا oracle و پارتیشن بندی انجام بدید و جداول رو ادغام کنید در یک چدول
بعدش فقط کافیه یک کوئری ساده بزنید تا به تفکیک کاربر براتون گزارش ها رو مثل هلو تحویل بده

برای اطلاع عرض میکنم: mysql رایگان بوده و حجم فایل نصبش هم کمتر از 50 مگ هست

Masoomeh.H
دوشنبه 03 اسفند 1394, 05:04 صبح
در کل خیلی کار احمقانه ای انجام دادن !!!

اولا که برای این همه داده از sqlite استفاده کردن که اسمش روشه (سبک)
دوما اینکه بجای پارتیشن بندی دیتابیس بر اساس کد کاربر ، اومدن تعداد جدول ها رو زیاد و در نتیجه کوئری ها رو مشکل کردن

اگر امکان داره دیتابیس رو بفرستید روی sqlserver یا mysql یا oracle و پارتیشن بندی انجام بدید و جداول رو ادغام کنید در یک چدول
بعدش فقط کافیه یک کوئری ساده بزنید تا به تفکیک کاربر براتون گزارش ها رو مثل هلو تحویل بده
خوب همین کار رو نمی شه روی sqlite انجام داد؟؟؟؟؟

golbafan
دوشنبه 03 اسفند 1394, 05:04 صبح
نه امکان پارتیشن بندی موجود نیست در sqlite

Mahmoud Zaad
دوشنبه 03 اسفند 1394, 05:43 صبح
یعنی نیست پرکردن دیتاتیبل داخل حلقه باشه؟؟؟؟؟
حجم اطلاعاتی که ذخیره می کنند خیلی زیاده برای همین میان برای هر نفر یه شماره شناسایی می سازند و برای هرکدوم این شماره شناسایی ها یه جدول می سازند.

نیست؟ :متفکر: اگه منظورتون نبایده، آره نباید. کلاً طبق گفته های شما یه کوئری نیازه، شما اصلاً کاری که گفته میشه رو انجام نمیدید فقط دارید می ترسید همین 4 خط کدی که گفتم رو کپی کنید با دو بار آزمون و خطا مشکل حل میشه.

Masoomeh.H
دوشنبه 03 اسفند 1394, 05:46 صبح
نیست؟ :متفکر: اگه منظورتون نبایده، آره نباید. کلاً طبق گفته های شما یه کوئری نیازه، شما اصلاً کاری که گفته میشه رو انجام نمیدید فقط دارید می ترسید همین 4 خط کدی که گفتم رو کپی کنید با دو بار آزمون و خطا مشکل حل میشه.
مطمئن باشید دارم تست می کنم. وگرنه سریع سئوالاتم رو نمی پرسیدم

hamid_hr
دوشنبه 03 اسفند 1394, 06:20 صبح
توی sqlite میشه یک view نوشت
شما با union یک ویو طراحی کنید برا دیتابیستون
از اون ویو یک select بگیرین سرعت خوب میشه

Masoomeh.H
دوشنبه 03 اسفند 1394, 06:28 صبح
توی sqlite میشه یک view نوشت
شما با union یک ویو طراحی کنید برا دیتابیستون
از اون ویو یک select بگیرین سرعت خوب میشه
خوب من دارم سعی می کنم همین union رو بسازم ولی نتونستم هنوز. می شه راهنمایی کنید

hamid_hr
دوشنبه 03 اسفند 1394, 07:07 صبح
select c1,c2from tbl1
union all
select c1,c1
from tbl2

فقط باید نوع فیلد هاش و تعداد شون در هر سلکت با هم برابر باشد.

Masoomeh.H
دوشنبه 03 اسفند 1394, 08:04 صبح
select c1,c2from tbl1
union all
select c1,c1
from tbl2

فقط باید نوع فیلد هاش و تعداد شون در هر سلکت با هم برابر باشد.
خوب برای تعداد بالایی از جدول ها باید چیکار کنم؟؟؟؟

hamid_hr
دوشنبه 03 اسفند 1394, 10:44 صبح
خب برا دیتابیس یک دفعه میخواد همه را لیست کنی و یک ویو بسازی
بعد دیگه از ویو با یک سلکت ساده استفاده کنی

Masoomeh.H
دوشنبه 03 اسفند 1394, 16:23 عصر
خب برا دیتابیس یک دفعه میخواد همه را لیست کنی و یک ویو بسازی
بعد دیگه از ویو با یک سلکت ساده استفاده کنی
مشکل اینه که تعداد جدول ها ثابت نیست. هر روز بیشتر میشه

Masoomeh.H
سه شنبه 04 اسفند 1394, 05:24 صبح
این مشکل با راهنمایی دوستان بخصوص آقای Mahmoud Zaad
حل شد و این هم راه حل:

//پیدا کردن نام جدول های مورد نیاز
SQLiteDataAdapter da = new SQLiteDataAdapter("SELECT name FROM sqlite_master", ObjConnection);
DataTable dt = new DataTable();
da.Fill(dt);
//dataGridView1.DataSource = dt;
foreach (DataRow dr in dt.Rows)
{
if (dr["name"].ToString().StartsWith("S") && dr["name"].ToString().Length <= 6)
{
dataGridView1.Rows.Add(dr["name"].ToString());
}
}


//نوشتن کوئری بر اساس نام جدول های بالا
string _query = "";
foreach (DataGridViewRow row in dataGridView1.Rows)
{
_query += "SELECT Call_Channel, SUM(Call_Cost) FROM " + row.Cells["name"].Value.ToString() + " group by call_channel UNION ALL ";
}
_query = _query.Remove(_query.Length - 10, 10);
//richTextBox1.Text = _query;

//اجرای کوئری ساخته شده
SQLiteDataAdapter da1 = new SQLiteDataAdapter(_query, ObjConnection);
DataTable dt1 = new DataTable();
da1.Fill(dt1);
dataGridView2.DataSource = dt1;
دوستان ممنون