PDA

View Full Version : حرفه ای: مرتب کردن شرطی



mokh_pascal_sangesary
پنج شنبه 01 مهر 1389, 16:42 عصر
سلام
من چندین جدول دارم که با یک سری محاسبات یک ویو (view) میسازم که سرعتش راضی کننده هستش
قسمت مرتب کردن این کوئری با یک فیلد خاص است ولی در صورتی که این فیلد برابر باشد من میخوام قسمت دوم مرتب کردن اجرا بشه



select * from view1 order by id_kala desc , dbo.f_calculate(id) desc


چون رکوردهای این جدول زیاد هستند و کار تابع calculate که دارم پیچیده هستش ، باعث میشه سرعت اجرای کوئری خیلی پایین بیاد

من میخوام طوری به دستورات sql بفهمونم که وقتی آی دی ها با هم برابر بود ، اون وقت قسمت دیگه مرتب سازی اجرا بشه نه اینکه همبشه.

MOJTABAATEFEH
پنج شنبه 01 مهر 1389, 17:02 عصر
سلام
من چندین جدول دارم که با یک سری محاسبات یک ویو (view) میسازم که سرعتش راضی کننده هستش
قسمت مرتب کردن این کوئری با یک فیلد خاص است ولی در صورتی که این فیلد برابر باشد من میخوام قسمت دوم مرتب کردن اجرا بشه



select * from tbl1 order by id desc , dbo.f_calculate(id) desc
چون رکوردهای این جدول زیاد هستند و کار تابع calculate که دارم پیچیده هستش ، باعث میشه سرعت اجرای کوئری خیلی پایین بیاد

من میخوام طوری به دستورات sql بفهمونم که وقتی آی دی ها با هم برابر بود ، اون وقت قسمت دیگه مرتب سازی اجرا بشه نه اینکه همبشه.

دوست عزیز قسمت دوم مرتب سازی شما هم حتما یک فیلد دیگه از همان جدول است ببینید شما وقتی در Order by نام فیلد ها رو به ترتیبی که می خواین بنویسید خود SQL اینکار رو برای شما انجام میده و ابتدا و به ترتیبی که شما فیلدها رو نوشتید شروع به مرتب سازی می کنه در نتیجه وقتی فیلدهای اول مساوی بودن بر اساس فلیدهای دوم و اگر فیلدهای دوم برابر بودن سوم و چهارم و پنجم و ششم و ...... مرتب سازی رو انجام میده

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


موفق باشید

mokh_pascal_sangesary
پنج شنبه 01 مهر 1389, 17:10 عصر
دوست عزیز قسمت دوم مرتب سازی شما هم حتما یک فیلد دیگه از همان جدول است

[/CENTER]
حتماً که نباید فیلد دوم از فیلدهای همان جدول باشد
عرض کردم قسمت دوم مرتب سازی من تابعی سنگین هست.
متاسفانه اس کیو ال همه توابعی که در پارامترهای مرتب سازی نوشته بشه رو محاسبه و سپس مقایسه میکنه ولی باید راحی داشته باشه که بگیم این قسمت ها رو در صورتی محاسبه کن که مقادیر قبلی مرتب سازی یکسان بودند

کسی به این مشکل برخورد کرده ؟

mokh_pascal_sangesary
پنج شنبه 01 مهر 1389, 17:57 عصر
کسی برخورد نکرده به این مشکل؟

بهزادصادقی
پنج شنبه 01 مهر 1389, 20:34 عصر
من میخوام طوری به دستورات sql بفهمونم که وقتی آی دی ها با هم برابر بود ، اون وقت قسمت دیگه مرتب سازی اجرا بشه نه اینکه همبشه.

این کار غیر ممکن است. SQL Server اول می آید و برای هر سطر در مجموعه جواب select شما مقدایر ستون های لحاظ شده در اصطلاح ORDER BY شما را اول محاسبه می کند، و تنها بعد از اینکه تمام این مقادیر برای تمام سطرها محاسبه شده، می آید و با استفاده از یک آلگوریتم SORT، کل سطرهای مجموعه جواب SELECT شما را بر اساس مقادیر محاسبه شده مرتب می کند.

کد تابع تان را اینجا درج کنید، شاید بتوان سریعترش کرد.

mokh_pascal_sangesary
پنج شنبه 01 مهر 1389, 21:24 عصر
کد تابع تان را اینجا درج کنید، شاید بتوان سریعترش کرد.



select * from view1 order by id_kala desc , dbo.f_calculate(id) desc


ممنونم بابت پاسختون
بله من هم فکر کنم نشه
نمیدونم چه کار کنم ؟

بهزادصادقی
پنج شنبه 01 مهر 1389, 21:31 عصر
گفتم. یک راه این است که سرعت تابع خود را ببرید بالا. اگر کدش را اینجا درج کنید شاید یشود کاری کرد.

دیگر این است که باید بدانم از این query شما چگونه دارید استفاده می کنید. می شود توضیحات خیلی دقیق و بیشتری بدهید و حتی مثال بزنید.

تخصص من بالا بردن و بهینه کردن عملکرد query های SQL Server می باشد. اگر به اندازه کافی داده ها به من بدهید، شاید بتوانم کمک تان کنم.

mokh_pascal_sangesary
جمعه 02 مهر 1389, 19:39 عصر
تخصص من بالا بردن و بهینه کردن عملکرد query های SQL Server می باشد. اگر به اندازه کافی داده ها به من بدهید، شاید بتوانم کمک تان کنم.

باز هم ممنون
عملکرد تابع من ایرادی نداشت ولی با شبیه سازی عملیات ایندکس سازی تونستن تابع رو از حالتی که به ازای هر رکورد کلی عملیات انجام بده به حالت یک سلکت ساده درش بیارم
باز هم ممنون
موفق باشی