PDA

View Full Version : کمک در بهینه شدن یک پروسیجر



tempali
یک شنبه 17 مهر 1390, 10:06 صبح
سلام
من جهت طراحی یک برنامه انبار داری یک پروسیجری برای بدست آوردن موجودی هر مشتری از یک کالا نوشتم که با توجه به تعداد کالاها(479) و تعداد 20 تایی مشتری ها حدود 12 دقیقه طول می کشه تا به نتیجه برسه. لطفا اگر راه حل بهتری به نظرتان می رسه کمک کنید.(اگر مدیران بخش نیاز به دریافت یک نسخه از دیتا بیس داشتن لطفا اعلام کنند)
کد مورد نظر:

CREATE procedure KAF
as
begin
declare @x varchar(4000)
declare @Y as varchar(5000)
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TKAF]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TKAF]


set @x='create table TKAF (Pname varchar(20)'
select @x=@x +', ['+cast(max([customer id]) as varchar(10))+'] varchar(4) default(0)'
from [_mojodi_total_]
group by [customer id]
order by [customer id]
set @x=@x+')'
exec (@x)
set @y='insert into tkaf(pname) select distinct [part no] from _mojodi_total_'
exec(@y)
declare @b varchar (5000)
declare @count1 int
declare @count2 int
declare @n int
declare @p int

declare @PN varchar(50)
declare @PCount int
/*-------------------*/
select @count1=count([pname]) from tkaf
select @count2=count([customer id]) from _customer_
/*--------------------*/
print (@count1)
print (@count2)
/*-----------------*/
set @n=0
set @p=1
/*---------------*/
deallocate tb3
declare tb3 cursor
FOR
select pname from tkaf
open tb3
while @p<>@count1
begin
set @p=@p+1
set @n=1
while @n<=@count2
begin
set @pcount=0
select @pcount=[rtotal] from cus_mojodi(@n ,@pn)
set @pcount=isnull(@pcount,0)
set @y='update tkaf set [' + cast(@n as varchar(5))+ ']='+ cast(@pcount as varchar(50)) + ' where pname=''' + @pn + ''''
exec(@y)
set @n=@n+1

end
fetch next from tb3 into @pn
end
exec ('select * from tkaf')
deallocate tb3
end
GO

یوسف زالی
یک شنبه 17 مهر 1390, 16:30 عصر
(ماشاا... آقا صادقیان چه سریع عکس العمل داشتند! بابا گذاشتم که پست رزرو شه!)

دوست من شما حتما می خواهی به فرم pivot داشته باشی؟
مثلا می شه به صورت زیر هم نمایش داد که خیلی سریعتره:

کالای 1 ..... 13
کالای 3 ....... 30
کالای 7 ...... 4
مشتری 1
کالای 1 ....... 15
کالای 2 ........ 4
مشتزی 2



و همین طور تا آخرین مشتری

حالا شما اجبار دارید به این نوع نمایش؟

tempali
یک شنبه 17 مهر 1390, 21:56 عصر
سلام مجدد. همانطور که در شرح موضوع خدمت دوستان عرض کردم این جدول دارای 21 ستون که کد مشتریهاست و 479 ردیف که مدل کالا می باشد که اگر بخواهیم بصورتی که شما مطرح نمودید انجام شود خیلی طولانی و غیر قابل چاپ می شود.

یوسف زالی
سه شنبه 19 مهر 1390, 22:29 عصر
دوست من کدتون رو دیدم.رو همون دیتابیسی که دادید ارور میده.
اما چند تا توصیه:
به جای کرسر از while ساده استفاده کنید.
تا می شه در توابع محاسبات سنگین انجام ندید.
تمام exec ها رو آخر سر و فقط یک بار انجام بدید.
به جای جدول واقعی از @ استفاده کنید...

tempali
چهارشنبه 20 مهر 1390, 10:02 صبح
اگر منظورتون این 2 تا اررور هست:
Server: Msg 16916, Level 16, State 1, Procedure KAF, Line 40
A cursor with the name 'tb3' does not exist.
Server: Msg 207, Level 16, State 1, Line 1
Invalid column name '1'.
مشکلی نیست اگر حدود 6:30 دقیقه صبر کنید جدول TKAF کامل ساخته شده و نمایش داده می شود.
من تازه شروع کردم به کد نوییس سمت اس کیو ال سرور و منظورتون رو از "به جای کرسر از while ساده استفاده کنید." و "به جای جدول واقعی از @ استفاده کنید..." متوجه نمی شم.

tempali
چهارشنبه 20 مهر 1390, 10:05 صبح
البته من این کد رو با دستور execute kaf اجرا می کنم.

یوسف زالی
چهارشنبه 20 مهر 1390, 11:20 صبح
نه.میگه فیلد 1 وجود نداره.
در ضمن نحوه دراپ کردن و deallocate هم اشکال داره.
یه سر به اینجا بزنید:
http://barnamenevis.org/showthread.php?299599-آشنایی-با-انواع-جداول-(استاتیک-متغیر-موقتی-..)&highlight=%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C+%D8 %A8%D8%A7+%D8%AC%D8%AF%D8%A7%D9%88%D9%84
در خصوص while هم همین روزا یک مطلبی میگذارم.
موفق باشید.

tempali
چهارشنبه 20 مهر 1390, 12:20 عصر
من در سرتاسر این کدها از جداول موقت (view) استفاده کردم.
درضمن من بیش از حد در این مورد تازه وارد هستم . (؛

Galawij
چهارشنبه 20 مهر 1390, 16:10 عصر
جداول موقت هم به نوبه خودشان زمان بر هستند!
اگر تعداد شمارنده حلقه از 100 تا کمتر هست، به جای کرسر و while از With CTE استفاده کنید.