在when语句中,我的查询有很多子选择。太慢了。 我试图更改查询,但它无济于事,因为那样我没有得到丰富的结果。如何优化此查询?我可以创建索引吗?有人可以给我一个例子吗?
DECLARE @Warehouse AS VARCHAR(4)
SET @Warehouse = ''
SELECT CASE
WHEN T0.[manbtchnum] = 'N' THEN (SELECT Max(T4.docdate)
FROM oinm T4
WHERE T0.itemcode = T4.itemcode
AND T4.warehouse = T1.whscode)
ELSE
CASE
WHEN (SELECT Max(T4.indate)
FROM oibt T4
WHERE T4.[itemcode] = T0.itemcode
AND T4.[batchnum] = T2.[batchnum]
AND T4.whscode = T1.[whscode]) IS NULL THEN
(SELECT Max(T4.docdate)
FROM oinm T4
WHERE
T0.itemcode = T4.itemcode
AND T4.warehouse = T1.whscode
AND T4.[transtype] = '310000001')
ELSE (SELECT TOP 1 T44.docdate
FROM oibt T4
INNER JOIN ibt1 T44
ON T4.[itemcode] = T44.[itemcode]
AND T4.batchnum = T44.batchnum
AND T4.whscode = T44.whscode
WHERE T4.[itemcode] = T0.itemcode
AND T4.[batchnum] = T2.[batchnum]
AND T4.whscode = T1.[whscode]
ORDER BY T44.docdate DESC)
END
END AS 'last movement date',
CASE
WHEN T0.[manbtchnum] = 'N' THEN (SELECT Min(T4.docdate)
FROM oinm T4
WHERE T0.itemcode = T4.itemcode
AND T4.warehouse = T1.whscode
AND ( T4.[transtype] = 20
OR T4.transtype = 21
OR T4.transtype = 162
OR T4.[transtype] = 16
OR T4.[transtype] = 19
OR T4.[transtype] = 18 )
)
ELSE
CASE
WHEN (SELECT Min(T4.indate)
FROM oibt T4
WHERE T4.[itemcode] = T0.itemcode
AND T4.[batchnum] = T2.[batchnum]
AND T4.whscode = T1.[whscode]
AND ( T4.[basetype] = 20
OR T4.[basetype] = 21
OR T4.[basetype] = 162
OR T4.[basetype] = 16
OR T4.[basetype] = 19
OR T4.[basetype] = 18 )) IS NULL THEN
CASE
WHEN (SELECT Max(T4.docdate)
FROM oinm T4
WHERE T0.itemcode = T4.itemcode
AND T4.warehouse = T1.whscode
AND T4.[transtype] = '310000001') IS NULL THEN
(SELECT Min(T4.createdate)
FROM oibt T4
WHERE T4.[itemcode] = T0.itemcode
AND T4.[batchnum] = T2.[batchnum]
AND T4.whscode = T1.[whscode])
ELSE (SELECT Max(T4.docdate)
FROM oinm T4
WHERE T0.itemcode = T4.itemcode
AND T4.warehouse = T1.whscode
AND T4.[transtype] = '310000001')
END
ELSE (SELECT Min(T4.indate)
FROM oibt T4
WHERE T4.[itemcode] = T0.itemcode
AND T4.[batchnum] = T2.[batchnum]
AND T4.whscode = T1.[whscode]
AND ( T4.[basetype] = 20
OR T4.[basetype] = 21
OR T4.[basetype] = 162
OR T4.[basetype] = 16
OR T4.[basetype] = 19
OR T4.[basetype] = 18 ))
END
END AS 'First receipt',
Datediff(day, ( CASE
WHEN T0.[manbtchnum] = 'N' THEN (SELECT Min(T4.docdate)
FROM oinm T4
WHERE
T0.itemcode = T4.itemcode
AND T4.warehouse = T1.whscode
AND ( T4.[transtype] = 20
OR T4.transtype = 21
OR T4.transtype = 162
OR T4.[transtype] = 16
OR T4.[transtype] = 19
OR T4.[transtype] = 18 ))
ELSE
CASE
WHEN (SELECT Min(T4.indate)
FROM oibt T4
WHERE T4.[itemcode] = T0.itemcode
AND T4.[batchnum] = T2.[batchnum]
AND T4.whscode = T1.[whscode]
AND ( T4.[basetype] = 20
OR T4.[basetype] = 21
OR T4.[basetype] = 162
OR T4.[basetype] = 16
OR T4.[basetype] = 19
OR T4.[basetype] = 18 )) IS
NULL THEN
CASE
WHEN (SELECT Max(T4.docdate)
FROM oinm T4
WHERE T0.itemcode = T4.itemcode
AND T4.warehouse = T1.whscode
AND T4.[transtype] = '310000001')
IS NULL
THEN
(SELECT Min(T4.createdate)
FROM oibt T4
WHERE T4.[itemcode] = T0.itemcode
AND T4.[batchnum] = T2.[batchnum]
AND T4.whscode = T1.[whscode])
ELSE (SELECT Max(T4.docdate)
FROM oinm T4
WHERE T0.itemcode = T4.itemcode
AND T4.warehouse = T1.whscode
AND T4.[transtype] = '310000001')
END
ELSE (SELECT Min(T4.indate)
FROM oibt T4
WHERE T4.[itemcode] = T0.itemcode
AND T4.[batchnum] = T2.[batchnum]
AND T4.whscode = T1.[whscode]
AND ( T4.[basetype] = 20
OR T4.[basetype] = 21
OR T4.[basetype] = 162
OR T4.[basetype] = 16
OR T4.[basetype] = 19
OR T4.[basetype] = 18 ))
END
END ), Getdate()) AS 'Date difference first receipt'
FROM oitm T0
INNER JOIN oitw T1
ON T0.[itemcode] = T1.[itemcode]
LEFT JOIN oibt T2
ON T0.[itemcode] = T2.[itemcode]
AND T1.[whscode] = T2.[whscode]
INNER JOIN owhs T3
ON T1.[whscode] = T3.[whscode]
WHERE T1.[onhand] > '0'
AND ( T1.[whscode] = @Warehouse
OR ' ' = @Warehouse )
AND ( T2.quantity > 0
OR T2.quantity IS NULL )
答案 0 :(得分:0)
您可以找到此链接来创建索引 https://docs.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql?view=sql-server-2017
也请避免使用子查询,而不是尝试在关系之间建立join
并尝试对其进行优化。
答案 1 :(得分:0)
下面是一些您可以尝试的建议。
创建索引
CREATE INDEX ibt1_idx_[itemco_batchnu_whscode_docdate ON .ibt1 ([itemcode],batchnum,whscode,docdate);
CREATE INDEX oibt_idx_[itemco_[batchn_whscode_[basety ON .oibt ([itemcode],[batchnum],whscode,[basetype]);
CREATE INDEX oinm_idx_[transtype_itemcode_warehouse ON .oinm ([transtype],itemcode,warehouse);
CREATE INDEX oinm_idx_itemcode_warehouse ON .oinm (itemcode,warehouse);
CREATE INDEX oitm_idx_[itemcode] ON .oitm ([itemcode]);
CREATE INDEX oitw_idx_[onhand] ON .oitw ([onhand]);
CREATE INDEX owhs_idx_[whscode] ON .owhs ([whscode]);
优先考虑“或”条件的IN子句,即
T4.[basetype] IN ( 20, 21, 162, 16, 19, 18 ) INSTEAD-OF (T4.[basetype] = 20 OR T4.[basetype] = 21 OR T4.[basetype] = 162 OR T4.[basetype] = 16 OR T4.[basetype] = 19 OR T4.[basetype] = 18 )
对数值使用数字列类型
Change WHERE T1.[onhand] > '0' TO WHERE T1.[onhand] > 0