问题描述
嗨,团队,
Background:
我们有40-45个应用程序将SQL server作为数据库 (假名: <
这个 <
在这里,此 <
在我们的观点中,我们使用一些供应商表,这些表很大 (每个表中的数据300-400万),因为它们持有每日股票价格。
由于业务逻辑,我们必须将联接放在这些巨大的表上,然后获取整个数据,以便它们可以进一步用于将联接与SQL Server数据库 (<
Problem#1:
最初,当我们运行视图查询时,它会被挂起。并且不回应。所以,我们做了一些改变:
Changes :
1.重新编写查询以避免某些计算
2.创建了一些CTE。
3.创建的索引
4.解锁表统计/分析以计算统计信息/收集表的统计信息。
5.放入Oracle提示 (如US_NL,INDEX,LEADING等) 来制定自适应计划。
6.实现的并行度。
即使做了所有这些事情,我们也面临着这个问题。在某些情况下 (当我们没有where子句的情况下),视图给出初始结果 (不是所有的数据)。
但是,当我们放一些WHERE子句时,它的行为很奇怪。
Problem#2:
当我们尝试从SQL端 (使用链接服务器连接) 访问这些视图时,在Oracle端运行良好的视图在SQL端运行缓慢。
如果您可以在此方面提供帮助,将很有帮助。我被困住了。
Below is the query of the view :
WITH ttr AS (
SELECT /*+ INLINE */
*
FROM
swpr_eod.transaction
),ttd_base AS (
SELECT /*+ INLINE */
*
FROM
swpr_eod.transaction_detail
) SELECT
-- ***** DO NOT REMOVE BELOW AREA. THESE ARE ORACLE HINTS PLACED TO IMPORVE THE PERFORMANCE *****
--
/*+ parallel(ttr,4) parallel(tins,4) parallel(tig,4) parallel(tte,4) parallel(ttc,4) parallel(ttd,4) parallel(ttdb,4) parallel(ttds,4)
no_merge(ttr) no_merge(ttd_base)
LEADING(ttr tins tig ttt tte ttc ta ttrel ttd ttdb ttds tfi tce tii tfpr tfr vsac tpi ttrs1 vctp)
USE_NL(tins tig ttt tte ttc ta)
INDEX_JOIN(ttc idx_transaction_id idx_tran_cost_instrument_id)
INDEX_JOIN(ttr pk_transaction idx_instrument_id)
INDEX(ta idx_account_account_number)
INDEX(tfi IDX_FIRM_INSTRUMENT_INSTRUMENT_ID)
PARALLEL_INDEX(tii IDX_INST_IDEN_GLOBAL_ID_SCHE_CD_ACT_FLG)
PARALLEL_INDEX(ttd idx_tran_detail_transaction_id)
PARALLEL_INDEX(ttdb idx_tran_detail_fee_type_name)
PARALLEL_INDEX(ttds idx_tran_detail_fee_type_name)
INDEX_JOIN(ttr idx_tran_third_ini_bus_proc_ref idx_tran_third_ini_bus_proc_type_cd)
INDEX(tce PK_CA_EVENT)
PARALLEL_INDEX(tte idx_tran_ext_fee_package_profile_id)
INDEX(tfpr idx_fee_pkg_rule_fee_rule_profile_id)
INDEX(tfr pk_fee_rule)
INDEX(tpi idx_party_ident_entity_id)
PARALLEL_INDEX(ttrs1 pk_transaction)
PARALLEL_INDEX(ttr idx_tran_fourth_ini_bus_proc_type_cd)
PARALLEL_INDEX(ttr idx_tran_second_ini_bus_proc_ref)
*/
ta.account_number AS account_id,
tig.instrument_type_cd AS asset_class_cd,
tig.instrument_long_name AS asset_nm,
ttr.transaction_net_amt AS cash_effect_amt,
ttrs1.fourth_ini_bus_proc_ref AS clearing_broker_fins_id,
ttt.transaction_type_desc AS corporate_action_tp,
tii.instrument_external_id AS cusip_id,
ttr.transaction_dt AS entry_dt,
ttr.transaction_remarks_text AS explanation_tx,
ttc.base_national_cost_amt AS federal_tax_cost_amt,
tpi.tax_identifier_text AS for_interested_party_id,
ttr.gross_amt,
vctp.interested_party_id AS interested_party_id,
tte.base_fair_market_val AS market_val,
ttr.transaction_price AS per_unit_prc,
ttr.portfolio_id AS portfolio_num,
tte.submitter_team_id AS posting_location_id,
ttr.instrument_id AS property_num,
DECODE(ttr.reversed_transaction_flg,1,ttr.transaction_dt,NULL) AS reverse_dt,
ttrel.related_transaction_id AS reverse_tran_num,
ttr.reversed_transaction_flg AS reversed_transaction_fl,
ttr.reversal_flg AS reversing_transaction_fl,
ttr.settlement_dt AS settlement_dt,
vsac.source_account_id AS source_account_id,
ttr.trade_dt AS trade_dt,
ttr.transaction_id AS transaction_num,
tfi.instrument_template_id AS unique_asset_fl,
ttr.transaction_unit_qty AS unit_qty,
ttt.transaction_type_desc AS action_tx,
ttdb.transaction_amt AS broker_amt,
ttt.transaction_type_desc AS corporate_action_tx,
DECODE(ttr.transaction_type_cd,7,ttr.txn_description_cd,0) AS disbursement_cd,
tfr.fee_type_profile_id AS fee_tp,
DECODE(ttr.transaction_type_cd,6,ttr.txn_description_cd,0) AS receipt_cd,
ttr.custodian_account_entity_id AS registration_cd_1,
tte.fee_package_profile_id AS schedule_cd,
ttds.transaction_amt AS sec_fee_amt,
ttr.transaction_type_cd AS tran_subtype_cd,
ttr.transaction_type_cd AS transaction_type_cd,
ttr.accrued_interest_net_amt AS accrued_interest_amt,
vsac.pay_to_account_name AS additional_nm,
'NULL' AS broker_cd,
ttr.last_update_dt AS last_update_dt,
vctp.name_address_tx_2 AS name_address_tx_2,
vctp.name_address_tx_3 AS name_address_tx_3,
vctp.name_address_tx_4 AS name_address_tx_4,
'NULL' AS name_address_tx_5
--* Added Below Fields for CORP_Audit *
,
tte.submitted_by_userid AS poster_initials_tx,
tte.book_val AS book_val,
ttr.check_number AS check_num,
tte.ca_terms_text AS per_unit_rt,
tce.record_dt AS record_dt,
DECODE(ttr.transaction_type_cd,8,1,0) AS transfer_fl,
ttr.txn_description_cd
--ttd.component_type_cd
from
ttr
INNER JOIN swpr_eod.instrument tins ON tins.instrument_id = ttr.instrument_id
INNER JOIN swpr_eod.instrument_global tig ON tig.instrument_global_id = tins.instrument_global_id
INNER JOIN swpr_eod.transaction_type ttt ON ttt.transaction_type_cd = ttr.transaction_type_cd
INNER JOIN swpr_eod.transaction_ext tte ON tte.transaction_id = ttr.transaction_id
INNER JOIN swpr_eod.transaction_cost ttc ON ttc.transaction_id = ttr.transaction_id
AND ttc.instrument_id = ttr.instrument_id
INNER JOIN swpr_eod.account ta ON ta.account_id = ttr.account_id
LEFT OUTER JOIN swpr_eod.transaction_relationship ttrel ON ttrel.transaction_id = ttr.transaction_id
LEFT OUTER JOIN ttd_base ttd ON ttd.transaction_id = ttr.transaction_id
LEFT OUTER JOIN ttd_base ttdb ON ttdb.transaction_id = ttr.transaction_id
AND ttdb.fee_type_name IN (
'Broker Commission',
'Broker Dealer Fee Type'
)
LEFT OUTER JOIN ttd_base ttds ON ttds.transaction_id = ttr.transaction_id
AND ttds.fee_type_name IN (
'Sec Amount'
)
LEFT OUTER JOIN swpr_eod.firm_instrument tfi ON tfi.instrument_id = ttr.instrument_id
LEFT OUTER JOIN swpr_eod.ca_event tce ON tce.ca_event_id = ttr.third_ini_bus_proc_ref
AND ttr.third_ini_bus_proc_type_cd = 5
LEFT OUTER JOIN swpr_eod.instrument_identification tii ON tii.instrument_global_id = tig.instrument_global_id
AND tii.instrument_scheme_cd = 5
AND tii.active_flg = 1
LEFT OUTER JOIN swpr_eod.fee_package_rule tfpr ON tfpr.fee_package_profile_id = tte.fee_package_profile_id
LEFT OUTER JOIN swpr_eod.fee_rule tfr ON tfr.fee_rule_profile_id = tfpr.fee_rule_profile_id
LEFT OUTER JOIN bmo_ft_source_acccount_cash_transfers vsac ON vsac.transaction_id = ttr.transaction_id
LEFT OUTER JOIN swpr_eod.party_identification tpi ON tpi.entity_id = vsac.pay_to_party_id
LEFT OUTER JOIN ttr ttrs1 ON ttrs1.transaction_id = ttr.transaction_id
AND ttr.fourth_ini_bus_proc_type_cd IN (
14,
13
)
LEFT OUTER JOIN bmo_ft_cash_transfer_parties vctp ON vctp.transacation_ref_no = ttr.second_ini_bus_proc_ref ;
问候,
Prashant Srivastava
prashants7945@gmail.com
专家解答
有几件事要尝试。
1) 在事物的 * Oracle * 方面运行跟踪,以便您可以 * 确切地 * 看到从SQL Server传递的查询。为了进行讨论,可以说我们发现它很简单: “从MY_VIEW中选择 *”
2) 让我们看看优化器是否使用了良好的信息。所以在你的Oracle服务器上采取上面的查询并做:
从我的视图中选择/* 收集表统计 */ *
运行它,然后运行:
从表中选择 * (dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'))
这将为您提供计划每个部分的实际vs估计分析。寻找疯狂的差异或过度的开始。
3) 看看时间在哪里丢失。最好的方法是使用SQL监控。所以也添加一个监视器提示,然后运行它。
您可以在执行过程中反复运行以下内容,以查看计划的进展情况
希望这有所帮助
1) 在事物的 * Oracle * 方面运行跟踪,以便您可以 * 确切地 * 看到从SQL Server传递的查询。为了进行讨论,可以说我们发现它很简单: “从MY_VIEW中选择 *”
2) 让我们看看优化器是否使用了良好的信息。所以在你的Oracle服务器上采取上面的查询并做:
从我的视图中选择/* 收集表统计 */ *
运行它,然后运行:
从表中选择 * (dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'))
这将为您提供计划每个部分的实际vs估计分析。寻找疯狂的差异或过度的开始。
3) 看看时间在哪里丢失。最好的方法是使用SQL监控。所以也添加一个监视器提示,然后运行它。
您可以在执行过程中反复运行以下内容,以查看计划的进展情况
set pagesize 0 echo off timing off linesize 1000 set trimspool on trim on long 2000000 longchunksize 2000000 feedback off set termout off select DBMS_SQLTUNE.REPORT_SQL_MONITOR( sql_id=>'...', type=>'HTML', report_level=>'ALL') from dual spool sqlmon_output.htm / spool off set termout on
希望这有所帮助
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




