PDA

View Full Version : کمک و راهنمایی در مورد Query بر روی دیتابیس حجیم



alimooghashang
دوشنبه 08 آبان 1391, 17:27 عصر
سلام
من یه دیتابیس دارم که تقریبا 10 ملیون رکورد داخلشه
میخوام کمکم کنید که چطوری Query های کم هزینه رو بزنم!

برای اولین سوال
استفاده از تابع IN برای شرط انتخاب، سربار اضافی داره یا نه؟
من الان ساختار دیتابیسم بصورت جدول جدوله که هرکدوم از جداول بصورت کلید بهم متصله، و اونهارو باهم Join میکنم
آیا این کار اصولیه؟
مثلا اگر جدول نام ها رو با جدول دیتا که 10 ملیون رکورد داره Join کنم سرعت میاد پایین!
باید چیکار کنم که اطلاعات هر دو جدول رو کنار هم داشته باشم؟
ممنون

fakhravari
دوشنبه 08 آبان 1391, 20:45 عصر
شخصه اطلاعات که زیاد میشه من در asp از صفحه بندی استفاده میکنم.
از روش row_number() استفاده میکنم.

mhdsbt
دوشنبه 08 آبان 1391, 23:23 عصر
از StoreProcedure استفاده کنی سرعت بسیار بالا میره چون Precompile میشه و فقط یه بار این کار انجام میشه البته باز بسته به Query که مینوسی در داخل این پروسیجر سرعت میتونه کم و زیاد بشه ولی در کل استفاده از SP رو پیشنهاد میکنم

ASKaffash
سه شنبه 09 آبان 1391, 07:05 صبح
سلام
این لینک را نگاه کنید :
http://barnamenevis.org/showthread.php?359235-مقاله-مقایسه-سرعت-روش-های-اتصال-جداول-رابطه-ای-در-بانک-اطلاعاتی-SQLServer

alimooghashang
سه شنبه 09 آبان 1391, 09:31 صبح
از StoreProcedure استفاده کنی سرعت بسیار بالا میره چون Precompile میشه و فقط یه بار این کار انجام میشه البته باز بسته به Query که مینوسی در داخل این پروسیجر سرعت میتونه کم و زیاد بشه ولی در کل استفاده از SP رو پیشنهاد میکنم
میشه یه توضیحی در موردش بدید؟ و یه مثال اگه ممکنه بزنید؟
و اینکه اگر این کار رو بکنیم چه مزیتی داره
ممنون

hamidkh
پنج شنبه 11 آبان 1391, 10:20 صبح
سلام
برای واکشی اطلاعات سعی کنید اصلا از دستور IN استفاده نکنین چون توی حجم اطلاعات بالا خیلی افت سرعت داره. همونطور که دوستمون گفتن سعی کنید از SP استفاده کنید. یه کار مهم دیگه ای که باید انجام بدین این هست که باید فیلتر ها رو درست بزنید. منظورم این هست که اول نیایید کلیه اطلاعات رو با join کردن جداول به دست بیارید بعد تازه فیلتر بزنید. فیلتر برای هر جدولی که هست موقع انتخاب فیلدهاش، فیلتر مورد نظر رو هم بزنید بعد نتیجه اش رو با بقیه جداول join کنید.

alimooghashang
پنج شنبه 11 آبان 1391, 19:01 عصر
ممنون
یعنی چی از IN استفاده نکنید و از SP استفاده کنید؟
یه مثال بزنید که چطوری باید از SP استفاده کنم ؟
ببینید من باید فیلتر بذارم که مثلا 100 تا ID رو چک کنم و رکوردهای اونا رو واکشی کنم مثلا 1,2,3,4,5,6,...

در مورد Join کردن هم سوال داشتم
چطوری میشه تفاوت سرعت Join رو با Subquery تست بزنم؟
من الان جداولم رو به هم Join میکنم
اگه بیام و جداول رو کوچیک کنم و بعد Join بزنم فرقی داره؟
مثلا فقط یک یا دو فیلد هر جدول رو بگیرم و بعد باهم Join کنم تفاوتی داره؟
ممنون

حمیدرضاصادقیان
پنج شنبه 11 آبان 1391, 22:26 عصر
سلام.
مطالبی که بیان شد تقریبا صحیح هستند و بعضی از مطالب نیز هیچ اصولی ندارند و غلط هستند.
برای متوجه شدن دقیق مطالب پیشنهاد میکنم حتما کتاب Inside T-SQL querying 2008 نوشته Itzik Ben Gan رو مخصوصا فصل اولش رو حتما مطالعه کنید اون موقع خودتون متوجه میشوید که چه قبل از join کردن چه بعد از اون تفاوت زیادی در سرعت کار شما نداره.

alimooghashang
پنج شنبه 11 آبان 1391, 22:34 عصر
یعنی هیچ تفاوتی نداره؟
حتی روی 50 ملیون رکورد؟
من الان بحثم روی تعداد رکورد بالاست
من الان یک سیستم سرور زنون 8 هسته ای با 16 گیگ رم دارم ولی کوئری بازم طول میکشه انجام بشه
میخوام ببینم چطوری باید کوئری ها رو بهینه کنم

حمیدرضاصادقیان
پنج شنبه 11 آبان 1391, 23:32 عصر
شما برای بهینه کردن Query هاتون ابتدا دستوری که اجرا میکنید رو Execution Plan اونو بگیرید و اینجا بذارید تا دقیقا بررسی بشه مشکل شما از کجاست.

baktash.n81@gmail.com
دوشنبه 15 آبان 1391, 09:32 صبح
البته تا یه جایی می شه Query ها رو بهینه کرد ... بعد از اون می تونید برید سراغ Tuning بانک تون ... مباحثی مثل Index و Partition و File Group و ...

alimooghashang
یک شنبه 21 آبان 1391, 14:46 عصر
شما برای بهینه کردن Query هاتون ابتدا دستوری که اجرا میکنید رو Execution Plan اونو بگیرید و اینجا بذارید تا دقیقا بررسی بشه مشکل شما از کجاست.

چطوری این کار رو انجام بدم؟

Salah Sanjabian
یک شنبه 21 آبان 1391, 16:48 عصر
دستورت رو انتخاب کن و Ctrl+L رو بگیر بعد Execution Plan رو ذخیره کن