我的问题是:
SELECT category, count(*)
FROM large_data_table t
WHERE
(t.val IN (SELECT val FROM SMALL_TABLE WHERE id = 1))
OR
(t.val IN (SELECT val FROM SMALL_TABLE WHERE id = 2))
GROUP BY GROUPING SETS ((category), ());
得到的执行计划如下所示:
SELECT STATEMENT
SORT (GROUP BY ROLLUP)
FILTER
large_data_t
我正在对Oracle中的查询计划进行一些实验,我有下表:
--create a table to use
create table SKEWED_DATA(
EMP_ID int,
DEPT int,
COL2 int,
CONSTRAINT SKEWED_DATA_PK PRIMARY KEY (EMP_ID)
);
--add an index on dept
create index SKEWED_DATA_INDEX1 on SKEWED_DATA(DEPT);
然后,我插入了100万行数据,其中999,999行有dept id 1,1行有dept id 99。
在计算
ORA-20010: DBMS_STATS INTERNAL ERROR in fill_cstats : both dmin/dmax and nmin/nmax are null for table SOA, column KEY , ssize 29892
ORA-06512: at "MOSTI", line 165
ORA-06512: at line 1
以上错误发生在生产过程中,请有人解释一下发生的原因和解决办法?
在一个简单的联接中,我想限制第一个表的结果。所以我想这么做:
WITH events AS (SELECT event FROM risk_event WHERE status = 'ABC' AND rownum <= 20)
SELECT event_id
FROM events ev, attributes att
WHERE ev.event_id = att.risk_event_id
FOR UPDATE NOWAIT
问题是,由于rownum<=20和FOR UPDATE NOWAIT‘,我得到了一个
我使用exdp工具导出了一个非常大的表的一部分。但之前我在源表中检查了满足条件的记录数,结果显示:
select count(*) from SCHEMA.MYTABLE where TIMESTAMP>=1388361600000 and TIMESTAMP<1393200000000;
1624352128
然后我使用参数导出:
dumpfile=EKSPORT_DIR:eksport-1388361600000-1393200000000-2014_1__%U.dmp
logfile=EKSPORT_DIR:eksport-1388361600000-139320000000
我继承了一个旧脚本,作为pl/sql例程的一部分,应该为我创建一个临时索引。我在Oracle 11.2.0.4.0上尝试过,但它不接受这些选项。
CREATE INDEX x ON y(gid) {IN IndexTableSpace} {ORACLE}COMPUTE STATISTICS{ORACLE OFF};
但是,我不熟悉{}中列出的选项。有人能告诉我这些是什么吗?以下是否是更新后的相应内容?
create index x on y(gid) tablespace IDX_TS;
任何帮助都是非常感谢的!
当我得到以下查询的解释计划时,我看到,两个表都有完整的表扫描。
SELECT *
FROM employees e,
departments d
WHERE e.employee_id = d.manager_id;
下面是使用explain plan命令获得的解释计划。
但是,如果我获得与SQL相同查询的解释计划,则会看到一个明显不同的解释计划。特别是,它在buttom上完全写入了表访问,但是通过它,它通过索引rowid编写了表访问。
这是我从SQL开发人员那里得到的解释计划。
我的问题是,有人能一步一步地解释step 的解释计划吗?以及为什么和e
我想做一个存储过程来检查Oracle数据库表,并为它们做统计数据收集。到目前为止,我已经做到了这一点,现在我想知道如何在同一个循环中捕获每一行的执行结果? declare
comm varchar2(200);
cursor c1 is
select owner, table_name, num_rows, last_analyzed from dba_tables
where num_rows>=500000
and owner not in ('SYS','SYSTEM')
and last_a
我有一个包裹在下面
CREATE PACKAGE p1
IS
FUNCTION f1
RETURN NUMBER;
END;
CREATE OR REPLACE PACKAGE BODY p1
IS
FUNCTION f1
RETURN NUMBER
IS
BEGIN
RETURN 1;
END;
BEGIN
DBMS_STATS.gather_table_stats ('WMXT', 'EMP', estimate_percent => 10);
END;
当我试图调用函数f1时
我们有一个承载Peoplesoft模式的DB,有33.000多个表。自去年12月以来,甲骨文留下了1.8万多个没有更新的统计数据:
SQL> select to_char(last_analyzed,'YYYYMM') ,count(*) from dba_tables where
2 owner='SYSADM' group by to_char(last_analyzed,'YYYYMM') order by 1;
TO_CHA COUNT(*)
------ ----------
202012 183
我在表单中有一个查询:
select a, b, c, d, e, f, g, h,
row_number () over (partition by a, b order by c, d, e, f) as order
from table;
而且它的性能也有点糟糕。
我们已经尝试创建了2个索引,第一个用于按列划分(a和b),第二个用于order by列(c,d,e,f)。
使用explain计划,我们发现索引没有被使用。尽管它们用于带有group by子句的其他查询。
关于如何重构查询,或重新创建索引以帮助提高查询性能,您有什么想法吗?
提前感谢
我有两个我们的应用程序执行的查询,查询之间唯一的区别是'count(*)‘列(在一个查询中,我有它,在另一个查询中,我没有)。
所有查询都是动态生成的,我们将我们的软件提供给他们在数据库上运行的客户端(我们无法访问他们的数据库)。其中一个查询运行得非常慢(在等待了几个小时之后,我无法完成它)。建议接受SQL概要文件,这很有帮助,但这意味着我必须告诉我们的客户端运行它,并接受计划。如果我们可以创建一个索引来加快查询速度,那就好多了。
以下是查询的内容:
select
a.company_id
, count(*)
from
b
INNER JOIN a
ON
b.company_
我正在尝试获取模式中所有表的记录计数。我在编写PL/SQL时遇到了问题。以下是我到目前为止所做的工作,但我收到了错误。如有任何更改,请提出建议:
DECLARE
v_owner varchar2(40);
v_table_name varchar2(40);
cursor get_tables is
select distinct table_name,user
from user_tables
where lower(user) = 'SCHEMA_NAME';
begin
open get_tables;
fetch get_tables into v_table_
我已经创建了一个由8个表的联合组成的视图,结果产生了大约400万条记录。所有涉及到的表都有索引。不过,执行select查询需要很长时间。有什么方法可以提高性能吗?
视图定义:
Create view view1(a,b,c,d) AS
select a,b,c,d from
table1
UNION ALL
select a,b,c,d from
table2
UNION ALL
select a,b,c,d from
table3
UNION ALL
select a,b,c,d from
table4
UNION ALL
select a,b,c,d from
table5....
--s
查询:
SELECT tbl1.*
FROM tbl1
JOIN tbl2
ON (tbl1.t1_pk = tbl2.t2_fk_t1_pk
AND tbl2.t2_strt_dt <= sysdate
AND tbl2.t2_end_dt >= sysdate)
JOIN tbl3 on (tbl3.t3_pk = tbl2.t2_fk_t3_pk
AND tbl3.t3_lkup_1 = 2577304
AND tbl3.t3_lkup_2 = 1220833)
where tbl2.t2_lkup_1 = 1020000002981587;
事实:
我在oracle中创建了一个存储过程来查找所有表的行数。我必须每天运行这些过程来查找ETL之后加载的每日数据。我已经创建了下面的过程。
create or replace Procedure Proc_RSE_TABLE_ROW_Count AS
TYPE c_table_list IS REF CURSOR ;
C_table_name c_table_list;
RSE_ROW_COUNT NUMBER;
SQL_11g VARCHAR2(500);
SQL_CURSOR VARCHAR2(500);
V_TABLE_NAME VARCHAR2(30);
BEGIN
SQL_CUR
我有一个Oracle表,其中包含标记为attribute1到attribute15的列。我需要列出其中包含任意值的任何列。
我需要做一些像这样的事情;
select ...
from table
where column_name like 'attribute%'
and column is not null
找不到任何类似的东西
我每天都使用压缩查询选项对Oracle 11.2数据库中的分区进行分区表。
“按键删除”和“直接插入”用于填充表的数据。所以目前这张桌子是支离破碎的。
正如我从Oracle文档中了解到的,收缩空间不能应用于压缩表。
我执行了接下来的动作
alter table order nocompress;
alter table order enable row movement;
alter table order MODIFY PARTITION SYS_P21674395 nocompress;
....
还检查了表空间的自动可扩展性。
select tablespace_name, file_n
在我的Oracle数据库中,我有一个3.44GB大小的表。它是1784486行,450146行,相当于8 kB块大小,平均每块4行,或每行2 kB。但是AVG_ROW_LEN只有369字节。是什么导致了这种差异?
更多详细信息:
PCT_FREE只有10,所以这不应该负责。压缩当前已关闭。表布局为(列名通用)
KEY NUMBER(38) NOT NULL,
DATE1 DATE NOT NULL,
DATE2 DATE NOT NULL,
POINT
我是一名长期从事MSSQL开发的开发人员,自Oracle 7以来第一次回到PL/SQL中。我正在寻求一些调优建议,re是一个大型导出存储过程,它是偶尔的,在某些点上不能很好地复制运行。这种情况发生在一些静态工作表上,它截断、填充和使用这些表作为导出的一部分。大纲中的代码通常如下所示:
create or replace Procedure BigMultiPurposeExport as (
-- about 2000 lines of other code
INSERT WORK_TABLE_5 SELECT WHATEVER1 FROM WHEREVER1;
INSERT WORK_T
每一天,要求变得越来越奇怪。
我被要求将一个查询放在一起,以检测表中哪些列对所有行都包含相同的值。我说:“这需要通过程序来完成,这样我们就可以在表的一次传递而不是N次传递中完成。”
我被否决了。
长话短说。我有一个非常简单的查询,它演示了这个问题。它使4通过测试集。我正在寻找SQL Magery的一些想法,它不需要在每一列中添加索引,也不需要编写程序,也不需要花费完整的人工生命周期来运行。
感叹,它需要能够在任何表上工作。
提前谢谢你的建议。
WITH TEST_CASE AS
(
SELECT 'X' A, 5 B, 'FRI' C, NULL D F
我正在使用oracle 11g并尝试优化查询。
查询的基本结构是:
SELECT val1, val2, val3,
FROM
table_name
WHERE
val1 in (subselect statement is here, it selects a list of possible values for
val1 from another table)
and val5>=X and val5<=Y
group by val1
order by val2 desc;
我的问题是,当我使用subselect时,成本是3130。如果我手动填充子选择的结果,例