В Linux для поиска самых больших файлов в каталоге и его подкаталогах использовать команду:

find . -type f -print | xargs du -m | sort -rn | lessfind . -type f -print | xargs du -m | sort -rn | less
---------------------------------------------------------------------
| Id | Operation | Name | Starts | A-Rows |
---------------------------------------------------------------------
|* 1 | CONNECT BY WITH FILTERING | | 1 | 14 |
|* 2 | TABLE ACCESS FULL | EMP | 1 | 1 |
| 3 | NESTED LOOPS | | 4 | 13 |
| 4 | BUFFER SORT | | 4 | 14 |
| 5 | CONNECT BY PUMP | | 4 | 14 |
| 6 | TABLE ACCESS BY INDEX ROWID| EMP | 14 | 13 |
|* 7 | INDEX RANGE SCAN | EMP_MGR_I | 14 | 13 |
| 8 | TABLE ACCESS FULL | EMP | 0 | 0 |
---------------------------------------------------------------------
create or replace view dba_tab_privs
(grantee, owner, table_name, grantor, privilege, grantable, hierarchy)
as
select ue.name, u.name, o.name, ur.name, tpm.name,
decode(mod(oa.option$,2), 1, 'YES', 'NO'),
decode(bitand(oa.option$,2), 2, 'YES', 'NO')
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
table_privilege_map tpm
where oa.obj# = o.obj#
and oa.grantor# = ur.user#
and oa.grantee# = ue.user#
and oa.col# is null
and oa.privilege# = tpm.privilege
and u.user# = o.owner#;GRANT UPDATE(some_column) ON tableselect /*+ ordered */ decode(sa.grantee#, 1, 'PUBLIC', u1.name), u2.name,
decode(min(option$), 1, 'YES', 'NO'),
decode(min(u1.defrole), 0, 'NO', 1, 'YES',
2, decode(min(ud.role#),null,'NO','YES'),
3, decode(min(ud.role#),null,'YES','NO'), 'NO')
from sysauth$ sa, user$ u1, user$ u2, defrole$ ud
where sa.grantee#=ud.user#(+)
and sa.privilege#=ud.role#(+) and u1.user#=sa.grantee#
and u2.user#=sa.privilege#
group by decode(sa.grantee#,1,'PUBLIC',u1.name),u2.name;
SELECT grantee, grantor, table_name FROM user_tab_privs
MINUS
SELECT grantee, grantor, table_name FROM user_tab_privs_made
MINUS
SELECT USER grantee, grantor, table_name FROM user_tab_privs_recdSQL> SELECT COUNT(*) FROM User_Role_Privs;
COUNT(*)
----------
28
SQL> SELECT COUNT(*) FROM session_roles;
COUNT(*)
----------
28
SQL> CREATE OR REPLACE PROCEDURE p IS
2 n NUMBER;
3 BEGIN
4 SELECT COUNT(*) INTO n FROM User_Role_Privs;
5 dbms_output.put_line('User_Role_Privs Count = ' || n);
6
7 SELECT COUNT(*) INTO n FROM session_roles;
8 dbms_output.put_line('session_roles Count = ' || n);
9 END;
10 /
Procedure created
SQL> EXEC p
User_Role_Privs Count = 28
session_roles Count = 0
PL/SQL procedure successfully completed
Что же делать? Ответ традиционен -- корректировать статистику. Причины, по которой статистика может быть неадекватной (кроме очевидной, что ее собирают неправильно или совсем не собирают):
- This is a global change to a local problem
- Although it appears to solve one problem, it is unknown how many bad execution plans resulted from this change
- The root cause of why the index plan was not chosen is unknown, just that tweaking parameters gave the desired result
- Using non-default parameters makes it almost impossible to correctly and effectively troubleshoot the root cause
Советы по исправлению ошибок можно прочитать в самой статье.
- Data skew: Is the NDV inaccurate due to data skew and a poor dbms_stats sample?
- Data correlation: Are two or more predicates related to each other?
- Out-of-range values: Is the predicate within the range of known values?
- Use of functions in predicates: Is the 5% cardinality guess for functions accurate?
- Stats gathering strategies: Is your stats gathering strategy yielding representative stats?
tcp.validnode_checking = yes
tcp.invited_nodes = (hostname1, hostname2) -- список разрешенных адресов
tcp.excluded_nodes = (192.168.10.1,localhost) -- список запрещенных адресов
dbms_system.ksdwrt(2,'Строка')
column sid new_value a
select sid from sysp where rownum = 1;
alter session set events '10132 trace name context forever, level 1';
select * from sysp where sid = &a;
alter session set events '10132 trace name context forever, level 0';
select * from sysp where sid = 116250109
sql_text_length=43
sql=
select * from sysp where sid = 116250109
----- Explain Plan Dump -----
----- Plan Table -----
============
Plan Table
============
-------------------------------------+-----------------------------------+
| Id | Operation | Name | Rows | Bytes | Cost | Time |
-------------------------------------+-----------------------------------+
| 0 | SELECT STATEMENT | | | | 3 | |
| 1 | INDEX UNIQUE SCAN | PK_SYSP | 1 | 25 | 2 | 00:00:01 |
-------------------------------------+-----------------------------------+
Predicate Information:
----------------------
1 - access("SID"=116250109)
Content of other_xml column
oracle@v-dev-10102sl-2:~&> oraenv
ORACLE_SID = [db1] ? db1
oracle@v-dev-10102sl-2:~&.>SET MARKUP HTML ON
SET TERMOUT OFF
SET FEEDBACK OFF
SPOOL current_employees.xls
SELECT employee_id,
employee_billing_rate employee_hire_date,
employee_name
FROM employee
WHERE employee_termination_date IS NULL;
SPOOL OFFSTORE SET original_settings REPLACE
SET ...
-- восстанавливаем настройки
@original_settings#!/bin/bash sqlplus -s gennick/secret << EOF
COLUMN tab_count NEW_VALUE table_count
SELECT COUNT(*) tab_count FROM user_all_tables;
EXIT table_count
EOF
let "tabcount = $?"
echo You have $tabcount tables.#!/bin/bash tabcount=`sqlplus -s gennick/secret << EOF
SET PAGESIZE 0
SELECT COUNT(*) FROM user_all_tables;
EXIT
EOF`
echo You have $tabcount tables.SET LOCAL=prod
sqlplus gennick/secret
sqlplus gennick/secret@prod -- это одно и тожеSELECT emp.name, emp.salary
FROM emp, dep
WHERE emp.dep_id = dep.dep_idSELECT emp.name, emp.salary
FROM empalter index t1_i1 coalesce;
alter index t1_i1 rebuild;
alter index t1_i1 rebuild online;set echo off
set serveroutput off
set termout off
set feedback off
ALTER SESSION SET statistics_level = ALL;
SELECT * FROM (&1);
set termout on
select *
from table(dbms_xplan.display_cursor( null, null, 'RUNSTATS_LAST'))
/
set serveroutput on
set feedback onEXPLAINED SQL STATEMENT:
------------------------
SELECT * FROM (select * from dual)
Plan hash value: 397561404
----------------------------------
| Id | Operation | Name |
----------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS FULL| DUAL |
----------------------------------
SQL_ID cp68bupvwmutb, child number 0
-------------------------------------
SELECT * FROM (select * from dual)
Plan hash value: 397561404
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
| 1 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$F5BB74E1 / DUAL@SEL$2
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "DUAL"."DUMMY"[VARCHAR2,1]select * from table(dbms_xplan.display_cursor( null, null, 'IOSTATS LAST'))select * from table(dbms_xplan.display_cursor( null, null, 'MEMSTATS LAST'))select * from table(dbms_xplan.display_cursor( null, null, 'ALL +NOTE'));select * from table(dbms_xplan.display_cursor( null, null, 'ALL +PEEKED_BINDS'));
SQL_ID 0fks8359u5u12, child number 0
-------------------------------------
SELECT * FROM (select * from a where a=:a)
Plan hash value: 2248738933
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 3915 (100)|
|* 1 | TABLE ACCESS FULL| A | 49336 | 47M| 3915 (1)| 00:00:47
-------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$F5BB74E1 / A@SEL$2
Peeked Binds (identified by position):
--------------------------------------
1 - :A (NUMBER): 2
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("A"=:A)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "A"[NUMBER,22], "A"."PADDING"[VARCHAR2,2000]
Note
-----
- dynamic sampling used for this statement
DROP TABLE a;
CREATE TABLE a(a NUMBER, b CHAR);
CREATE INDEX ix_a ON a(a);
INSERT INTO a SELECT 3, 'x' FROM all_objects WHERE ROWNUM <= 1;
INSERT INTO a SELECT 2, 'x' FROM all_objects WHERE ROWNUM <= 1;
INSERT INTO a SELECT 1, 'x' FROM all_objects WHERE ROWNUM <= 1000;
--EXEC dbms_stats.gather_table_stats('sps', 'a', CASCADE => TRUE)
EXEC dbms_stats.gather_table_stats('sps', 'a', method_opt => 'FOR ALL INDEXED COLUMNS SIZE repeat', CASCADE => TRUE)
--EXEC dbms_stats.gather_table_stats('sps', 'a', method_opt => 'FOR ALL INDEXED COLUMNS SIZE 254', CASCADE => TRUE)
COMMIT;
var sa NUMBER
var ea NUMBER
EXEC :sa := 0;
EXEC :ea := 1;
ALTER SESSION SET tracefile_identifier = 'size_repeat';
ALTER SESSION SET EVENTS '10053 trace name context forever, level 1';
ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
SELECT * FROM a WHERE a BETWEEN :sa AND :ea;
EXEC :sa := 2;
EXEC :ea := 3;
SELECT * FROM a WHERE a BETWEEN :sa AND :ea;
DISCONNECT;
There are two cases where the optimizer would peek at the actual bindings of a bind variable and where the actual bindings therefore could make a difference for what plan would get generated.Проверка показывает:
Range predicates. Example:
sales_date between :1 and :2 and price > :3.
Equality predicates when the column has histograms. Example:
order_status = :4
assuming that order_status has histograms.
CREATE TABLE a(a NUMBER, b CHAR);
CREATE INDEX ix_a ON a(a);
INSERT INTO a SELECT 2, 'x' FROM all_objects WHERE ROWNUM <= 1;
INSERT INTO a SELECT 1, 'x' FROM all_objects WHERE ROWNUM <= 1000;
BEGIN
dbms_stats.gather_table_stats(
'sps',
'a',
CASCADE => TRUE,
method_opt => 'for all indexed columns size 50');
END;
/
COMMIT;
var a NUMBER
EXEC :a := 1;
ALTER SESSION SET tracefile_identifier = 'hist_test';
ALTER SESSION SET EVENTS '10053 trace name context forever, level 1';
ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
SELECT * FROM a WHERE a = :a;
EXEC :a := 2;
SELECT * FROM a WHERE a = :a;
DISCONNECT;
*******************************************
Peeked values of the binds in SQL statement
*******************************************SELECT *
FROM
a WHERE a = :a
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.34 0.38 0 0 0 0
Fetch 11 0.00 0.00 0 16 0 1000
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 13 0.34 0.38 0 16 0 1000
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 781
Rows Row Source Operation
------- ---------------------------------------------------
1000 TABLE ACCESS FULL A (cr=16 pr=0 pw=0 time=1054 us)
SELECT *
FROM
a WHERE a = :a
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 1 0.00 0.00 0 7 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 0.00 0.00 0 7 0 1
Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 781
Rows Row Source Operation
------- ---------------------------------------------------
1 TABLE ACCESS FULL A (cr=7 pr=0 pw=0 time=128 us)
Результаты получаемы через explain plan:
SQL> SELECT * FROM a WHERE a = 2;
Execution Plan
----------------------------------------------------------
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 | 2 (0)|
| 1 | TABLE ACCESS BY INDEX ROWID| A | 1 | 5 | 2 (0)|
| 2 | INDEX RANGE SCAN | IX_A | 1 | | 1 (0)|
-------------------------------------------------------------------------
ALTER SESSION SET "_optim_peek_user_binds"=FALSE;
In ch 10 of the Oracle 9i Performance Tuning Guide, it says:Пример
"The resources reported for a statement include those for all of the SQL issued while the statement
was being processed. Therefore, they include any resources used within a trigger, along with the
resources used by any other recursive SQL (such as that used in space allocation). With the SQL
Trace facility enabled, TKPROF reports these resources twice. Avoid trying to tune the DML
statement if the resource is actually being consumed at a lower level of recursion."
ALTER SYSTEM SET statistics_level=all(хотя это надо еще проверить)