我正在寻找加快查询速度的有效方法。让我来描述一下情况。
每天晚上,我们将来自不同供应商的报告转储到表格中。这些是很多列,但下面的这些列是我用于加入查询的主要列。
tblVendorShippingInfo(请注意,下面的所有这些列都是VARCHAR,因为有时报告甚至在QtyShipped中包含Varchar字符)
PONum vSKU vSKUDesc ShipQuantity
P111111 A Test1 5
P111111 A Test1 2
P111111 B Test3 5
P100002 C Test4 6
P222222 D Test5 7
P222222 D Test5 6
P222222 E Test6 7
PABC123 F Test7 8
XYZ123 G Test8 8
GHEHEH H Test9 8
tblPODetail - 我们的采购订单表。请注意,POID和DistyShippedQty是Integer。 POID只有6位数字。
POID SKU SKUDesc DistyShippedQty
111111 A Test1
111111 B Test3
100002 C Test4
222222 D Test5
222222 E Test6
如果我使用下面这样的查询来获取和更新DistyShippedQty,它会起作用但因为转换速度慢......匹配VARCHAR ......等等。
select POID, SKU
, (
SELECT SUM(ShipQuantity) AS ShipQuantity
FROM tblVendorShippingInfo
WHERE substring(PONum, 2, 6) = Convert(varchar(10), pod.POID)
AND vSKU = pod.SKU
) AS QtyCount
FROM tblPODetail pod
所以,我正在寻找一种更好的方法来只过滤tblVendorShippingInfo表中的记录,该表只有PONum,从第2位开始有6位数(在P或任何字符之后),忽略所有带字符的记录(例如,PABC123,XYZ123 ,GHEHEH),然后索引它,以便它可以用于加入tblPODetail表。
我尝试使用过滤器创建索引视图,但是当我使用此视图运行查询时,它失败了。
Alter VIEW vw_tblVendorShippingInfo WITH SCHEMABINDING AS
select dfID, substring(PONum,2, 6) AS POID
, vSKU, ShipQuantity
FROM dbo.tblVendorShippingInfo
WHERE 1 = 1
AND PONum like '%[^0-9]%'
任何建议都将受到赞赏。
答案 0 :(得分:2)
我认为你走在正确的轨道上。您只需要like
的正确表达式:
SELECT POID, SKU,
(SELECT SUM(ShipQuantity) AS ShipQuantity
FROM tblVendorShippingInfo vsi
WHERE substring(vsi.PONum, 2, 6) = Convert(varchar(10), pod.POID) AND
vSKU = pod.SKU
) as QtyCount
FROM tblPODetail pod
WHERE PONum like '[A-Za-z][0-9][0-9][0-9][0-9][0-9][0-9]';
如果要将其作为整数索引,则使用计算列:
alter table tblVendorShippingInfo add column POID_num as try_convert(int, substring(PONum, 2, 6);
create index idx_tblVendorShippingInfo_POID on tblVendorShippingInfo(POID_num);
try_convert()
假设SQL Server 2012+。您可以使用早期版本的SQL Server执行类似的操作。
答案 1 :(得分:0)
如果是Oracle(可能还有其他人),您可以按列指定虚拟/计算的索引。
或者,在每晚上传期间添加一列并填充一次。