2017-03-02 174 views
0

我目前正在嘗試執行關於許可的一些SAP分析。我想通過他們擁有的角色將用戶鏈接到交易,並根據他們的交易獲取所需的許可證。此分析跨多個SAP服務器執行,每個服務器包含多個SAP實例。在這個分析的某一點上,由於查詢永遠不會結束(我運行了更多的10個小時(儘管我有128 GB的RAM和大CPU性能),但我仍然在使用大型表和查詢優化。有關這些表我根據我的查詢:SQL Server大型表查詢優化

  1. SAP_LICENSING.DBO.calc_2_USER_ROLES其中包含100萬行,並通過那些列定義:DTT_ID(SAP服務器名稱),MANDT(SAP實例名稱),UNAME(用戶名) ,ASSIGNED_ROLE(他分配給的角色,例如:accoutant)。該表存儲分配給用戶的角色
  2. SAP_LICENSING.DBO.raw_AGR_1251其中包含2M (SAP服務器名稱),MANDT(SAP實例名稱),AGR_NAME(角色),LOW(事務範圍開始),HIGH(事務範圍結束)
  3. SAP_LICENSING.DBO.param_LICENSING_RULES包含140K行,並且由這些列定義:

    1. SAP_LICENSING.DBO:TRANSAC(事務),LICENSE(對於相關的交易所需的許可證)

    我已經設置在每個這些表的聚簇索引。 calc_2_USER_ROLES:DTT_ID,MANDT,UNAME,ASSIGNED_ROLE上的索引

  4. SAP_LICENSING.DBO.raw_AGR_1251:指數上DTT_ID,MANDT,AGR_NAME,低,高
  5. SAP_LICENSING.DBO.param_LICENSING_RULES:指數上TRANSAC

這裏是我的響應時間,在每個子查詢中的選擇:

  1. 關於UR別名子查詢:30秒
  2. 關於第t別名子查詢:2分鐘30秒
  3. 關於LR別名子查詢:5秒

請注意以下幾點:

  • 運行此查詢時,我看到的10%的CPU和RAM的30%,最大使用量
  • 的查詢工作迅速在SAP服務器的一個子集(1個SAP服務器名稱過濾器)
  • 第二子查詢來變換SAP交易範圍與同一個JOIN BETWEEN關鍵字
  • 的LEFT JOIN的使用,因爲我想保持無與倫比的交易進行進一步的分析兼容搜索交易

這是我與掙扎的相關查詢:

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; 

非常感謝任何幫助你能給。 最簡單方面

+0

當發佈需要調整的查詢時,只有當您發佈最少的repro以供其他人測試時纔是好的(可以是可以回答的)。這裏是一個很好的例子,生成表格模式,其他人的統計數據可以複製。看看我的問題DBA.SE獲取更多信息:http://dba.stackexchange.com/questions/157353/wrapping-query-in-if-exists-makes-it-very-slow – TheGameiswar

回答

0

您對最大的表執行一些代價高昂的字符串轉換,並使用JOIN條件中的結果。這肯定是低效的。默認情況下,SQL Server Optimiser會將最大的表放在最後,所以T將通過這些轉換的字符串將JOIN編成URLR

的一種方法是首先建立一個臨時表T,其他 - 創建與TRANSAC_FROMTRANSAC_TO和計算字段爲聚簇索引的一部分上SAP_LICENSING.DBO.raw_AGR_1251索引視圖。

如果您將T移動到FROM子句的前面,並將其餘表格移動到JOIN的前面,那麼您也可能會對優化程序感到幸運。值得嘗試OPTION (FORCE ORDER)

發佈當前的執行計劃也有助於給出適當的建議。

0
  • i)是否有可能刪除不同?
  • II)去批量插入
  • iii)將覆蓋索引/過濾指數
  • IV)評論插件,並選擇
  • V),如果指數沒有被使用,那麼你HV使用操作提示
  • 您忘記使用(nolock)