- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有三个表:
-建筑物
-房间
-人
一栋建筑可以有 1 到 30 个房间(假设平均为 3 个)
一栋建筑可以容纳 0 到 30 人(平均为 3 人)
一个房间和一个人只能属于一个建筑物。
每个月我们都会向数据库添加约 50,000 座新建筑及其房间和人员。
我们可以删除 2 年以上的数据,因此我们将拥有大约 120 万个建筑物行。
主要问题是我们想要搜索并返回通常(但并非总是)包含至少两个表(建筑物始终存在)的数据,因此我们必须执行联接。
我研究了 3 个解决方案。
所以问题是:
Oracle Cluster适合这种情况吗?
向这样的 Cluster 连续添加行可以吗?
如果您不推荐 Cluster,为什么以及什么更适合?
详细信息:
集群:
SELECT *
FROM
(SELECT *
/*+ FIRST_ROWS(200)*/
FROM BUILDING_C R
INNER JOIN PEOPLE_C C
ON (R.BUILDING_id = C.BUILDING_id)
INNER JOIN ROOM_C S
ON (S.BUILDING_id = R.BUILDING_id)
WHERE S.OPEN_DATE >= SYSDATE - 60 -1
AND S.OPEN_DATE <= SYSDATE - 60
ORDER BY S.OPEN_DATE
)
WHERE rownum < 200;--17 consistent gets
标准化:
SELECT *
FROM
(SELECT *
/*+ FIRST_ROWS(200)*/
FROM BUILDING_N R
INNER JOIN PEOPLE_N C
ON (R.BUILDING_id = C.BUILDING_id)
INNER JOIN ROOM_N S
ON (S.BUILDING_id = R.BUILDING_id)
WHERE S.OPEN_DATE >= SYSDATE - 60 -1
AND S.OPEN_DATE <= SYSDATE - 60
ORDER BY S.OPEN_DATE
)
WHERE rownum < 200;--44 consistent gets
最佳答案
集群是一种存储密切相关且经常连接到磁盘上同一区域的表的方法。簇键是在查询中通常用来连接表以节省 IO 的一列或多列。但是,如果单个集群行中所有表行的总大小超过磁盘 block 的大小,那么您最终将陷入链接,有一天,您将失去集群的所有优势。在我看来,最好避免,因为考虑到集群中的所有 3 个表的滚动量为 1.2 M,这将是一种开销,这显然会对 HWM 产生影响。
最好选择 JOINS。
例如。
CREATE TABLE BUILDING_C ( BUILDING_ID NUMBER PRIMARY KEY,
ADDRESS_FIELD VARCHAR2 ( 25 ) );
CREATE TABLE PEOPLE_C ( BUILDING_ID NUMBER PRIMARY KEY,
CUSTOMER_ID NUMBER,
ROOM_ID NUMBER,
CUSTOMER_DETAILS VARCHAR2 ( 25 ) );
CREATE TABLE ROOM_C ( BUILDING_ID NUMBER PRIMARY KEY,
ROOM_ID NUMBER,
OPEN_DATE DATE,
CURRENT_OCCUPANCY CHAR ( 1 ) );
BEGIN
DBMS_STATS.SET_TABLE_STATS ( OWNNAME => 'REALSPIRITUALS',
TABNAME => 'BUILDING_C',
NUMROWS => 20000000 );
END;
/
BEGIN
DBMS_STATS.SET_TABLE_STATS ( OWNNAME => 'REALSPIRITUALS',
TABNAME => 'PEOPLE_C',
NUMROWS => 20000000 );
END;
/
BEGIN
DBMS_STATS.SET_TABLE_STATS ( OWNNAME => 'REALSPIRITUALS',
TABNAME => 'ROOM_C',
NUMROWS => 20000000 );
END;
/
在您的查询中,您的提示将不会生效,因为您使用了 SELECT */*+ FIRST_ROWS(200)*/
而不是 SELECT/*+ FIRST_ROWS(200) */*
所以你最终会进入 OPTIMIZER MODE=ALL_ROWS 而不是 OPTIMIZER MODE=FIRST_ROWS
SET AUTOTRACE ON
SELECT
*
FROM
(SELECT
/*+ FIRST_ROWS(200)*/
*
FROM
BUILDING_C R
INNER JOIN PEOPLE_C C
ON ( R.BUILDING_ID = C.BUILDING_ID )
INNER JOIN ROOM_C S
ON ( S.BUILDING_ID = R.BUILDING_ID )
WHERE
S.OPEN_DATE >= SYSDATE - 60 - 1
AND S.OPEN_DATE <= SYSDATE - 60
ORDER BY
S.OPEN_DATE)
WHERE
ROWNUM < 200;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer Mode=HINT: FIRST_ROWS (Cost=54189 Card=199 Bytes=38 K)
1 0 COUNT STOPKEY
2 1 VIEW (Cost=54189 Card=50 K Bytes=9 M)
3 2 SORT ORDER BY STOPKEY (Cost=54189 Card=50 K Bytes=9 M)
4 3 FILTER
5 4 NESTED LOOPS
6 5 NESTED LOOPS (Cost=52041 Card=50 K Bytes=9 M)
7 6 MERGE JOIN (Cost=2020 Card=50 K Bytes=5 M)
8 7 TABLE ACCESS BY INDEX ROWID REALSPIRITUALS.BUILDING_C (Cost=826 Card=20 M Bytes=1G)
9 8 INDEX FULL SCAN REALSPIRITUALS.SYS_C00504893 (Cost=26 Card=20 M)
10 7 SORT JOIN (Cost=1194 Card=50 K Bytes=1 M)
11 10 TABLE ACCESS FULL REALSPIRITUALS.ROOM_C (Cost=660 Card=50 K Bytes=1 M)
12 6 INDEX UNIQUE SCAN REALSPIRITUALS.SYS_C00504894 (Cost=0 Card=1)
13 5 TABLE ACCESS BY INDEX ROWID REALSPIRITUALS.PEOPLE_C (Cost=1 Card=1 Bytes=91)
Statistics
----------------------------------------------------------
1 recursive calls
0 spare statistic 3
0 gcs messages sent
0 db block gets from cache
0 physical reads direct (lob)
0 queue position update
0 queue single row
0 queue ocp pages
0 HSC OLTP Compressed Blocks
0 HSC IDL Compressed Blocks
0 rows processed
建议:
关于oracle - 改进连接时的搜索。簇表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19766151/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!