PDA

View Full Version : سوال: ایندکس گذاری بر روی سال مالی و چند مشکل



MahmoodM30
دوشنبه 04 دی 1396, 20:14 عصر
سلام دوستان در مورد ایندکس گذاری مطالب زیادی تو انجمن هست و منم تا حدودی مطالعه کردم ویکسری سوالات به ذهنم رسیده میخواستم بپرسم از دوستان تا راهنمایی کنن
توی یکی از برنامه هام داده هایی رو که توی گرید ویو فراخوانی میکنم بر اساس سال مالی (مثلا 1396 یا 1395 و ... ) و من یک سری عملیات رو توی کوئری هام انجام دادم مثلا جمع و تفریق روی دو سه تا فیلد جدولم حالا میخواستم ببینم توی این جدول من باید فقط روی فیلد سال مالی ایندکس بزارم کافیه؟ یا اصلا نیازی نیست؟

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

و بعضی بخش ها هم سال مالی و یک وضعیت پرداخت (True یا false) و نام روستا و نام واحد چک میشه آیا این بخش هم نیازه به هر 4 فیلد گفته شده ایندکس گذاری بشه یا نه؟ و اینکه این بخش مربوط به یک View ایجاد شده از چند جدول هست

یه نمونه از کوئری من به این شکله


SELECT NameMoshtari, SUM(AbBaha) AS JAbBaha, SUM(Pompax) AS JPompax, SUM(JameKol) AS JJameKol, SUM(COALESCE (MablagPardakhti, 0)) AS JPardakhti,
SUM(JameKol) - SUM(COALESCE (MablagPardakhti, 0)) AS JBagimande, ((CASE WHEN (SUM(JameKol)) = (SUM(COALESCE (MablagPardakhti, 0)))
THEN ('پرداخت شده') WHEN (SUM(JameKol) - SUM(COALESCE (MablagPardakhti, 0)) < 0) THEN ('بستانکار') ELSE ('بدهکار') END)) AS Results
FROM ViewOmorKoliPardakhti WHERE SaleMali = @SaleMali
GROUP BY NameMoshtari


این کوئری هم به صورت بهینه تر چجوری میشه نوشت ؟ که تائثیری در کند شدن نداشته باشه؟

ممنون میشم دوستان در این موارد راهنمایی کنن

danialafshari
چهارشنبه 06 دی 1396, 14:25 عصر
ببخشید دوستان در این مورد شدیدا نیاز به راهنمایی دارم ببخشید تاپیک رو بالا اوردم ممنون میشم دوستان راهنمایی کنن


سلام دوستان در مورد ایندکس گذاری مطالب زیادی تو انجمن هست و منم تا حدودی مطالعه کردم ویکسری سوالات به ذهنم رسیده میخواستم بپرسم از دوستان تا راهنمایی کنن
توی یکی از برنامه هام داده هایی رو که توی گرید ویو فراخوانی میکنم بر اساس سال مالی (مثلا 1396 یا 1395 و ... ) و من یک سری عملیات رو توی کوئری هام انجام دادم مثلا جمع و تفریق روی دو سه تا فیلد جدولم حالا میخواستم ببینم توی این جدول من باید فقط روی فیلد سال مالی ایندکس بزارم کافیه؟ یا اصلا نیازی نیست؟

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

و بعضی بخش ها هم سال مالی و یک وضعیت پرداخت (True یا false) و نام روستا و نام واحد چک میشه آیا این بخش هم نیازه به هر 4 فیلد گفته شده ایندکس گذاری بشه یا نه؟ و اینکه این بخش مربوط به یک View ایجاد شده از چند جدول هست

با سلام
زیاد نگران ایندکس گذاری نباشید و حساس نشید مهمترین ایندکس کلید اصلی هست که اونم خود Sql Server بصورت اتوماتیک ایندکس می کنه
در خصوص اون دیتاگرید هم باید بگم که به هر حال از یک الگویی استفاده میکنه دیگه! شما بیا اطلاعات بالا بهش بده اگر مشکلی نداشت و کند نبود پس یعنی کارش خوبه



یه نمونه از کوئری من به این شکله



1
2
3
4
5
6

SELECT NameMoshtari, SUM(AbBaha) AS JAbBaha, SUM(Pompax) AS JPompax, SUM(JameKol) AS JJameKol, SUM(COALESCE (MablagPardakhti, 0)) AS JPardakhti,
SUM(JameKol) - SUM(COALESCE (MablagPardakhti, 0)) AS JBagimande, ((CASE WHEN (SUM(JameKol)) = (SUM(COALESCE (MablagPardakhti, 0)))
THEN ('پرداخت شده') WHEN (SUM(JameKol) - SUM(COALESCE (MablagPardakhti, 0)) < 0) THEN ('بستانکار') ELSE ('بدهکار') END)) AS Results
FROM ViewOmorKoliPardakhti WHERE SaleMali = @SaleMali
GROUP BY NameMoshtari







این کوئری هم به صورت بهینه تر چجوری میشه نوشت ؟ که تائثیری در کند شدن نداشته باشه؟

ممنون میشم دوستان در این موارد راهنمایی کنن

جدا از View درباره ی بحث Calculate Field هم تحقیق کنید
خیلی جالبه
شما می تونید در sql یک ستون ایجاد کنید و برای یک فرمول تعریف کنید که مثلاً ستون 1 رو با ستون 2 جمع کن * 2 کن و از این قبیل... و خودش بصورت اتوماتیک این کارو انجام میده و همانند AutoNumber هست یعنی نمیتونید چیزی براش تنظیم کنید و کارش اتوماتیکه
قبلاً هم گفتم در نرم افزار های تجاری و بزرگ می تونید همانند نرم افزارهای (بانک) برای بالا رفتن سرعت تراکنش ها از Stored Procedure ها استفاده کنید
در ضمن اگر میخواید جواب بهتری بگیرید بهتره در بخش Sql Server سوالتون رو مطرح کنید
موفق باشید

MahmoodM30
چهارشنبه 06 دی 1396, 19:54 عصر
ممنون بابت راهنمایی ها ولی در مورد ایندکس گذاری فکر نکنم به این راحتی ها هم از کنارش باید گذشت چون خیلی مطالب خوندم در موردش و تاکید شده حتما رو یکسری فیلد ها ایندکس گذاری بشه فقط مشکل من اینجاست که روی چه فیلد هایی باشه که بالا تو تاپیک اول گفتم