问个问题,关于where和from语句的用法和优化 我认为table1在前面好,因为table1的每一条都得和table2匹配。table2很小,所以很快。如果反过来? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 很多有经验的人都说table1放在前面好但是考虑一下算法是一样的所以很是困惑现在我做的项目一个sql查询就射击到好几个表下手就有点棘手了大家讨论一下吧 根据Oracle优化路径rule 模式下的规则:1、有两个索引存在的情况下,from后面大表在前。小表(返回记录少的表,不是记录少的表)在最后,作为驱动表,Oracle处理SQL语句是从左到右2、有一个索引,则顺序无关3、都没有索引,则大表应该在后 要根据有无索引,详细如下:表A有N行数据,符合连接条件的行树为A1,表B有M行数据,符合连接条件的行树为B1 1.A,B两表均无索引 如果A表驱动,则A表扫描一次,B表扫描A1次. 磁盘访问次数为:N+A1*M; 如果B表驱动,则B表扫描一次,A表扫描B1次. 磁盘访问次数为:M+B1*N; 2.A表无索引,B表有索引 如果A表驱动,则A表扫描一次,B表查A1次索引. 磁盘访问次数为:N+A1*LOG(M)/LOG(2); 如果B表驱动,则B表查一次索引,A表扫描B1次. 磁盘访问次数为:LOG(M)/LOG(2)+B1*N 3.A表有索引,B表无索引 如果B表驱动,则B表扫描一次,A表查B1次索引. 磁盘访问次数为:M+B1*LOG(N)/LOG(2); 如果A表驱动,则A表查一次索引,B表扫描B1次. 磁盘访问次数为:LOG(M)/LOG(2)+B1*N 4.A,B表均有索引如果A表驱动,则A表查一次索引,B表查A1次索引. 磁盘访问次数:LOG(M)/LOG(2)+A1*LOG(N)/LOG(2);如果B表驱动,则B表查一次索引,A表扫描B1次. 磁盘访问次数为:B1*LOG(M)/LOG(2)+LOG(N)/LOG(2) sql 优化 存在表T(a,b,c,d),要备份表中数据,写ORACLE,Sql。请教高手怎么写?在线等 怎样安装Oracle8i 有关oracle的死锁问题,客户端程序用pb编写。 请问如何通过SQL 语句 将userId相同,并且type相同的记录合并如下: 如何在数据库里保存回车啊? 请问如何在oracle9i中新建一个“方案”? 再求VB+Oracale客户端免安装的方法!!希望高手求救!!!给200分 关于Oracle触发器的问题,急! proc程序中如何实现在一个进程中开始事物,而在另一个进程中提交? oracle安装问题 ORACLE无法启动监听程序
但是考虑一下算法是一样的
所以很是困惑
现在我做的项目一个sql查询就射击到好几个表
下手就有点棘手了
大家讨论一下吧
rule 模式下的规则:1、有两个索引存在的情况下,from后面大表在前。小表(返回记录少的表,不是记录少的表)在最后,作为驱动表,Oracle处理SQL语句是从左到右2、有一个索引,则顺序无关3、都没有索引,则大表应该在后
1.A,B两表均无索引
如果A表驱动,则A表扫描一次,B表扫描A1次. 磁盘访问次数为:N+A1*M;
如果B表驱动,则B表扫描一次,A表扫描B1次. 磁盘访问次数为:M+B1*N;
2.A表无索引,B表有索引
如果A表驱动,则A表扫描一次,B表查A1次索引. 磁盘访问次数为:N+A1*LOG(M)/LOG(2);
如果B表驱动,则B表查一次索引,A表扫描B1次. 磁盘访问次数为:LOG(M)/LOG(2)+B1*N
3.A表有索引,B表无索引
如果B表驱动,则B表扫描一次,A表查B1次索引. 磁盘访问次数为:M+B1*LOG(N)/LOG(2);
如果A表驱动,则A表查一次索引,B表扫描B1次. 磁盘访问次数为:LOG(M)/LOG(2)+B1*N
4.A,B表均有索引
如果A表驱动,则A表查一次索引,B表查A1次索引.
磁盘访问次数:LOG(M)/LOG(2)+A1*LOG(N)/LOG(2);
如果B表驱动,则B表查一次索引,A表扫描B1次.
磁盘访问次数为:B1*LOG(M)/LOG(2)+LOG(N)/LOG(2)