[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
|
0 |
|
|
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
|
|
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
|
|
|
|
|
[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 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
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. |
|
|
|
[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
|
0 |
|
|
Joined: 19/04/2004 22:36:57
Messages: 298
Location: Kiwiland
Offline
|
|
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 |
|
|
|
[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
|
0 |
|
|
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
|
|
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. |
|
|
|
|
[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
|
0 |
|
|
Joined: 04/01/2007 14:32:38
Messages: 251
Offline
|
|
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
|
|
|
|
|
[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
|
0 |
|
|
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
|
|
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
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. |
|
|
|
|
[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
|
0 |
|
|
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
|
|
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'
|
|
|
|
|
[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 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
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. |
|
|
|
[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
|
0 |
|
|
Joined: 19/04/2004 22:36:57
Messages: 298
Location: Kiwiland
Offline
|
|
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 |
|
|
|
[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
|
0 |
|
|
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
|
|
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. |
|
|
|
|
[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 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
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. |
|
|
|
[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
|
0 |
|
|
Joined: 19/04/2004 22:36:57
Messages: 298
Location: Kiwiland
Offline
|
|
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 |
|
|
|
[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
|
0 |
|
|
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
|
|
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.
|
|
|
|
|
[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 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
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 |
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
[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
|
0 |
|
|
Joined: 19/04/2004 22:36:57
Messages: 298
Location: Kiwiland
Offline
|
|
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 |
|
Carpe diem quam minimum credula postero |
|
|
|
[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 |
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 |
|
|
|
[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
|
0 |
|
|
Joined: 14/06/2004 20:27:02
Messages: 40
Offline
|
|
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
|
|
|
|
|
[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
|
0 |
|
|
Joined: 19/04/2004 22:36:57
Messages: 298
Location: Kiwiland
Offline
|
|
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 |
|
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|
|
|