banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm  XML
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 21/07/2010 10:14:35 (+0700) | #1 | 215867
lama
Member

[Minus]    0    [Plus]
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
[Profile] [PM]
Chào mọi người,

Mình đang gặp khó khăn với ứng dụng ERP có dữ liệu lớn (hiện tại khỏang 20GB/company, tổng file .mdf bao gồm nhiều company là 50GB)
Khi in các báo cáo Tồn kho và Doanh số thì truy xuất hệ thống chậm và thậm chí treo 1 số máy ở bộ phận nhập liệu Đơn hàng/hóa đơn.
Mình không chuyên sâu về SQL và không tìm được nguyên nhân gây ra vấn đề ở đây. Vậy có bạn nào hiểu sâu về SQL cũng như cách thức tìm nguyên nhân, tối ưu hóa SQL thì giúp mình với.

Nếu vấn đề này không thể chia sẻ trên diễn đàn, bạn có thể liên hệ trực tiếp mình cũng được. Xem như là mình đang tìm dịch vụ vậy mà.

Mọi người ai biết ai rành thì cũng chỉ giúp mình nhé.

Cám ơn nhiều.

Thông tin thêm :

Server IBM x3650 2x3.0Ghz Quad Core, 6GB RAM, 5x146GB SAS RAID5, Windows 2003 Ent SP1, SQL Server 2005 Ent.
Lúc bị treo đó thì thấy RAM, CPU trên Server cũng ở mức thấp (chừng 20%=30%), không bị overload.

Nguyễn Phúc Nguyên
0909.899.235
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 21/07/2010 10:27:05 (+0700) | #2 | 215869
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

lama wrote:
Chào mọi người,

Mình đang gặp khó khăn với ứng dụng ERP có dữ liệu lớn (hiện tại khỏang 20GB/company, tổng file .mdf bao gồm nhiều company là 50GB)
Khi in các báo cáo Tồn kho và Doanh số thì truy xuất hệ thống chậm và thậm chí treo 1 số máy ở bộ phận nhập liệu Đơn hàng/hóa đơn.
Mình không chuyên sâu về SQL và không tìm được nguyên nhân gây ra vấn đề ở đây. Vậy có bạn nào hiểu sâu về SQL cũng như cách thức tìm nguyên nhân, tối ưu hóa SQL thì giúp mình với.

Nếu vấn đề này không thể chia sẻ trên diễn đàn, bạn có thể liên hệ trực tiếp mình cũng được. Xem như là mình đang tìm dịch vụ vậy mà.

Mọi người ai biết ai rành thì cũng chỉ giúp mình nhé.

Cám ơn nhiều.

Thông tin thêm :

Server IBM x3650 2x3.0Ghz Quad Core, 6GB RAM, 5x146GB SAS RAID5, Windows 2003 Ent SP1, SQL Server 2005 Ent.
Lúc bị treo đó thì thấy RAM, CPU trên Server cũng ở mức thấp (chừng 20%=30%), không bị overload.

Nguyễn Phúc Nguyên
0909.899.235
 


W2k3 và MSSQL này chạy phiên bản 32-bit hay 64-bit?

Phương thức kết nối và "commit data" từ các applications đến CSDL cụ thể như thế nào?
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 21/07/2010 11:05:15 (+0700) | #3 | 215874
qtra004
Member

[Minus]    0    [Plus]
Joined: 19/04/2004 22:36:57
Messages: 298
Location: Kiwiland
Offline
[Profile] [PM]
Ngoài những thông tin anh conmale hỏi? Bạn có thể dùng Activity Monitor trên SQL Management Studio để xem lúc application chạy report, những query gì đang chạy và những process có bị lock không? Loại lock là gì? Nếu bạn biết được sql query của process để generate report thì bạn thảy lên đây để mình xem thử xem query đó có optimised cho performance chưa?

Bạn cũng có thể dùng SQL Sever Profiler để trace performance của SQL lúc bạn chạy report từ application.
Carpe diem quam minimum credula postero
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 21/07/2010 22:09:07 (+0700) | #4 | 215942
lama
Member

[Minus]    0    [Plus]
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
[Profile] [PM]

conmale wrote:

W2k3 và MSSQL này chạy phiên bản 32-bit hay 64-bit?

Phương thức kết nối và "commit data" từ các applications đến CSDL cụ thể như thế nào? 


Dạ, W2k3 và SQL thì đều đang chạy 32 bit. Em không rõ lắm cách "commit data" của Application. Nhưng biết là ứng dụng gọi các COM+ App và DCOM, trong database thì em không thấy lưu các Stored Proc phục vụ insert,update,delete dữ liệu gì cả, chỉ có 1 vài stored phục vụ đăng nhập, phân quyền, ... Đây là 1 ứng dụng ERP cũng ở tầm trung và brochure thì cũng có nói là dữ liệu được mã hoá gởi giữa Client đến Server (ứng dụng chạy Client/Server). Không đề cập đến cơ chế hoạt động bên dưới nên em không được biết.

qtra004 wrote:

Ngoài những thông tin anh conmale hỏi? Bạn có thể dùng Activity Monitor trên SQL Management Studio để xem lúc application chạy report, những query gì đang chạy và những process có bị lock không? Loại lock là gì? Nếu bạn biết được sql query của process để generate report thì bạn thảy lên đây để mình xem thử xem query đó có optimised cho performance chưa?
 


Mình sẽ thử xem sao, có gì sẽ post lên đây nhờ mọi người giúp đỡ.

À, quên nói 1 vấn đề quan trọng là Các báo cáo mà mình đề cập bên trên là Báo cáo do công ty Customize, mình nghĩ chắc cách viết không tối ưu, gây lock table hay sao (trình độ coding của người customize báo cáo có hạn, mình cũng không rành nên đọc code cũng không tìm ra chổ nào để tối ưu được). Các báo cáo có sẵn của chương trình thì mặc dù in lâu nhưng không làm treo các máy con nhập liệu Hoá đơn.

Cám ơn mọi người nhiều lắm.
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 21/07/2010 22:43:04 (+0700) | #5 | 215945
cvhainb
Member

[Minus]    0    [Plus]
Joined: 04/01/2007 14:32:38
Messages: 251
Offline
[Profile] [PM]
Mình chỉ có thể góp ý thêm một chút về các vấn đề về truy vấn (query).

Đối với package lớn như bạn mô tả thì việc các câu truy vấn dữ liệu như thế nào cũng rất quan trọng. Với dữ liệu lớn mà báo cáo khi in ra là trong khoảng thời gian là 1, 2 năm thì việc treo máy cũng là thường.

Để dễ dàng bạn chỉ nên xem lại đoạn code chỗ nhập liệu, thử xem.

Thân
smilie
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 21/07/2010 23:12:44 (+0700) | #6 | 215947
lama
Member

[Minus]    0    [Plus]
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
[Profile] [PM]

cvhainb wrote:
Mình chỉ có thể góp ý thêm một chút về các vấn đề về truy vấn (query).

Đối với package lớn như bạn mô tả thì việc các câu truy vấn dữ liệu như thế nào cũng rất quan trọng. Với dữ liệu lớn mà báo cáo khi in ra là trong khoảng thời gian là 1, 2 năm thì việc treo máy cũng là thường.

Để dễ dàng bạn chỉ nên xem lại đoạn code chỗ nhập liệu, thử xem.

Thân
smilie
 


Cám ơn bạn đã chia sẻ. Ứng dụng ERP này của 1 tập đoàn nước ngoài nên mình không có xem code chổ nhập liệu được.
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 21/07/2010 23:53:00 (+0700) | #7 | 215951
lama
Member

[Minus]    0    [Plus]
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
[Profile] [PM]
Mình post 1 stored proc dùng để Liệt kê các thành phẩm xuất kho. Mỗi ngày có khoảng 200-300 Hoá đơn, mỗi Hoá đơn có khoảng 10 dòng --> khoảng 2000-3000 dòng trong bảng chứa nghiệp vụ xuất kho mỗi ngày (chưa tính nghiệp vụ khác như nhập, chuyển kho (2 nghiệp vụ này ít hơn) .... cũng nằm cúng 1 bảng nghiệp vụ kho này).

Code:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER                                   PROCEDURE [dbo].[GL_BK_ThanhPhamXuat]
		@Para1		NVARCHAR(20)	--@CompID
		,@Para2		NVARCHAR(20)	--@FYear
		
		,@Para3		NVARCHAR(20)	--CustCodeFrom
		,@Para4		NVARCHAR(20)	--CustCodeTo

		,@Para5		NVARCHAR(20)	--StockFrom
		,@Para6		NVARCHAR(20)	--StockTo

		,@Para7		NVARCHAR(20)	--@FromDate
		,@Para8		NVARCHAR(20)	--@ToDate

AS
--[GL_BK_ThanhPhamXuat] '01','10','','','M6009','M6009','100420','100426'
SET NOCOUNT ON
BEGIN
---==DECLARE AND INTINITIALIZE THE GLOBAL VARIANCE==-- 

	DECLARE @CompID as NVARCHAR(20)
	SET @CompID = @Para1
	 
	DECLARE @FYear as NVARCHAR(20)
	SET @FYear = @Para2

	DECLARE @CustCodeFrom as NVARCHAR(20)
	SET @CustCodeFrom = @Para3
	
DECLARE @CustCodeTo as NVARCHAR(20)
	SET @CustCodeTo = @Para4

DECLARE @StockFrom as NVARCHAR(20)
	SET @StockFrom = @Para5

DECLARE @StockTo as NVARCHAR(20)
	SET @StockTo = @Para6

	DECLARE @FromDate as NVARCHAR(20)
	SET @FromDate = @Para7
	 
	DECLARE @ToDate as NVARCHAR(20)
	SET @ToDate = @Para8

	DECLARE @SqlStr NVARCHAR(4000)

	IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[tbThanhPhamXuat]')
						AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
				DROP TABLE [dbo].[tbThanhPhamXuat]

	IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[tbBangLuuHoaDonChoTPXuat]')
						AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
				DROP TABLE [dbo].[tbBangLuuHoaDonChoTPXuat]
CREATE TABLE tbBangLuuHoaDonChoTPXuat
(
SoHoaDon nvarchar(50)
)
	SET @SqlStr = " INSERT INTO tbBangLuuHoaDonChoTPXuat SELECT "
+" distinct SL03002 from SL03" + @CompID + "00 "
+ "  where 	SL03005 BETWEEN '" + CONVERT(NVARCHAR(10),convert(datetime,@FromDate),112) + "'"
		+ "  AND	'" + CONVERT(NVARCHAR(10),convert(datetime,@ToDate),112) + "'"
	EXECUTE sp_executesql @SqlStr
update tbBangLuuHoaDonChoTPXuat
set SoHoaDon=Replace (SoHoaDon,'R','')
--select * from tbBangLuuHoaDonChoTPXuat
	CREATE TABLE tbThanhPhamXuat
	(
		MA_KH			NVARCHAR(20)
		,MA_HANG 		NVARCHAR(20)		
		,TEN_HANG		NVARCHAR(50)	
		,QUY_CACH		NVARCHAR(100)	
		,DON_VI_TINH		NVARCHAR(50)
		,TAI_KHOAN_DU		NVARCHAR(50)
		,SO_LUONG		FLOAT
		,DON_GIA_BAN		FLOAT	
--		,GIA_VON		FLOAT
		,THANH_TIEN		FLOAT
--		,THANH_TIEN_VON		FLOAT
		,MA_KHO			NVARCHAR(50)
--		,TEN_KHO		NVARCHAR(50)
--		,LOAI_NV		NVARCHAR(50)					bo 5/8/09              
--		,TEN_NV		NVARCHAR(50)                        bo 5/8/09 
		,SO_DON_HANG		NVARCHAR(50)
		,SO_HOA_DON		NVARCHAR(50)
		,GHI_CHU		NVARCHAR(50)
		,LOAI_NHAP_XUAT		NVARCHAR(50)
		,TI_LE_CK		NVARCHAR(50)
		,NGAY_HOA_DON		DATETIME	
--,SO_LO NVARCHAR(50)
	)
	SET @SqlStr = " INSERT INTO tbThanhPhamXuat SELECT "
		+ "  SC07006		AS	[MA_KH]"
		+ ", SC07003 		AS 	[MA_HANG]"
		+ ", SC01002		AS 	[TÊN_HÀNG]"
		+ ", SC01003		AS 	[QUY_CACH]"
		+ ", SC01135		AS 	[DON_VI_TINH]"
		+ ", ''			AS 	[TAI_KHOAN_DU]"
		+ ", SC07004		AS 	[SO_LUONG]"
		+ ", ROUND(SC07010,2)	AS 	[DON_GIA_BAN]"
--		+ ", SC07005		AS	[GIA_VON]"
		+ ", 0			AS 	[THANH_TIEN]"
--		+ ", 0			AS 	[THANH_TIEN_VON]"
		+ ", SC07009		AS 	[MA_KHO]"
--		+ ", SC23002		AS 	[TEN_KHO]"	
--		+ ", SUBSTRING(SC07012,49,2)			AS 	[LOAI_NV]"            bo 5/8/09
--		+ ", ''			AS	[TEN_NV]"                                     bo 5/8/09
		+ ", SC07007		AS	[SO_DON_HANG]"
		+ ", SC07056			AS	[SO_HOA_DON]"
		+ ", SC07055			AS	[GHI_CHU]"
		+ ", CONVERT(INT, SC07013)	AS	[LOAI_NHAP_XUAT]"
		+ ", ''				AS	[TI_LE_CK]"
		+ ", '1900/01/01'		AS 	[NGAY_HOA_DON]"
		--+",SC07029 "
		+ "  FROM 	SC07" + @CompID + "00 INNER JOIN SC01" + @CompID + "00 ON  SC07003 = SC01001"
	--	+ "  INNER JOIN SC23" + @CompID + "00 ON SC07009 = SC23001"
	--	+ "  INNER JOIN SL03" + @CompID + "00 ON SC07056 = SL03002 OR RTRIM(SC07007) + 'R' = SL03002"
		+ "  WHERE 	SC07001 = '01'"
		+ "  AND 	LEFT(SC07003,1) in ( 'A','M')"
--		+ "  AND 	(CONVERT(INT, SC07013) = 49"				-- XUAT BAN
--		+ "  OR		(CONVERT(INT, SC07013) NOT IN (66) AND SC07004 > 0))"	--TRA HANG TRONG STOCK ISSUED VOI SO LUONG AM
--		+ "  AND	(CONVERT(INT, SC07013) NOT IN (66) AND SC07004 > 0))"	--TRA HANG TRONG STOCK ISSUED VOI SO LUONG AM
--		+ "  AND 	SC07009 BETWEEN '" + @WareCodeFrom + "' AND '" + @WareCodeTo + "'"
	--	+ "  AND	SL03005 BETWEEN '" + CONVERT(NVARCHAR(10),@FromDate,112) + "'"
		--+ "  AND	'" + CONVERT(NVARCHAR(10),@ToDate,112) + "'"
+" and SC07056 in (select SoHoaDon from tbBangLuuHoaDonChoTPXuat)"
		+ "  AND 	SUBSTRING(SC07012,49,2) <> '92'"             
--if @CustCodeFrom<>''
--SET @SqlStr =@SqlStr  + " and SC07006 between '" +@CustCodeFrom+"' and '"+@CustCodeTo+"'"
--
if @StockFrom <>''
SET @SqlStr =@SqlStr  + " and  SC07003 between '" +@StockFrom+"' and '"+@StockTo+"'"


		SET @SqlStr =@SqlStr  + "  ORDER BY 	SC01002"
print @SqlStr
		EXECUTE sp_executesql @SqlStr

--SELECT * FROM tbThanhPhamXuat ORDER BY SO_DON_HANG

 
/*
	UPDATE 	tbThanhPhamXuat
	SET 	THANH_TIEN_VON = SO_LUONG * GIA_VON
*/
	SET @SqlStr = "	UPDATE tbThanhPhamXuat"
		+ " SET		SO_HOA_DON  =	OR20021"
		+ "		,TI_LE_CK   = 	OR20051"
		+ "		,NGAY_HOA_DON   = 	OR20022"
		+ " FROM 	tbThanhPhamXuat, OR20" + @CompID + "00"
		+ " WHERE 	SO_DON_HANG = OR20001"


		EXECUTE sp_executesql @SqlStr
/*
SELECT * FROM tbThanhPhamXuat
WHERE SO_DON_HANG = '0309000040'
*/
	UPDATE tbThanhPhamXuat
	SET 	SO_HOA_DON 	= 	SO_DON_HANG
	WHERE 	SO_HOA_DON  = 	''


	-----------------------------------
	--GIA DUOI KHO KHAC TREN DON HANG--
	-----------------------------------

	UPDATE tbThanhPhamXuat
	SET DON_GIA_BAN = 0
	WHERE SO_HOA_DON = '08/0109319'

	UPDATE tbThanhPhamXuat
	SET DON_GIA_BAN = 368.6
	WHERE SO_HOA_DON = '08/083294'
	
	DELETE tbThanhPhamXuat
	WHERE SO_DON_HANG = '08/076853' --ĐIỀU CHỈNH HỦY HĐ CỦA THÁNG KHÁC
	-----------------------------------


	UPDATE 	tbThanhPhamXuat
	SET 	THANH_TIEN = SO_LUONG * ROUND(DON_GIA_BAN, 2)

	SET @SqlStr = "	UPDATE tbThanhPhamXuat"
		+ " SET		GHI_CHU  =	OR22008"
		+ " FROM 	tbThanhPhamXuat, OR22" + @CompID + "00"
		+ " WHERE 	SO_DON_HANG = OR22001"


		EXECUTE sp_executesql @SqlStr

--	SET @SqlStr = " UPDATE tbThanhPhamXuat"                                  -- bo 5/8/09
----		+ " SET 	TEN_NV = GL03003"--, MO_TA = GL03004"                -- doan nay
--		+ " FROM	tbThanhPhamXuat, GL03" + @CompID + @FYear                --
----		+ " WHERE	LOAI_NV = GL03002"                                   --  
--		+ " AND 	GL03001 = 'J'"                                           --
--
--		EXECUTE sp_executesql @SqlStr                                        --

	---------------------------------------------------
	 /* Dinh nghia bang tam luu don vi tinh (Unit) */
	---------------------------------------------------
	IF EXISTS(SELECT name FROM sysobjects WHERE name = 'tbUnitText_ThahPhamXuat')
		DROP TABLE tbUnitText_ThahPhamXuat

	DECLARE @dem AS INT
	SET @dem = 1

	CREATE TABLE tbUnitText_ThahPhamXuat
	(
		idcol int primary key
		,UnitText nvarchar(50)
	)
	
	SET @dem = 0
	WHILE @dem <= 40
	  BEGIN
		IF @dem <= 7
			SET @SqlStr = " INSERT INTO tbUnitText_ThahPhamXuat "
						+ " SELECT '" + CONVERT(nvarchar, @dem)  + "', SC0900" + CONVERT(nvarchar,(@dem + 2)) 
						+ " FROM SC09" + @CompID + "00 WHERE SC09001 = 'AME'"
		ELSE
			SET @SqlStr = "INSERT INTO tbUnitText_ThahPhamXuat "
						+ " SELECT '" + CONVERT(nvarchar, @dem)  + "', SC090" + CONVERT(nvarchar,(@dem + 2)) 
						+ " FROM SC09" + @CompID + "00 WHERE SC09001 = 'AME'"
	
		EXECUTE sp_executesql @SqlStr
		SET @dem = @dem + 1
	  END

	UPDATE tbThanhPhamXuat
	SET 	DON_VI_TINH = UnitText
	FROM	tbThanhPhamXuat, tbUnitText_ThahPhamXuat
	WHERE 	DON_VI_TINH = idcol



	SET @SqlStr = " UPDATE tbThanhPhamXuat"
		+ " SET	TAI_KHOAN_DU = SUBSTRING(SL04006, 1, 4)"
		+ " FROM	tbThanhPhamXuat, SL04" + @CompID + @FYear	--CO DINH MA CONG TY, NAM TAI CHINH	
		+ " WHERE 	SO_HOA_DON = SL04013"
		+ " AND		LEFT(SL04006,4) IN ('5112', '5122', '5312','5111')"


		EXECUTE sp_executesql @SqlStr


	SET @SqlStr = " UPDATE tbThanhPhamXuat"
		+ " SET	TAI_KHOAN_DU = SUBSTRING(GL06001, 1, 4)"
		+ " FROM	tbThanhPhamXuat, GL06" + @CompID + @FYear	--CO DINH MA CONG TY, NAM TAI CHINH	
		+ " WHERE 	SO_HOA_DON = GL06007"
		+ " AND		LEFT(GL06001,4) IN ('5112', '5122', '5312','5111')"
		+ " AND		TAI_KHOAN_DU = ''"


		EXECUTE sp_executesql @SqlStr


	-------------------------------------
	--DON GIA = 0 LA HOA DON KHUYEN MAI, UPDATE LAI TK--
	-------------------------------------
	UPDATE tbThanhPhamXuat 
	SET TAI_KHOAN_DU = '5122'
	WHERE DON_GIA_BAN = 0

	-----------------------------------------------
	--UPDATE TAI KHOAN DO MAT BUT TOAN TRONG SL04--
	-----------------------------------------------

	UPDATE tbThanhPhamXuat 
	SET TAI_KHOAN_DU = '5112'
	WHERE SO_HOA_DON = '08/112567'

	-------------------------------------
		--GET RESULT--
	-------------------------------------
	SELECT *--MA_HANG, TEN_HANG, QUY_CACH, DON_VI_TINH, TAI_KHOAN_DU, SUM(SO_LUONG) AS SO_LUONG, SUM(THANH_TIEN) AS THANH_TIEN
	FROM tbThanhPhamXuat
order by MA_HANG
--	WHERE SO_HOA_DON = '08/153030'
--	WHERE TAI_KHOAN_DU <> '' --AND THANH_TIEN <> 0
--	AND MA_HANG = 'A0245'
--	GROUP BY MA_HANG, TEN_HANG, QUY_CACH, DON_VI_TINH, TAI_KHOAN_DU
--	ORDER BY TAI_KHOAN_DU

	IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[tbThanhPhamXuat]')
						AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
				DROP TABLE [dbo].[tbThanhPhamXuat]
	IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[tbSupplier]')
						AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
				DROP TABLE [dbo].[tbSupplier]

END


1 báo cáo khác cũng làm treo máy : Báo cáo xuất nhập tồn kho (có thêm giá trị) dành cho Kế toán.

Code:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

----*******************************************----
--Made Date:		01/01/2005
--Updating Date:	19/04/2007	( Version:1000.0002 ) 
--For Purpose: 		Bao Cao Xuat Nhap Ton -> For Design Template
--For Company:	 	Designed Template
--Description:		In this store procedure, we used three tables such as
					-- SC07 -> Stock Transaction File I/O 
					-- SC09 -> Get Unit of Measure
	--Note: 		
		-- @Para1	nvarchar(50)	-- @CompID
		--,@Para2	nvarchar(50)	-- @FYear 
		--,@Para3	nvarchar(50)	-- @Language
		--,@Para4	nvarchar(50)	-- @StockFrom
		--,@Para5	nvarchar(50)	-- @StockTo	
		--,@Para6	nvarchar(50)	--,@WHFrom	
		--,@Para7	nvarchar(50)	--,@WHTo  	
		--,@Para8	nvarchar(50)	--,@DateFrom
		--,@Para9	nvarchar(50)	--,@DateTo  
----*******************************************----
ALTER                     PROCEDURE [dbo].[SC_XuatNhapTon_KeToan]
	 @Para1	nvarchar(50)	-- @CompID  	
	,@Para2	nvarchar(50)	-- @FYear  		
	,@Para3	nvarchar(50)	-- @Language 	
	,@Para4 nvarchar(50)	-- @StockFrom	
	,@Para5 nvarchar(50)	-- @StockTo		
	,@Para6 nvarchar(50)	--,@WHFrom		
	,@Para7	nvarchar(50)	--,@WHTo  		
	,@Para8	nvarchar(50)	--,@DateFrom  	
	,@Para9	nvarchar(50)	--,@DateTo  	
WITH RECOMPILE
-- [XuatNhapTon_KeToan] '01','10','AME','A0144','A0144','K1','KTGC12','100401','100430'
AS
BEGIN
/* ************************************************* */
DECLARE @CompID		AS NVARCHAR(50)	SET @CompID		=	@Para1
DECLARE @FYear		AS NVARCHAR(50)	SET @FYear		=	@Para2
DECLARE @Language	AS NVARCHAR(50)	SET @Language	=	@Para3
DECLARE @StockFrom	AS NVARCHAR(50) SET @StockFrom	= 	@Para4
DECLARE @StockTo	AS NVARCHAR(50) SET @StockTo	=	@Para5
DECLARE @WHFrom		AS NVARCHAR(50) SET @WHFrom 	=	@Para6
DECLARE @WHTo		AS NVARCHAR(50)	SET @WHTo		=	@Para7
DECLARE @DateFrom	AS NVARCHAR(50)	SET @DateFrom	=	@Para8
DECLARE @DateTo		AS NVARCHAR(50)	SET @DateTo		=	@Para9

DECLARE @SqlStr as nvarchar(4000)
DECLARE @dem as INT 
SET @dem = 0

SET ANSI_WARNINGS OFF
SET ARITHABORT OFF
SET QUOTED_IDENTIFIER OFF

END

BEGIN

	CREATE TABLE #TempUnitTable
	(
		idcol int PRIMARY KEY,
		UnitText nvarchar(512)
	)
--DROP TABLE #tbStock
IF EXISTS (	SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[#tbStock]') 
			AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
	DROP TABLE [dbo].[#tbStock]

IF EXISTS (	SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[#tbStockEnd]') 
			AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
	DROP TABLE [dbo].[#tbStockEnd]

IF EXISTS (	SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[#tbStockBegin]') 
			AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
	DROP TABLE [dbo].[#tbStockBegin]
--DROP TABLE QRYTMP_StockImMid
IF EXISTS (	SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[tbStockImMid]') 
			AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
	DROP TABLE [dbo].[tbStockImMid]

--DROP TABLE QRYTMP_StockExMid
IF EXISTS (	SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[tbStockExMid]') 
			AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
	DROP TABLE [dbo].[tbStockExMid]

	CREATE TABLE #tbStockEnd
	(
		WarehouseNo			nvarchar(50),
		WHName				nvarchar(50),
		StockCode			nvarchar(50),
		Description1		nvarchar(512),
		Description2		nvarchar(512),
		UnitConvStoc		nvarchar(50),	--DON VI TINH
		UnitCodeMPC		nvarchar(50),	--DON VI TINH NHO NHAT
		UnitConvMPC		INT,	--HE SO QUI DOI
--		LotID			nvarchar(20),	--SO LO
		ExpiryDate		DATETIME,
		UserDefFld1		NVARCHAR(50),	--SO PHIEU KIEM NGHIEM
		UserDefFld2		NVARCHAR(50),	--DO AM
		UserDefFld3		NVARCHAR(50),	--HAM LUONG
		ImQtyMid		numeric(30,4),	--SO LUONG HANG NHAP
		ImTransfPrice1Mid 	numeric(30,4),	--GIA TIEN HANG NHAP
		ExQtyMid		numeric(30,4),	--SO LUONG HANG XUAT
		ExTransfPrice1Mid	numeric(30,4),	--GIA TIEN HANG XUAT
		QtyEnd			numeric(30,4),	--SO LUONG HANG CON LAI TRONG KHO
		TransfPrice1End		numeric(30,4),	--GIA TIEN HANG CON LAI TRONG KHO
		CurrName 		nvarchar(50),
		FromDate		datetime,
		ToDate			datetime
	,QtyBegin			numeric(30,4)
,	TransfPrice1Begin		numeric(30,4)
	)

	CREATE TABLE #tbStockBegin
	(
		WarehouseNo			nvarchar(50),
		WHName				nvarchar(50),
		StockCode			nvarchar(50),
		Description1		nvarchar(512),
		Description2		nvarchar(512),
		UnitConvStoc		nvarchar(50),	--DON VI TINH
		UnitCodeMPC		nvarchar(50),	--DON VI TINH NHO NHAT
		UnitConvMPC		INT,	--HE SO QUI DOI
--		LotID			nvarchar(20),	--SO LO
		ExpiryDate		DATETIME,
		UserDefFld1		NVARCHAR(50),	--SO PHIEU KIEM NGHIEM
		UserDefFld2		NVARCHAR(50),	--DO AM
		UserDefFld3		NVARCHAR(50),	--HAM LUONG
		ImQtyMid		numeric(30,4),	--SO LUONG HANG NHAP
		ImTransfPrice1Mid 	numeric(30,4),	--GIA TIEN HANG NHAP
		ExQtyMid		numeric(30,4),	--SO LUONG HANG XUAT
		ExTransfPrice1Mid	numeric(30,4),	--GIA TIEN HANG XUAT
		QtyBeGin			numeric(30,4),	--SO LUONG HANG CON LAI dau ki TRONG KHO
		TransfPrice1Begin		numeric(30,4),	--GIA TIEN HANG CON LAI TRONG KHO
		CurrName 		nvarchar(50),
		FromDate		datetime,
		ToDate			datetime
	)
----*******************************************----
--Insert the Unit Text into the temporary table
----*******************************************----
WHILE @dem < 40
	BEGIN
		INSERT INTO #TempUnitTable (idcol, UnitText) VALUES (@dem,' ')
      	SET @dem = @dem + 1
	END

SET @dem = 0

WHILE @dem < 8
	BEGIN
		SET @SqlStr = " UPDATE #TempUnitTable "
					+ " SET #TempUnitTable.UnitText = T1.SC0900" + convert(nvarchar(3), @dem + 2)
					+ " FROM #TempUnitTable, SC09" + @CompID + "00 T1"
					+ " WHERE T1.SC09001 = '" + @Language + "'"
					+ " AND #TempUnitTable.idcol = " + convert(nvarchar(3), @dem)
       	EXECUTE  sp_executesql @SqlStr 		
		SET @dem = @dem + 1
	END 

WHILE @dem < 40
	BEGIN
		SET @SqlStr = " UPDATE #TempUnitTable "
					+ " SET #TempUnitTable.UnitText = T1.SC090" + convert(nvarchar(3), @dem + 2) 
					+ " FROM #TempUnitTable, SC09" + @CompID + "00 T1"
					+ " WHERE T1.SC09001 = '" + @Language + "'"
					+ " AND #TempUnitTable.idcol = " + convert(nvarchar(3), @dem)
       	EXECUTE  sp_executesql @SqlStr 		
		SET @dem = @dem + 1
	END
	
----*******************************************----
	----tbTmp lay du lieu hoan toan tu bang SC07	
	----nhung duoc cap nhat lai voi TransPrice theo TransType
	----*******************************************----
	CREATE TABLE #tbStock
	(
		WareNo		nvarchar(50) collate Latin1_General_BIN,
		WareNoTo		nvarchar(50) collate Latin1_General_BIN,
		TransDate			datetime ,
		TransType			nvarchar(50) collate Latin1_General_BIN,
		StockCode		nvarchar(512) collate Latin1_General_BIN,
		LotID		nvarchar(512) collate Latin1_General_BIN,
		Qty		numeric(30,4),
		TransPrice	numeric(30,4),	
		Amount		NUMERIC(30,4),
		Reference		nvarchar(50) collate Latin1_General_BIN ,
		OrderNumber		nvarchar(50) collate Latin1_General_BIN ,
		Invoice		NVARCHAR(50)	collate Latin1_General_BIN ,
		Receiver		NVARCHAR(50)	collate Latin1_General_BIN ,
		GLTransaction		NVARCHAR(50)	collate Latin1_General_BIN 
	)
	SET @SqlStr = " SELECT "
				+ "  T2.SC07009 	WareNo"
				+ ", T2.SC07027 	WareNoTo"
				+ ", T2.SC07002 	TransDate"
				+ ", T2.SC07001		TransType"
				+ ", T2.SC07003 	StockCode"
				+ ", T2.SC07021		LotID"
--				+ ", T2.SC07021		BatchID"
				+ ", T2.SC07004 	Qty"
				+ ", T2.SC07005 	TransPrice"
				+ ", T2.SC07005*T2.SC07004	Amount"
				+ ", T2.SC07007		Reference"
				+ ", T2.SC07006		OrderNumber"
				+ ", T2.SC07056		Invoice"
				+ ", T2.SC07011		Receiver"
				+ ", T2.SC07020		GLTransaction"
--				+ "	 INTO #tbStock"
				+ " FROM SC07" + @CompID + "00 T2"
				+ " WHERE	T2.SC07009 BETWEEN '" + @WHFrom + "' AND '" + @WHTo + "'"
				+ " AND	T2.SC07003 BETWEEN '" + @StockFrom + "' AND '" + @StockTo + "'"
				+ " AND T2.SC07002 <= '" + CONVERT(nvarchar(50), @DateTo, 112) + "'"
--				+ " AND T2.SC07006 <> 'DDCK2008'"
				+ " ORDER BY T2.SC07003, T2.SC07002  ASC"

	insert #tbStock execute sp_executesql @SqlStr
PRINT @SqlStr

--XOA DI CAC DONG CHUYEN KHO TU KN->KT HOAC KT->KN : HANG  KIEM NGHIEM 
--DELETE #tbStock
--SELECT * FROM #tbStock
-- WHERE Reference = 'X0513/09'

--SELECT * FROM #tbStock WHERE StockCode = 'B0131'



--SELECT * FROM #tbStock WHERE StockCode = 'B0027'

--delete #tbStock where Reference = 'DD001/08'-- OR OrderNumber = 'DDCK2009'

--SELECT * FROM #tbStock WHERE StockCode = 'C0047'
--	SET @SqlStr = "	UPDATE #tbStock"
--				+ "    SET TransDate = PL03005"
--				+ "	  FROM PL03" + @CompID + "00"
--				+ "  WHERE Invoice = PL03002 AND Receiver = PL03001"
--	execute sp_executesql @SqlStr


	UPDATE #tbStock
	SET Amount = TransPrice
	WHERE TransType = '03' OR TransType = '10'
	
	UPDATE #tbStock
	SET Amount = (-1)* TransPrice
	WHERE TransType = '07'

--SELECT * FROM #tbStock WHERE StockCode = 'B0651' --AND (TransType = '01' OR (TransType = '04' AND Qty < 0))

	----*******************************************----
	----##tbStockEnd tính số lượng và giá cuối kỳ
	----Bang nay la bang chính để lấy dữ liệu
	----*******************************************----
	
	SET @SqlStr = " INSERT INTO #tbStockEnd "
				+ "  SELECT DISTINCT"
				+ "  T2.WareNo "
				+ ", T3.SC23002 "
				+ ", T2.StockCode "
				+ ", T1.SC01002 	Description1"
				+ ", SUBSTRING(T1.SC01003, 1, ABS(CHARINDEX('TH',T1.SC01003,1) - 1)) 	Description2"
				+ ", T4.UnitText  	UnitText"
--				+ ", T2.LotID		LotID"
				+ ", T1.SC01136		UnitCodeMPC"
				+ ", T1.SC01142		UnitConvMPC"
				+ ", NULL"
				+ ", ' '"
				+ ", ' '"
				+ ", ' '"
				+ ", 0   "
				+ ", 0   "
				+ ", 0   "
				+ ", 0   "
				+ ", SUM(T2.Qty)  "
				+ ", SUM(T2.Amount) "
				+ ", SY.SYCD009  CurrName" 
				+ ", '" + CONVERT(nvarchar(50), @DateFrom, 1) + "'"
				+ ", '" + CONVERT(nvarchar(50), @DateTo, 1) + "'"
+",0"
+",0"
				+ "  FROM SC01" + @CompID + "00 T1, #tbStock T2"
				+ ", SC23" + @CompID + "00 T3, #TempUnitTable T4"
				+ ", SYCD" + @CompID + "00 SY"
				+ " WHERE	T2.WareNo BETWEEN '" + @WHFrom + "' AND '" + @WHTo + "'"
				+ " AND	T2.StockCode BETWEEN '" + @StockFrom + "' AND '" + @StockTo + "'"
				+ " AND T2.WareNo =  T3.SC23001"
				+ " AND T1.SC01001 = T2.StockCode"
				+ " AND T2.TransDate  <= '" + CONVERT(nvarchar(50), @DateTo, 112) + "'"
				+ " AND T4.idcol = T1.SC01133"
				+ " AND SY.SYCD001 = 0 "
				+ " GROUP BY T2.StockCode, T2.WareNo, T3.SC23002, T1.SC01002, T1.SC01003,"
				+ " T1.SC01136, T1.SC01142, T4.UnitText, SY.SYCD009"--- T2.LotID"
				+ " ORDER BY T2.StockCode ASC"
	EXECUTE sp_executesql @SqlStr

--SELECT * FROM #tbStockEnd
	SET @SqlStr = " INSERT INTO #tbStockBegin "
				+ "  SELECT DISTINCT"
				+ "  T2.WareNo "
				+ ", T3.SC23002 "
				+ ", T2.StockCode "
				+ ", T1.SC01002 	Description1"
				+ ", SUBSTRING(T1.SC01003, 1, ABS(CHARINDEX('TH',T1.SC01003,1) - 1)) 	Description2"
				+ ", T4.UnitText  	UnitText"
--				+ ", T2.LotID		LotID"
				+ ", T1.SC01136		UnitCodeMPC"
				+ ", T1.SC01142		UnitConvMPC"
				+ ", NULL"
				+ ", ' '"
				+ ", ' '"
				+ ", ' '"
				+ ", 0   "
				+ ", 0   "
				+ ", 0   "
				+ ", 0   "
				+ ", SUM(T2.Qty)  "
				+ ", SUM(T2.Amount) "
				+ ", SY.SYCD009  CurrName" 
				+ ", '" + CONVERT(nvarchar(50), @DateFrom, 1) + "'"
				+ ", '" + CONVERT(nvarchar(50), @DateTo, 1) + "'"
				+ "  FROM SC01" + @CompID + "00 T1, #tbStock T2"
				+ ", SC23" + @CompID + "00 T3, #TempUnitTable T4"
				+ ", SYCD" + @CompID + "00 SY"
				+ " WHERE	T2.WareNo BETWEEN '" + @WHFrom + "' AND '" + @WHTo + "'"
				+ " AND	T2.StockCode BETWEEN '" + @StockFrom + "' AND '" + @StockTo + "'"
				+ " AND T2.WareNo =  T3.SC23001"
				+ " AND T1.SC01001 = T2.StockCode"
				+ " AND T2.TransDate  < '" + CONVERT(nvarchar(50), @DateFrom, 112) + "'"
				+ " AND T4.idcol = T1.SC01133"
				+ " AND SY.SYCD001 = 0 "
				+ " GROUP BY T2.StockCode, T2.WareNo, T3.SC23002, T1.SC01002, T1.SC01003,"
				+ " T1.SC01136, T1.SC01142, T4.UnitText, SY.SYCD009"--- T2.LotID"
				+ " ORDER BY T2.StockCode ASC"
	EXECUTE sp_executesql @SqlStr
--select * from #tbStockBegin
print @SqlStr
DELETE #tbStock
 WHERE ((WareNo = 'KN' AND WareNoTo = 'KT') OR (WareNo = 'KT' AND WareNoTo = 'KN') 
		OR (WareNo = 'KB' AND WareNoTo = 'KT') OR (WareNo = 'KB' AND WareNoTo = 'KT')) 
   AND Receiver = '20' 
AND TransDate BETWEEN '20090201' AND '20091230'

	----*******************************************----
	----tbStockImMid tính số lượng và giá nhập trong kỳ
	----ĐK: theo TransType
	----*******************************************----

	SET @SqlStr = "	 SELECT DISTINCT"
				+ "  T2.WareNo  	WarehouseNo"
				+ ", T2.StockCode 	StockCode"
				+ ", T1.SC01002		Description1"
				+ ", SUBSTRING(T1.SC01003, 1, ABS(CHARINDEX('TH',T1.SC01003,1) - 1))		Description2"
				+ ", T4.UnitText	UnitText"
--				+ ", T2.LotID	 	LotID"	
				+ ", T1.SC01136		UnitCodeMPC"
				+ ", T1.SC01142		UnitConvMPC"			
				+ ", SUM(T2.Qty)   	Qty"
				+ ", SUM(round(T2.Amount,4)) Amount"
				+ ", 0   			ExQty"
				+ ", 0   			ExAmount"
				+ ", 0   			EndQty"
				+ ", 0   			EndAmount"
				+ ", SY.SYCD009			CurrName" 
--				+ ", T2.GLTransaction	GLTransaction"
				+ ", '" + CONVERT(nvarchar(50), @DateFrom, 1) + "'		DateFrom"
				+ ", '" + CONVERT(nvarchar(50), @DateTo, 1) + "'		DateTo"
				+ "	 INTO tbStockImMid"
				+ "  FROM  SC01" + @CompID + "00 T1, #tbStock T2"
				+ ", SC23" + @CompID + "00 T3, #TempUnitTable T4"
				+ ", SYCD" + @CompID + "00 SY"
				+ " WHERE T2.WareNo BETWEEN '" + @WHFrom + "' AND '" + @WHTo + "'"
				+ " AND	T2.StockCode BETWEEN '" + @StockFrom + "' AND '" + @StockTo + "'"
				+ " AND T2.WareNo =  T3.SC23001"
				+ " AND T1.SC01001 = T2.StockCode"
				+ " AND T4.idcol = T1.SC01133"
				+ " AND SY.SYCD001 = 0 "
				+ "	AND (T2.TransType IN ('00','03') OR (T2.Qty > 0 AND T2.TransType = '04')"	--Điều kiện để lấy 
				+ "	OR (T2.TransType = '02' AND T2.Qty > 0))"						--hàng nhập kho
--				+ "	OR (T2.TransType = '01' AND T2.Qty > 0))"	
				+ " AND T2.TransDate  >= '" + CONVERT(nvarchar(50), @DateFrom, 112) + "'"
				+ " AND T2.TransDate  <= '" + CONVERT(nvarchar(50), @DateTo, 112) + "'"
				+ " GROUP BY T2.StockCode, T2.WareNo, T3.SC23002, T1.SC01002, T1.SC01003,"
				+ " T1.SC01136, T1.SC01142, T4.UnitText, SY.SYCD009"--, T2.GLTransaction"--, T2.LotID"
				+ " ORDER BY T2.StockCode ASC"
	EXECUTE sp_executesql @SqlStr

	--SELECT * FROM tbStockImMid --WHERE StockCode LIKE 'A0281%' --AND WarehouseNo = 'KN'
--	AND SC25002 = GLTransaction 


	----*******************************************----
	----tbStockExMid tính số lượng và giá xuất trong kỳ
	----ĐK: theo TransType
	----*******************************************----
	SET @SqlStr = "	 SELECT DISTINCT"
				+ "  T2.WareNo  	WarehouseNo"
				+ ", T2.StockCode 	StockCode"
				+ ", T1.SC01002		Description1"
				+ ", SUBSTRING(T1.SC01003, 1, ABS(CHARINDEX('TH',T1.SC01003,1) - 1))		Description2"
				+ ", T4.UnitText	UnitText"
				+ ", T1.SC01136		UnitCodeMPC"
				+ ", T1.SC01142		UnitConvMPC"
--				+ ", T2.LotID	 	LotID"				
				+ ", 0   			ImQty"
				+ ", 0   			ImAmount"
				+ ", SUM(T2.Qty)   	Qty"
				+ ", SUM(round(T2.Amount,4)) Amount"
				+ ", 0   			EndQty"
				+ ", 0   			EndAmount"
				+ ", SY.SYCD009  CurrName" 
				+ ", '" + CONVERT(nvarchar(50), @DateFrom, 1) + "'		DateFrom"
				+ ", '" + CONVERT(nvarchar(50), @DateTo, 1) + "'		DateTo"
				+ "	 INTO tbStockExMid"
				+ "  FROM   SC01" + @CompID + "00 T1, #tbStock T2"
				+ ", SC23" + @CompID + "00 T3, #TempUnitTable T4"
				+ ", SYCD" + @CompID + "00 SY"
				+ " WHERE	T2.WareNo BETWEEN '" + @WHFrom + "' AND '" + @WHTo + "'"
				+ " AND	T2.StockCode BETWEEN '" + @StockFrom + "' AND '" + @StockTo + "'"
				+ " AND T2.WareNo =  T3.SC23001"
				+ " AND T1.SC01001 = T2.StockCode"
				+ " AND T4.idcol = T1.SC01133"
				+ " AND SY.SYCD001 = 0 "	
				+ " 	AND (T2.TransType IN ('01','07','10') OR (T2.Qty < 0 AND T2.TransType = '04')"		--Điều kiện để lấy
				+ "	OR (T2.TransType = '02' AND T2.Qty < 0))"
--				+ " OR (T2.TransType = '01' AND T2.Qty < 0))"							--hàng xuất kho
				+ " AND T2.TransDate  >= '" + CONVERT(nvarchar(50), @DateFrom, 112) + "'"
				+ " AND T2.TransDate  <= '" + CONVERT(nvarchar(50), @DateTo, 112) + "'"
				+ " GROUP BY T2.StockCode, T2.WareNo, T3.SC23002, T1.SC01002, T1.SC01003,"
				+ " T1.SC01136, T1.SC01142, T4.UnitText, SY.SYCD009"--, T2.LotID"
				+ " ORDER BY T2.StockCode ASC"
	EXECUTE sp_executesql @SqlStr

--SELECT * FROM tbStockExMid WHERE StockCode = 'A0281'

	--Them điều kiện kết LotID- 
	UPDATE #tbStockEnd
	SET #tbStockEnd.ImQtyMid = tbStockImMid.Qty
	,#tbStockEnd.ImTransfPrice1Mid = tbStockImMid.Amount
	FROM #tbStockEnd, tbStockImMid
	WHERE #tbStockEnd.WarehouseNo collate Latin1_General_BIN = tbStockImMid.WarehouseNo

	AND #tbStockEnd.StockCode collate Latin1_General_BIN = tbStockImMid.StockCode 
--	AND #tbStockEnd.LotID = tbStockImMid.LotID	--LotID
	
	UPDATE #tbStockEnd
	SET #tbStockEnd.ExQtyMid = tbStockExMid.Qty
	,#tbStockEnd.ExTransfPrice1Mid = tbStockExMid.Amount
	FROM #tbStockEnd, tbStockExMid
	WHERE #tbStockEnd.WarehouseNo collate Latin1_General_BIN = tbStockExMid.WarehouseNo
	AND #tbStockEnd.StockCode collate Latin1_General_BIN = tbStockExMid.StockCode 


	UPDATE #tbStockEnd
	SET #tbStockEnd.QtyBegin = #tbStockBegin.QtyBegin
	,#tbStockEnd.TransfPrice1Begin = #tbStockBegin.TransfPrice1Begin
	FROM #tbStockEnd, #tbStockBegin
	WHERE #tbStockEnd.WarehouseNo collate Latin1_General_BIN = #tbStockBegin.WarehouseNo
	AND #tbStockEnd.StockCode collate Latin1_General_BIN = #tbStockBegin.StockCode 
--	AND #tbStockEnd.LotID = tbStockExMid.LotID	--LotID

	--UPDATE NEU HS QUI DOI = 0--
/*
	UPDATE #tbStockEnd
	SET UnitConvMPC = 1
	WHERE UnitConvMPC = 0

	--NHAN SL VOI HE SO QUI DOI--
	UPDATE #tbStockEnd
	SET ImQtyMid = ImQtyMid * UnitConvMPC, 
	    ExQtyMid = ExQtyMid * UnitConvMPC,
	    QtyEnd = QtyEnd * UnitConvMPC
	    */

	--NHAN SL VOI HE SO QUI DOI--
/*
	UPDATE #tbStockEnd
	SET ImQtyMid = ImQtyMid * ISNULL(QDGBB, 1), 
	    ExQtyMid = ExQtyMid * ISNULL(QDGBB, 1),
	    QtyEnd = QtyEnd * ISNULL(QDGBB, 1)
	FROM 	#tbStockEnd, SCGCD0000
	WHERE StockCode = MAHH

*/
	UPDATE #tbStockEnd
	SET UnitCodeMPC = ( SELECT UnitText FROM #TempUnitTable	WHERE UnitCodeMPC = idcol)

	--UPDATE Do am, ham luong, Phieu KN	--

	--UPDATE MA PHAN XUONG, TEN PHAN XUONG--

	SET @SqlStr = " UPDATE #tbStockEnd"
		    + " SET UserDefFld1 = SC01010"
		    + " FROM #tbStockEnd, SC01" + @CompID + "00" 
		    + " WHERE StockCode collate Latin1_General_BIN = SC01001"

	EXECUTE sp_executesql @SqlStr

	SET @SqlStr = " UPDATE #tbStockEnd"
		    + " SET UserDefFld1 = SY24003"
		    + " FROM #tbStockEnd, SY24" + @CompID + "00" 
		    + " WHERE UserDefFld1 collate Latin1_General_BIN = SY24002"
		    + " AND 	SY24001 = 'IQ'"

	EXECUTE sp_executesql @SqlStr

	---------------------------------------


/*
	SET @SqlStr = " UPDATE #tbStockEnd"
		    + " SET LotID = SC33009"
		    + " FROM #tbStockEnd, SC33" + @CompID + "00" 
		    + " WHERE WarehouseNo = SC33002 AND StockCode = SC33001 AND LotID = SC33003"

	EXECUTE sp_executesql @SqlStr
*/
	--**********GET RESULT*************--
/*SELECT WarehouseNo, WHName, StockCode, Description1, Description2, UnitConvStoc
			,LotID, ExpiryDate, UserDefFld1, UserDefFld2, UserDefFld3,
			SUM(ImQtyMid) as ImQtyMid, SUM(ExQtyMid) AS ExQtyMid, SUM(QtyEnd) AS QtyEnd, CurrName, FromDate, ToDate
		FROM #tbStockEnd
		WHERE ImQtyMid <> 0.0 OR ExQtyMid <> 0.0 OR QtyEnd <> 0.0
		group by WarehouseNo, WHName, StockCode, Description1, Description2, UnitConvStoc
			,LotID, ExpiryDate, UserDefFld1, UserDefFld2, UserDefFld3, CurrName, FromDate, ToDate
--		AND LotID = '0030408'
*/

	IF @StockFrom LIKE 'A%'
		SELECT *
		FROM #tbStockEnd
		WHERE (ImQtyMid <> 0.0 OR ExQtyMid <> 0.0 OR QtyEnd <> 0.0
				OR ImTransfPrice1Mid <> 0.0 OR ExTransfPrice1Mid <> 0.0 OR TransfPrice1End <> 0.0)
		AND WarehouseNo IN ('K1','K2','K8','K13','K6','K9','K14','K7')
	ELSE 
		SELECT *
		FROM #tbStockEnd
		WHERE (ImQtyMid <> 0.0 OR ExQtyMid <> 0.0 OR QtyEnd <> 0.0 
				OR ImTransfPrice1Mid <> 0 OR ExTransfPrice1Mid <> 0 OR TransfPrice1End <> 0)

	
SELECT StockCode,ImTransfPrice1Mid
		FROM #tbStockEnd
		WHERE (ImTransfPrice1Mid <> 0.0  )

--SELECT StockCode, SUM(ExTransfPrice1Mid)  FROM #tbStockEnd --WHERE TransDate BETWEEN '090301' AND '090331'
--GROUP BY StockCode
--SELECT StockCode, SUM(ExTransfPrice1Mid)  FROM #tbStockEnd --WHERE TransDate BETWEEN '090301' AND '090331'
--w
--GROUP BY StockCode
--SELECT * FROM #tbStock WHERE TransDate BETWEEN '090601' AND '090630' AND StockCode = 'B0005'

	DROP TABLE #tbStock
	DROP TABLE #tbStockEnd
	DROP TABLE tbStockImMid
	DROP TABLE tbStockExMid
--DROP TABLE tbStock
IF EXISTS (	SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[#tbStock]') 
			AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
	DROP TABLE [dbo].[#tbStock]

IF EXISTS (	SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[#tbStockEnd]') 
			AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
	DROP TABLE [dbo].[#tbStockEnd]

--DROP TABLE QRYTMP_StockImMid
IF EXISTS (	SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[tbStockImMid]') 
			AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
	DROP TABLE [dbo].[tbStockImMid]

--DROP TABLE QRYTMP_StockExMid
IF EXISTS (	SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[tbStockExMid]') 
			AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
	DROP TABLE [dbo].[tbStockExMid]

END

--[XuatNhapTon_KeToan] '01','09','AME','B0001','B9999','KN','KN','090801','090831'

[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 22/07/2010 06:38:05 (+0700) | #8 | 215959
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]
Nhìn chung mấy cái storeproc này có những đoạn query quá rộng (SELECT *) và có quá nhiều sub-queries. Đây là nguyên do tạo ra kém hiệu suất nếu xét trên bình diện truy vấn CSDL. Cách cải thiện là nên tối ưu lại storeproc và nên trao bớt trách nhiệm trên tầng ứng dụng (applications) việc hình thành các query statements cụ thể thay vì phó mặc cho storeproc thực hiện quá nhiều sub-queries.

MSSQL chạy trên nền 32-bit mà phục vụ cho lượng truy vấn cao và nặng thì hoạt động cực kỳ kém. Cách có thể cải thiện trên bình diện này là migrate sang một máy chủ chạy 64-bit và MSSQL 64-bit.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 22/07/2010 09:19:59 (+0700) | #9 | 215976
qtra004
Member

[Minus]    0    [Plus]
Joined: 19/04/2004 22:36:57
Messages: 298
Location: Kiwiland
Offline
[Profile] [PM]
Mình cũng đồng ý với ý kiến của anh conmale. Server có 6GB Ram mà bạn chạy 32bit thì không tận dụng được 2GB RAM.

Bạn thảy cái stored procedure lên cũng chưa thể nói được gì. Nhưng mà mình nghĩ bạn nên tách 1 cái stored proc lớn ra nhiều stored nhỏ hơn và để application gọi các stored proc nhỏ hơn, rồi để application tương tác những kết quả từ những stored proc đó. Bạn cũng nên tập bỏ bớt code không còn dùng nữa trong stored proc thay vì chuyển nó thành comments ( nhìn rối mắt lắm).

Nhìn sơ qua cái stored proc đầu tiên. Cách làm drop table rồi insert/update table lại mỗi lần stored proc chạy có thể tạo ra deadlock nếu có 1 process khác đang chạy select query tới table đó. Bạn có thể tham khảo thêm về view, view cũng có thể dùng để generate report.

Carpe diem quam minimum credula postero
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 22/07/2010 10:35:06 (+0700) | #10 | 215984
lama
Member

[Minus]    0    [Plus]
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
[Profile] [PM]

conmale wrote:
Nhìn chung mấy cái storeproc này có những đoạn query quá rộng (SELECT *) và có quá nhiều sub-queries. Đây là nguyên do tạo ra kém hiệu suất nếu xét trên bình diện truy vấn CSDL. Cách cải thiện là nên tối ưu lại storeproc và nên trao bớt trách nhiệm trên tầng ứng dụng (applications) việc hình thành các query statements cụ thể thay vì phó mặc cho storeproc thực hiện quá nhiều sub-queries.

MSSQL chạy trên nền 32-bit mà phục vụ cho lượng truy vấn cao và nặng thì hoạt động cực kỳ kém. Cách có thể cải thiện trên bình diện này là migrate sang một máy chủ chạy 64-bit và MSSQL 64-bit. 


Các câu lệnh SELECT * em thấy là đúng theo nhu cầu mà ? Từ bảng dữ liệu khoảng trăm mấy cột, mình đã select đúng các cột cần đưa vào 1 bảng tạm để xử lý (chắc cũng có vấn đề ở đây, em đang check).

Rất cám ơn anh đã góp ý trao bớt trách nhiệm cho App, so sánh với cách tổ chức của ứng dụng hiện tại (không thấy các stored truy vấn dữ liệu như em nói bên trên) thì chắc đây cũng chính là 1 trong những nguyên nhân chính rồi.

Ứng dụng này hiện tại thì chưa hỗ trợ 64 bit nên em chỉ có thể cài 32 bit thôi.

Thông tin thêm :

Hic, tối qua em thức tới 1h30 chạy trace thử thì thấy với dữ liệu in trong 1 tháng cho 93 mặt hàng thì in khỏang 10 giây à. Nhưng khi chọn in trong 3 tháng thì mất hơn 1 phút, chọn in từ đầu năm đến giờ cho 250 mặt hàng thì chờ hơn 30 phút chưa thấy ra luôn.

Lúc chạy trace và cả Active Monitor thấy thời gian gọi stored proc xảy ra cũng nhanh lắm, lâu thì có vài giây, còn lúc chạy nó có lock không cũng không biết, không thấy tình trạng là LOCKED. Các xử lý trong Active Monitor có Request là LOCK (không phải LOCKED) ngay cả khi thử SELECT 1 bảng đơn giản.
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 22/07/2010 11:03:17 (+0700) | #11 | 215987
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

lama wrote:


Các câu lệnh SELECT * em thấy là đúng theo nhu cầu mà ? Từ bảng dữ liệu khoảng trăm mấy cột, mình đã select đúng các cột cần đưa vào 1 bảng tạm để xử lý (chắc cũng có vấn đề ở đây, em đang check).
 

Nhu cầu là một chuyện và tính hữu hiệu để tạo hiệu suất là một chuyện khác. Đây là nghệ thuật tối ưu hoá đó em. Đối với một SQL query, càng ambiguous (dùng wild card *) thì càng ít hiệu suất bởi vì query như vậy nó sẽ lấy hết tất cả các thông tin từ tất cả các cột và có thể có những cột không cần thiết (và chứa nhiều dữ liệu). Về phần sub-queries thì cố gắng tránh càng nhiều càng tốt bởi vì nó là nguyên nhân chính của tình trạng ỳ ạch trên CSDL.

lama wrote:

Rất cám ơn anh đã góp ý trao bớt trách nhiệm cho App, so sánh với cách tổ chức của ứng dụng hiện tại (không thấy các stored truy vấn dữ liệu như em nói bên trên) thì chắc đây cũng chính là 1 trong những nguyên nhân chính rồi.

Ứng dụng này hiện tại thì chưa hỗ trợ 64 bit nên em chỉ có thể cài 32 bit thôi.
 

Anh không hiểu cấu trúc của ứng dụng em dùng như thế nào nhưng trên mặt nguyên tắc, CSDL có thể chạy trên một máy chủ hoàn toàn tách rời với ứng dụng. Máy chủ ấy có thể chạy trên bất cứ hệ điều hành nào. Ứng dụng có thể truy vấn thông tin trên CSDL từ một máy chủ khác xuyên qua ODBC hay bất cứ phương tiện nào. Bởi thế, ứng dụng không hỗ trợ 64-bit thì cho nó chạy trên một máy khác và tách rời CSDL sang một máy khác chạy 64-bit.

lama wrote:

Thông tin thêm :

Hic, tối qua em thức tới 1h30 chạy trace thử thì thấy với dữ liệu in trong 1 tháng cho 93 mặt hàng thì in khỏang 10 giây à. Nhưng khi chọn in trong 3 tháng thì mất hơn 1 phút, chọn in từ đầu năm đến giờ cho 250 mặt hàng thì chờ hơn 30 phút chưa thấy ra luôn.

Lúc chạy trace và cả Active Monitor thấy thời gian gọi stored proc xảy ra cũng nhanh lắm, lâu thì có vài giây, còn lúc chạy nó có lock không cũng không biết, không thấy tình trạng là LOCKED. Các xử lý trong Active Monitor có Request là LOCK (không phải LOCKED) ngay cả khi thử SELECT 1 bảng đơn giản. 

Chuyên bình thường thôi. CSDL nào cũng vậy, chạy ít query và không có "long life" query thì thường là nhanh nhưng chạy càng nhiều queries thì càng ì ạch và tính ì ạch sẽ gia tăng theo cấp số.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 22/07/2010 11:05:38 (+0700) | #12 | 215989
qtra004
Member

[Minus]    0    [Plus]
Joined: 19/04/2004 22:36:57
Messages: 298
Location: Kiwiland
Offline
[Profile] [PM]

lama wrote:


Ứng dụng này hiện tại thì chưa hỗ trợ 64 bit nên em chỉ có thể cài 32 bit thôi.

 


Ứng dụng không hỗ trợ 32bit nhưng database engine (MSSQL) thì có. Cho nên SQL Server box cần cài OS 64 bit và SQL Server 64 bit để tận dụng hết tài nguyên ( 6GB RAM ???)
Carpe diem quam minimum credula postero
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 22/07/2010 12:47:59 (+0700) | #13 | 215997
lama
Member

[Minus]    0    [Plus]
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
[Profile] [PM]
Rất cám ơn mọi người đã nhiệt tình giúp đỡ, chia sẻ. Nhờ mọi người mà Nguyên sáng ra nhiều điều ( VD lại mới biết là tách SQL Server ra cho chạy 64 bit chẳng hạn, trước giờ cứ trong đầu là App không hỗ trợ thì SQL cũng phải chạy 32bit không à). Nguyên sẽ lần lượt test hết các trường hợp. Hy vọng sẽ có tin vui báo lại sớm.

Tuy vậy, nếu mọi người ai còn có thể chia sẻ gì về vấn đề này cứ tiếp tục chia sẻ nha :-P Tập hợp các chia sẻ này sẻ là 1 kinh nghiệm rất đáng quý cho Nguyên cũng như nhiều anh/em khác.
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 22/07/2010 12:58:27 (+0700) | #14 | 215998
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

lama wrote:
Rất cám ơn mọi người đã nhiệt tình giúp đỡ, chia sẻ. Nhờ mọi người mà Nguyên sáng ra nhiều điều ( VD lại mới biết là tách SQL Server ra cho chạy 64 bit chẳng hạn, trước giờ cứ trong đầu là App không hỗ trợ thì SQL cũng phải chạy 32bit không à). Nguyên sẽ lần lượt test hết các trường hợp. Hy vọng sẽ có tin vui báo lại sớm.

Tuy vậy, nếu mọi người ai còn có thể chia sẻ gì về vấn đề này cứ tiếp tục chia sẻ nha :-P Tập hợp các chia sẻ này sẻ là 1 kinh nghiệm rất đáng quý cho Nguyên cũng như nhiều anh/em khác.
 


Bất cứ thắc mắc nào có đủ dữ kiện, được trình bày rõ ràng và thể hiện sự quan tâm đúng mức đến vấn đề mình đang gặp trở ngại thì sẽ có những góp ý có giá trị thôi em smilie
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 23/07/2010 03:10:32 (+0700) | #15 | 216086
qtra004
Member

[Minus]    0    [Plus]
Joined: 19/04/2004 22:36:57
Messages: 298
Location: Kiwiland
Offline
[Profile] [PM]

lama wrote:
Rất cám ơn mọi người đã nhiệt tình giúp đỡ, chia sẻ. Nhờ mọi người mà Nguyên sáng ra nhiều điều ( VD lại mới biết là tách SQL Server ra cho chạy 64 bit chẳng hạn, trước giờ cứ trong đầu là App không hỗ trợ thì SQL cũng phải chạy 32bit không à). Nguyên sẽ lần lượt test hết các trường hợp. Hy vọng sẽ có tin vui báo lại sớm.

Tuy vậy, nếu mọi người ai còn có thể chia sẻ gì về vấn đề này cứ tiếp tục chia sẻ nha :-P Tập hợp các chia sẻ này sẻ là 1 kinh nghiệm rất đáng quý cho Nguyên cũng như nhiều anh/em khác.
 


Một điều bạn cần lưu ý nữa là vấn đề rearrange/rebuild index. Đối với những tables có nhiều transaction liên tục truy xuất thì vấn đề Index fragmentation là điều không thể tránh khỏi. Theo mình nghĩ bạn nên kiểm tra lại xem mức độ index fragmentation ở những transactional tables xem có phải rebuild lại index không. Bạn có thể setup Maintenance plan để rebuild index mỗi tuần (Chủ Nhật) để cải thiện datbase performance. Mình đã từng trải nghiệm vấn đề này cho 1 số khách hàng lớn rồi. Sau khi re-index thì report từ 1 tiếng xuống còn 2 phút smilie
Carpe diem quam minimum credula postero
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 23/07/2010 11:32:38 (+0700) | #16 | 216109
[Avatar]
invalid-password
Member

[Minus]    0    [Plus]
Joined: 09/03/2010 21:22:46
Messages: 161
Offline
[Profile] [PM]
Mình cũng xin góp thêm vài viên gạch nữa :

1. Trong storeproc mỗi lần report là nó tạo bảng rồi xoá bảng, điều này sẽ làm tăng kích thước file log .LDF rất nhanh. Bạn cần cắt log định kỳ và shrink database để giảm kích thước db.
+ Gõ lệnh "backup log tên-database with truncate_only"
+ Sau đó shrink database thì kích thước db sẽ giảm nhiều.

2. Mỗi lần chạy thì storedproc tạo table, update, và xoá trên những table cùng tên nhau thay vì temp table nhưng không đặt nó trong đoạn begin transaction .. commit tran, nên khi có 2 người làm cùng lúc thì có thể bị error. Bạn có thể sửa tên các table tạm được tạo trong storedproc bằng cách thêm dấu # phía trước (hơi phức tạp và dễ bị thiếu sót).

3. Việc chạy chậm có thể do đọc ghi đĩa nhiều chứ không phải thiếu cpu hay ram. Trong storedproc nó hay create table mới và select dữ liệu vào đó, cuối storedproc thì delete table. Bạn thử bỏ những lệnh delete table cuối cùng (bằng cách comment nó) rồi chạy 1 lần. Sau đó xem size của những table tạm này xem có phải rất lớn hay không. Nhớ bỏ comment trở lại.

4. Việc chạy chậm có thể do các field không được lập index đầy đủ. Bạn thử chọn 1 table lớn nào đó được select/update trong storedproc, và kiểm tra xem các field nằm trong mệnh đề where có được index hay không. Nếu không thì bạn tạo index cho nó và test lại. Index cũng cần được rebuild định kỳ.

5. Việc chạy chậm có thể do ảnh hưởng của việc check các ràng buộc toàn vẹn ở mức database. Nếu db lớn thì nên bỏ kiểm tra ràng buộc (bằng cách bỏ relationship giữa các field) và thực hiện kiểm tra ràng buộc ở mức ứng dụng.

6. Thay vì lấy report năm bằng cách chạy 1 report cho cả năm, thì có thể chạy report cho từng tháng và tổng hợp report 12 tháng thành 1 năm thì sẽ nhanh hơn nhiều. Không rõ đối với ứng dụng của bạn có thích hợp làm như vậy không.

Theo như mô tả thì db của bạn chưa phải quá lớn nên report không đến nỗi chậm thế. Tui biết có 1 database của 1 hãng viễn thông lớn ở VN, mỗi ngày nó phát sinh 30 triệu record (mỗi record là 1 cuộc gọi) vậy mà cuối tháng nó vẫn xuất ra được vài chục triệu report (mỗi report là 1 hoá đơn tính tiền), trong report đã tự động khấu trừ các khuyến mãi, giảm giá, giờ vàng giờ bạc giờ free gì gì đó.
Spam thêm một bài là góp một viên gạch xây diễn đàn lớn mạnh
[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 27/07/2010 09:45:44 (+0700) | #17 | 216428
lama
Member

[Minus]    0    [Plus]
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
[Profile] [PM]
Hi all,

Rất cám ơn mọi người đã chia sẻ, đóng góp. Xin báo 1 tin vui. Sau khi tham khảo nhiều góp ý trên diễn đàn, mình đã kiểm tra theo hướng nào dễ thực hiện trước, và đã kiểm tra theo hướng DeadLock. Các câu lệnh SELECT đáng lý phải dùng WITH(UNLOCK) --> Cả ngày hôm qua sau khi add code SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED vào Stored Proc để toàn bộ câu lệnch SELECT trong Stored đều sử dụng là WITH(UNLOCK) thì User không phàn nàn chậm như lúc trước nữa. Hy vọng sau khi tối ưu lại các Stored Proc và share bớt trên App nữa thì sẽ càng tốt hơn về performance. Phần tách SQL Server ra riêng có cách nào để mình chứng minh cho các Sếp và đề nghị thay đổi không nhỉ?

Mình cũng đã theo dõi Ổ cứng, Memory, và Network Interface theo hướng dẫn trang
www.computerperformance.co.uk 
thì hình như là ổ cứng bị overload thì phải. Memory cũng có vấn đề hay sao đó, Mình đã Enable PAE, restart server, gán Permission cho User để Lock Page, rồi Enable AWE lên 4GB, restart SQL nhưng thấy SQL vẫn không sử dụng bao nhiêu RAM (Tổng cộng cứ ở mức 2.3 GB là cao nhất, trong đó SQL sử dụng 1.6GB). Link :
http://msdn.microsoft.com/en-us/library/ms190673.aspx 


Xem Performance của Memory thì Page Faults/Sec hình như hơi bị nhiều, không biết có phải RAM bị hư không nữa.

Nhờ mọi người tiếp tục giúp đỡ và chia sẻ xem mình có nên thêm ổ cứng và thay RAM không ?

Ổ cứng cho chạy RAID10 chắc OK hơn RAID5 không ? Mình cũng nghĩ đến giải pháp SAN nhưng tốn kém quá, mà không lý nào Server vậy, với vài chục GB database mà chạy không nổi. Hic.

Phần rebuild index thì mình không dám đụng vào dưới SQL vì chương trình có cung cấp công cụ rebuild index và chỉ dám thực hiện trên đó.
Hiện tại với Server cấu hình trên, SELECT 1 bảng có 59 cột, 1triêu2 dòng thì mất 1 phút 20 giây thì có chấp nhận được không nhỉ ?

P/S : Mình có đính kèm file theo dõi Performance của HDD, Memory và Network bên dưới.
http://www.mediafire.com/?c74o54winr338ir 

[Up] [Print Copy]
  [Discussion]   Cần ai hiểu sâu về SQL Server giúp đỡ tìm nguyên nhân SQL chậm 27/07/2010 11:00:38 (+0700) | #18 | 216436
qtra004
Member

[Minus]    0    [Plus]
Joined: 19/04/2004 22:36:57
Messages: 298
Location: Kiwiland
Offline
[Profile] [PM]
http://msdn.microsoft.com/en-us/library/ms190764.aspx Raid 10 read+write nhanh hơn raid 5 tại vì không cần parity check.

Vấn đề RAM không sử dụng hết 4Gb tại vì SQL Server sử dụng memory dynamically, nó sẽ tự động sử dụng nhiều khi cần thiết và release bớt khi không cần thiết.

Server nào mà CPU support 64 bit với lại RAM >4GB thì nên sử dụng OS x64 bởi vì nó sử dụng CPU và RAM tốt hơn 32bit+PAE

Re-index ở tầng application thì cũng chỉ chạy SQL script ở phía sau thôi, đâu có khác gì bạn chạy Maintenance job từ Management Studio đâu.

Carpe diem quam minimum credula postero
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|