我希望你能够帮我找到有效的方法来加速我的查询。让我描述一下现状。
每天晚上,我们会将来自不同供应商的报告转储到一张表中。这个表有很多列,但下面这些列是我在查询中使用的主要列。
tblVendorShippingInfo(请注意,下列所有列都是VARCHAR类型,因为有时候报告中甚至包含varchar字符,即使是在QtyShipped列中也是如此)
如果我使用以下这样的查询来获取和更新DistyShippedQty,虽然会起作用,但速度会很慢,因为要进行转换匹配VARCHAR等操作。
所以,我正在寻找一种更好的方法来过滤只有6位数字开头为第二位(在P或任何字符之后)的PONum的tblVendorShippingInfo表中的记录,忽略所有带有字符的记录(例如PABC123、XYZ123、GHEHEH),然后对其进行索引,以便与tblPODetail表连接。我尝试创建一个带有过滤器的索引视图,但当我使用此视图运行查询时,它失败了。
任何建议都将不胜感激。
每天晚上,我们会将来自不同供应商的报告转储到一张表中。这个表有很多列,但下面这些列是我在查询中使用的主要列。
tblVendorShippingInfo(请注意,下列所有列都是VARCHAR类型,因为有时候报告中甚至包含varchar字符,即使是在QtyShipped列中也是如此)
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都是整数。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
所以,我正在寻找一种更好的方法来过滤只有6位数字开头为第二位(在P或任何字符之后)的PONum的tblVendorShippingInfo表中的记录,忽略所有带有字符的记录(例如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]%'
任何建议都将不胜感激。
WHERE
从句来达到此目的,而不会使它变得特别缓慢:WHERE PONum LIKE CONCAT('_', pod.POID)
。这样做的好处是,你不需要对PONum进行子字符串连接,而且我相信你应该能够使用在PONum和POID上拥有的任何索引。 - ZLKLIKE '_' + CAST(pod.POID AS VARCHAR(10))
与 CONCAT 的效果相同。问题不应该是转换,而是您正在连接 PONum 的子字符串。如果仍然很慢,那么您的视图解决方案可能是最好的。 - ZLKWHERE CONVERT(int, substring(PONum, 2, 6)) = pod.POID
- artm