Oracle hints select /*+index()*/

12 篇文章 1 订阅
6 篇文章 1 订阅

Oracle Hints是一种机制,用来告诉优化器按照我们的制定的方式生成执行计划,而不是根据它自己的分析生成执行计划。

一、我们可以用Oracle Hints来实现


1) 使用的优化器的类型。
2) 基于代价的优化器的优化目标,是all_rows还是first_rows。
3) 表的访问路径,是全表扫描,还是索引扫描,还是直接利用rowid。
4) 表之间的连接类型。
5) 表之间的连接顺序。
6) 语句的并行程度。

二、Hints应用要求


Hints只应用在它们所在sql语句块(statement block,由select、update、delete、insert关键字标识)上,对其它SQL语句或语句的其它部分没有影响。


三、使用Oracle Hints的语法

{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */
or
{DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]...

1) 如果包含多个提示,则每个提示之间需要用一个或多个空格隔开。
2) text 是其它说明hints的注释性文本。
3)使用表别名。如果在查询中指定了表别名,那么提示必须也使用表别名。例如:
  select /*+ index(d,demo_idx) */ * from demo d;
4)不要在提示中使用模式名称:如果在提示中指定了模式的所有者,那么提示将被忽略。例如:
 select /*+ index(scott.emp,demo_idx) */ * from demo d;


四、Hints的具体用法

优化器相关的hints

1、/*+ ALL_ROWS */
表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化。
SELECT /*+ ALL+_ROWS*/ DEMO_NO,DEMO_NAME,DEMO_ADDR FROM DEMO WHERE DEMO_NO='ITWUYI';

2、/*+ FIRST_ROWS(n) */
表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化。
SELECT /*+FIRST_ROWS(20) */ DEMO_NO,DEMO_NAME,DEMO_ADDR FROM DEMO WHERE DEMO_NO='ITWUYI';

3、/*+ RULE*/
表明对语句块选择基于规则的优化方法。
SELECT /*+ RULE */ DEMO_NO,DEMO_NAME,DEMO_ADDR FROM DEMO WHERE DEMO_NO='ITWUYI';

访问路径相关的hints

1、/*+ FULL(TABLE)*/
表明对表选择全局扫描的方法。
SELECT /*+FULL(A)*/ DEMO_NO,DEMO_NAME FROM DEMO A WHERE DEMO_NO='ITWUYI';

2、/*+ INDEX(TABLE INDEX_NAME) */
表明对表选择索引的扫描方法。
SELECT /*+INDEX(DEMO SEX_INDEX) */ * FROM DEMO WHERE SEX='M';

3、/*+ INDEX_ASC(TABLE INDEX_NAME)*/
表明对表选择索引升序的扫描方法。
SELECT /*+INDEX_ASC(DEMO PK_DEMO) */ * FROM DEMO WHERE DPT_NO='ITWUYI';

4、/*+ INDEX_COMBINE*/
为指定表选择位图访问路经,如果INDEX_COMBINE中没有提供作为参数的索引,将选择出位图索引的布尔组合方式。
SELECT /*+INDEX_COMBINE(DEMO SAL_BMI HIREDATE_BMI) */  * FROM DEMO WHERE SAL<5000000 AND HIREDATE;

5、/*+ INDEX_JOIN(TABLE INDEX_NAME1 INDEX_NAME2) */
当谓词中引用的列都有索引的时候,可以通过指定采用索引关联的方式,来访问数据。
select /*+ index_join(t t_ind t_bm) */ id from t where id=100 and object_name='ITWUYI';

6、/*+ INDEX_DESC(TABLE INDEX_NAME)*/
表明对表选择索引降序的扫描方法。
SELECT /*+INDEX_DESC(DEMO PK_DEMO) */ * FROM DEMO WHERE DPT_NO='ITWUYI';

7、/*+ INDEX_FFS(TABLE INDEX_NAME) */
对指定的表执行快速全索引扫描,而不是全表扫描的办法。
SELECT /* + INDEX_FFS(DEMO IN_EMPNAM)*/ * FROM DEMO WHERE DPT_NO='TEC305';

8、/*+ INDEX_SS(T T_IND) */
从9i开始,oracle引入了这种索引访问方式。当在一个联合索引中,某些谓词条件并不在联合索引的第一列时,可以通过Index Skip Scan来访问索引获得数据。当联合索引第一列的唯一值个数很少时,使用这种方式比全表扫描效率高。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
将 data:image/svg+xml;base64, 开头的 SVG 格式的 base64 编码字符串转换为 data:image/png;base64, 格式的 PNG 格式的 base64 编码字符串,需要进行以下步骤: 1. 将 SVG 格式的 base64 编码字符串解码为文本。 2. 使用 java 的第三方库将 SVG 文本转换为 BufferedImage 对象。 3. 将 BufferedImage 对象转换为 PNG 格式的 base64 编码字符串。 下面是一个示例代码: ```java import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Base64; import javax.imageio.ImageIO; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.TranscodingHints; import org.apache.batik.transcoder.image.PNGTranscoder; public class SvgToPng { public static String convert(String base64Svg) throws Exception { // decode base64 string to text byte[] svgBytes = Base64.getDecoder().decode(base64Svg); String svgText = new String(svgBytes); // create PNG transcoder PNGTranscoder transcoder = new PNGTranscoder(); TranscodingHints hints = new TranscodingHints(); hints.put(PNGTranscoder.KEY_WIDTH, 800f); // set image width hints.put(PNGTranscoder.KEY_HEIGHT, 600f); // set image height transcoder.setTranscodingHints(hints); // transcode SVG text to BufferedImage TranscoderInput input = new TranscoderInput(svgText); ByteArrayOutputStream pngStream = new ByteArrayOutputStream(); TranscoderOutput output = new TranscoderOutput(pngStream); transcoder.transcode(input, output); pngStream.flush(); pngStream.close(); ByteArrayInputStream pngInputStream = new ByteArrayInputStream(pngStream.toByteArray()); BufferedImage pngImage = ImageIO.read(pngInputStream); // encode BufferedImage to base64 string ByteArrayOutputStream pngBytes = new ByteArrayOutputStream(); ImageIO.write(pngImage, "png", pngBytes); byte[] pngData = pngBytes.toByteArray(); String base64Png = Base64.getEncoder().encodeToString(pngData); return base64Png; } } ``` 使用示例: ```java String base64Png = SvgToPng.convert("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJzdmc..."); // replace with your base64 SVG string System.out.println(base64Png); ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值