PDA

View Full Version : سوال: حجم Query



jaza_sa
دوشنبه 04 شهریور 1387, 00:18 صبح
سلام
حجم Query که به SQL Servrver 2005 فرستاده میشه ، تا چه سقفیه؟
آیا محدودیت خاصی وجود داره؟
آیا میشه دستور Select ی نوشت که مثلا قسمت Where اون 5000 تا شرط AND و OR داشته باشه؟
کارایی همچین Query ی چطوره؟

ممنون

amin_alexi
دوشنبه 04 شهریور 1387, 10:33 صبح
سلام
محدودیت واسه من پیش اومده ...
مثلا در تعداد View های استفاده شده در یک Query (به من یک سری گیر داد و گفت بیش از 255 View دز یک Query استفاده کرد)
این رو من تجربه کردم و یادم مونده ...!!

rezarafiee
دوشنبه 04 شهریور 1387, 11:18 صبح
ببینید آدرس زیر به شما کمک می کند
http://msdn.microsoft.com/en-us/library/ms143432.aspx

jaza_sa
دوشنبه 04 شهریور 1387, 16:23 عصر
با تشکر

خوب برای اینکه همچین کارایی بکنیم ، چه راه حلی وجود داره؟
مثلا اگر از یک جدول temp استفاده کنیم
یعنی دیتای اولیه رو در اون insert کنیم و بعد جستجو رو دراخل این جدول انجام بدیم !!!

amin_alexi
سه شنبه 05 شهریور 1387, 07:49 صبح
عمل Insert خودش یک عمل زمانبره !؟
شاید ساختار جداولت ایراد داشته باشه که مجبور شدی 5000 شرط AND و OR بزاری !؟
شما اول بگو چرا 5000 تا شرط AND و OR شاید راه بهتری وجود داشته باشه !

jaza_sa
سه شنبه 05 شهریور 1387, 09:45 صبح
فرض کنید جدول مشتری با 4 فیلد زیر است :
کد مشتری - نام - نام خانوادگی - توضیحات

در طی جستجویی به لیستی از 5000 مشتری میرسیم و این لیست رو مورد مطالعه قرار میدهیم ،
مثلا یک کلمه خاص رو در فیلد توضیحات مربوط به آنها جستجو کنیم
مثلا میخواهیم کلمه "خرید" رو در فیلد "توضیحات" این 5000 مشتری جستجو کنیم و یافته ها رو برای کاربر نمایش بدیم
T-SQL که مینویسیم ، چیزی شبیه به اینه :

select * from customer where
cId=1 and cId=12 and cId=45 and cId=18 and cId=39 and ...
حالا من باید چیکار کنم که کاربر برای دفعات بعد بتونه برروی این لیست جستجوهای دیگه ای کنه
و همچنین بتونه نتایج هم ذخیره کنه !!!

amin_alexi
سه شنبه 05 شهریور 1387, 10:25 صبح
سلام
فکر می کنم اگه از این روش که میکم استفاده کنی اصلا نیازی به این 5000 شرط نباشه ...


select * from customer
where CId in ( *** )


حالا به جای ( *** ) جه چیزی میتونی بزاری !؟
الان میگم ...

(1,12,45,18,22,13,331,33) یک لیست از اعداد که با "," از هم جدا شدن
یا



(Select cId From Customer
Where Tozihat='ali' )



همونطور که می بینی میشه از where CId in استفاده کرد ...

mehdi.mousavi
سه شنبه 05 شهریور 1387, 10:48 صبح
فرض کنید جدول مشتری با 4 فیلد زیر است :
کد مشتری - نام - نام خانوادگی - توضیحات
در طی جستجویی به لیستی از 5000 مشتری میرسیم و این لیست رو مورد مطالعه قرار میدهیم ،مثلا یک کلمه خاص رو در فیلد توضیحات مربوط به آنها جستجو کنیم مثلا میخواهیم کلمه "خرید" رو در فیلد "توضیحات" این 5000 مشتری جستجو کنیم و یافته ها رو برای کاربر نمایش بدیم
T-SQL که مینویسیم ، چیزی شبیه به اینه :

select * from customer where
cId=1 and cId=12 and cId=45 and cId=18 and cId=39 and ...حالا من باید چیکار کنم که کاربر برای دفعات بعد بتونه برروی این لیست جستجوهای دیگه ای کنه
و همچنین بتونه نتایج هم ذخیره کنه !!!

سلام.
شما در واقع دفعه اول دارید اون 5000 تا رکورد رو به سمت Client منتقل میکنید. از اینجا به بعد میتونید با DataSet ها یا هر Object Model دیگه ای که مایل باشید کار کنید و در واقع Disconnected ادامه بدید. به این معنی که اطلاعات 5000 مشتری در جستجوی بار اول در DataSet ای قرار میگیره و این DataSet روی ماشین Client میتونه Cache بشه. جستجوی های بعدی رو باید روی این DataSet و توسط XPATH ها اعمال کنید و دیگه نیازی نبست سراغ بانک اطلاعاتی برید.

jaza_sa
سه شنبه 05 شهریور 1387, 21:55 عصر
سلام.
شما در واقع دفعه اول دارید اون 5000 تا رکورد رو به سمت Client منتقل میکنید. از اینجا به بعد میتونید با DataSet ها یا هر Object Model دیگه ای که مایل باشید کار کنید و در واقع Disconnected ادامه بدید. به این معنی که اطلاعات 5000 مشتری در جستجوی بار اول در DataSet ای قرار میگیره و این DataSet روی ماشین Client میتونه Cache بشه. جستجوی های بعدی رو باید روی این DataSet و توسط XPATH ها اعمال کنید و دیگه نیازی نبست سراغ بانک اطلاعاتی برید.

خیلی ممنون و متشکرم
حرف شما درسته ، من ابتدا اطلاعات رو از دیتابیس میخونم و در یک Collection ذخیره میکنم
همچینین این Collection رو به صورت static تعریف کردم تا در فرم های دیگه هم قابل دسترس باشه و ...
ولی تکنیکی برای Cache کردن اطلاعات بکار نبردم ، فکر کنم همون موقع که اطلاعات رو میخونیم Cache میشه ، آیا این درسته ؟!!!
متاسفانه چیزی در مورد XPATH ها نمیدونم ، میشه کمی راهنماییم کنید ؟!!!

بازم ممنونم :خجالت:

linux
سه شنبه 05 شهریور 1387, 23:04 عصر
فرض کنید جدول مشتری با 4 فیلد زیر است :
کد مشتری - نام - نام خانوادگی - توضیحات

در طی جستجویی به لیستی از 5000 مشتری میرسیم و این لیست رو مورد مطالعه قرار میدهیم ،
مثلا یک کلمه خاص رو در فیلد توضیحات مربوط به آنها جستجو کنیم
مثلا میخواهیم کلمه "خرید" رو در فیلد "توضیحات" این 5000 مشتری جستجو کنیم و یافته ها رو برای کاربر نمایش بدیم
T-SQL که مینویسیم ، چیزی شبیه به اینه :

select * from customer where
cId=1 and cId=12 and cId=45 and cId=18 and cId=39 and ...
حالا من باید چیکار کنم که کاربر برای دفعات بعد بتونه برروی این لیست جستجوهای دیگه ای کنه
و همچنین بتونه نتایج هم ذخیره کنه !!!
یکی از کاربرد جداول موقت برای همین حالت هست ، خروجی شما یک جدول موقت است که می توانید جستجوی های دیگری در آن انجام بدهید در زمان می توانید این کار را هم سمت کلاینت انجام دهید بعد از جستجوی اولیه مثلا اطلاعات رکورد ها در یک دیتاست ذخیره می شوند و سپس بقیه عملیات بر روی آن انجام می گیرد.

jaza_sa
چهارشنبه 06 شهریور 1387, 01:12 صبح
یکی از کاربرد جداول موقت برای همین حالت هست ، خروجی شما یک جدول موقت است که می توانید جستجوی های دیگری در آن انجام بدهید در زمان می توانید این کار را هم سمت کلاینت انجام دهید بعد از جستجوی اولیه مثلا اطلاعات رکورد ها در یک دیتاست ذخیره می شوند و سپس بقیه عملیات بر روی آن انجام می گیرد.

خوب دوستان حالا به نظر شما کدوم راه بهتره ؟
اول همه نتایج رو در یک جدول موفت در دیتابیس ذخیره کنم !!!
یا
نتیجه جستجو رو دریک List بریزم و سمت کلاینت ازش استفاده کنم !!!

amin_alexi
چهارشنبه 06 شهریور 1387, 09:10 صبح
اگه از نتایج جستجو فقط یک فیلد مد نظرت هست میتونی از لیست در حافظه استفاده کنی !(به شرطی که خیلی بزرگ نشه)
وگرنه میتونی در جدول Temp
هر دو معایب و مزایایی داره که باید با توجه به کاربرد برنامه تست بشه ..
شما هم تست کن ببین کدوم کارایی بالاتری داره با زمان هر دو رو تست کن ... .

mehdi.mousavi
چهارشنبه 06 شهریور 1387, 10:35 صبح
خیلی ممنون و متشکرم حرف شما درسته ، من ابتدا اطلاعات رو از دیتابیس میخونم و در یک Collection ذخیره میکنم همچینین این Collection رو به صورت static تعریف کردم تا در فرم های دیگه هم قابل دسترس باشه و ... ولی تکنیکی برای Cache کردن اطلاعات بکار نبردم ، فکر کنم همون موقع که اطلاعات رو میخونیم Cache میشه ، آیا این درسته ؟!!! متاسفانه چیزی در مورد XPATH ها نمیدونم ، میشه کمی راهنماییم کنید ؟!!! بازم ممنونم :خجالت:

سلام.
شما به هر حال بعد از اولین Search میخواهید Result Set ای رو به کاربر نشون بدید. پس مجبور هستید اطلاعات مزبور رو به سمت Client منتقل کنید. در نتیجه نیازی به نگهداری اونها سمت Server ندارید، چون قرار نیست فرد دیگه ای از ماشین دیگه ای به اون Result Set ای که کاربر 1 به اون رسیده، کاری داشته باشه. چون کاربر 2 داره شرایط خودش رو برای جدا کردن Result Set عنوان میکنه، و این شرایط لزوما با شرایط تعیین شده توسط کاربر 1 یکسان نیستن.

پس این نظریه که اطلاعات رو بخواهید در جدول موقتی در SQL Server نگه دارید، از نظر من، منتفی هستش. (مگر اینکه موارد ناگفته ای در شرایط وجود داشته باشه).

اما در مورد Disconnected بودن اطلاعات... بله، وقتی شما اطلاعات رو درون DataSet ریختید، تا مادامیکه اون DataSet رو تغییر ندادین یا Dispose نکردین میتونید در برنامه حفظش کنید. حالا جستجوهای بعدی رو میتونید توسط XPATH QUERY ها روی DS مزبور اعمال کنید و sub set ای از رکوردهایی که الان سمت Client هست بدست بیارید. XPath Query زبانی هستش که به شما اجازه iterate کردن در XML رو میده. به این ترتیب میتونید جستجوهای بعدی رو جای اینکه توسط SQL و روی RDBMS اعمال کنید، توسط XPath روی DS اعمال کنید و به نتایج مورد نظر کاربر برسید.

در مورد Static تعریف کردن Collection هم مراقب Concurrent Access ها از چند Thread باشید. اگر همواره از طریق Main Thread به این Collection دسترسی پیدا میکنید، مشکلی پیش نخواهد آمد، اما اگر ممکنه از چند Thread این Collection رو مورد خطاب قرار بدین، اونوقت باید این Collection رو Thread-Safe کنید.