我目前正在尝试执行一些有关许可的SAP分析。我想通过他们所拥有的角色将用户链接到事务,并根据他们的事务获得所需的许可证。此分析在多个SAP服务器上执行,每个服务器包含多个SAP实例。在这一分析中,我遇到了大表和查询优化,因为查询永远不会结束(运行超过10个小时(尽管我有128 GB的RAM和较大的CPU性能)。
下面是有关我基于以下查询的表的一些详细信息:
我已经在每个表上设置了聚集索引:
以下是每个子查询的select响应时间:
请注意以下几点:
下面是我正在苦苦挣扎的相关查询:
INSERT INTO SAP_LICENSING.DBO.calc_3_USER_ROLES_TRANSACTIONS
SELECT UR.DTT_ID,UR.MANDT,UR.UNAME,UR.ASSIGNED_ROLE,
TRANSAC_FROM,TRANSAC_TO,SAP_TRANSAC_RANGE,LR.TRANSAC,LR.LICENSE
--Get User Role Assignments
FROM
(
SELECT DISTINCT UR.DTT_ID,UR.MANDT,UR.UNAME,UR.ASSIGNED_ROLE
FROM SAP_LICENSING.DBO.calc_2_USER_ROLES UR
)UR
--Join on transactions and Convert SAP Transaction ranges into SQL searchable ranges
JOIN
(
SELECT T.DTT_ID,T.MANDT,T.AGR_NAME,T.AUTH,
replace(replace(T.LOW,'*',' '),'$',' ') AS TRANSAC_FROM,
replace(replace(coalesce(T.HIGH,T.LOW),'*',left('ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ',41-len(coalesce(T.HIGH,T.LOW)))),'$','Z') AS TRANSAC_TO,
CONCAT(T.LOW,' TO ', isnull(T.HIGH,'')) as SAP_TRANSAC_RANGE
FROM SAP_LICENSING.DBO.raw_AGR_1251 T
)T
ON UR.ASSIGNED_ROLE=T.AGR_NAME and UR.MANDT=T.MANDT and UR.DTT_ID=T.DTT_ID
--Join on transactions requiring a license
LEFT JOIN SAP_LICENSING.DBO.param_LICENSING_RULES LR
ON LR.TRANSAC between T.TRANSAC_FROM and T.TRANSAC_TO;非常感谢你的帮助。最亲切的尊重
发布于 2017-03-02 11:42:52
发布于 2017-03-02 11:19:48
在最大的表上执行一些代价高昂的字符串转换,并在JOIN条件下使用结果。这肯定是没有效率的。默认情况下,Server会将最大的表放在最后,因此T将通过这些转换的字符串将JOIN编辑为UR和LR。
一种方法是首先创建一个临时表T,另一种方法是在SAP_LICENSING.DBO.raw_AGR_1251上创建一个索引视图,其中包含TRANSAC_FROM和TRANSAC_TO计算字段,作为聚集索引的一部分。
如果将T移到FROM子句的前面,并将表的其余部分移至JOIN,那么您也可能会对优化器感到幸运。也值得一试OPTION (FORCE ORDER)。
张贴当前的执行计划也将有助于提供适当的建议。
https://stackoverflow.com/questions/42552920
复制相似问题