达梦 IN 查询的时候,条件超过10条失效

  1. 先看不生效SQL
SELECT
	* 
FROM
	(
	SELECT
		a.*,
		ROWNUM rnum 
	FROM
		(
		SELECT
			RES.* 
		FROM
			ACTIVITI_T.ACT_HI_VARINST RES 
		WHERE
			RES.PROC_INST_ID_ IN ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10') 
		ORDER BY
			RES.ID_ ASC 
		) a 
WHERE
	ROWNUM < 2147483647 ) WHERE rnum >= 1
  1. 生效SQL
SELECT
	* 
FROM
	(
	SELECT
		a.*,
		ROWNUM rnum 
	FROM
		(
		SELECT
		/*+ enable_index_join(1) INDEX("RES" "ACT_IDX_HI_PROCVAR_PROC_INST")*/ 
			RES.* 
		FROM
			ACTIVITI_T.ACT_HI_VARINST RES 
		WHERE
			RES.PROC_INST_ID_ IN ( '1', '2', '3', '4', '5', '6', '7', '8', '9', '10' ) 
		ORDER BY
			RES.ID_ ASC 
		) a 
WHERE
	ROWNUM < 2147483647 ) WHERE rnum >= 1;
  1. 官方给出来字段的解释:
ENABLE_INDEX_JOIN	是否允许使用索引连接,0:不允许;1:允许。	有些场景走索引连接反而效果更差,直接走 NEST LOOP INNER JOIN2,多见存在子查询场景。

**INDEX 猜想走的表索引 第一个值是表名称,第二个是索引名称**

<think>嗯,用户问的是达梦数据库如何加索引。首先,我得回忆一下达梦数据库的相关知识。达梦作为国产的关系型数据库,语法上和Oracle、MySQL有些类似,但肯定有自己的特性。索引的创建应该也是使用CREATE INDEX语句,不过具体细节可能会有不同。 首先,我需要确定用户可能的需求。他们可能想知道基本的索引创建方法,也可能需要了解不同类型的索引,比如唯一索引、复合索引或者函数索引。另外,索引的优化策略和注意事项也是常见的问题点,用户可能在使用过程中遇到了性能问题,想通过索引来优化查询速度。 接下来,我应该分步骤说明如何创建索引。首先是基本语法,比如CREATE INDEX index_name ON table_name (column1, column2...)。这里要强调语法结构,确保用户能正确编写语句。然后,可能需要举例说明,比如在员工表的姓名列上创建索引,这样用户更容易理解。 然后是不同类型的索引。比如唯一索引,使用CREATE UNIQUE INDEX,这时候要提醒用户唯一索引和主键的区别,以及何时使用唯一索引。复合索引的情况,需要说明列的顺序对查询的影响,比如最左匹配原则,这对性能优化很重要。还有函数索引,比如在列上使用UPPER函数,这时候要提到达梦是否支持函数索引,以及使用时的注意事项。 接下来是索引的管理部分,包括查看已有索引和删除索引。用户可能需要知道如何检查现有索引,避免重复创建,或者删除不再需要的索引。这里需要给出相应的SQL语句,比如查询系统表或视图,如SYSDBA.DBA_INDEXES,以及DROP INDEX的用法。 在注意事项方面,应该强调不要过度创建索引,因为会影响写操作的性能。选择合适的列,比如高选择性的列,以及频繁出现在WHERE或JOIN中的列。还有索引维护的重要性,比如定期重建索引,或者监控索引的使用情况,避免冗余。 另外,用户可能对达梦数据库的特定功能感兴趣,比如在线创建索引、并行创建等,这些高级功能是否支持,可能需要进一步说明。但考虑到用户的问题比较基础,可能暂时不需要深入这些高级话题,但可以简要提及,让用户知道有这些选项。 最后,确保整个回答结构清晰,分点说明,让用户能够一步步理解和操作。同时,要检查LaTeX格式是否正确,行内公式用$...$,独立公式用$$...$$,虽然这个问题可能涉及较少的数学公式,但如果有示例中的表达式需要注意格式。 可能还需要验证一下达梦数据库的具体系统视图名称,比如索引的存储位置是否是SYSDBA.DBA_INDEXES,或者是否有不同的命名方式,避免给出错误的信息。另外,函数索引在达梦中的支持情况,不同版本可能有差异,需要确认是否可用,否则示例可能需要调整。 总结下来,回答应该包括创建索引的步骤、类型、管理和注意事项,结构清晰,每一步都有示例和解释,帮助用户正确使用索引优化数据库性能。</think>达梦数据库加索引的完整流程及注意事项如下: ### 一、索引创建基础语法 1. 标准索引创建格式: ```sql CREATE [UNIQUE] INDEX <索引名> ON <表名> (<列名1> [ASC|DESC], <列名2>, ...) [TABLESPACE <表空间名>]; ``` * `UNIQUE`:建立唯一约束 * `ASC/DESC`:指定排序方向(默认ASC) * `TABLESPACE`:指定存储位置 2. 基础示例: ```sql -- 单列索引 CREATE INDEX idx_emp_name ON employee(name); -- 复合索引 CREATE INDEX idx_emp_dept_salary ON employee(department_id, salary DESC); ``` ### 二、索引类型详解 1. **唯一索引** ```sql CREATE UNIQUE INDEX idx_unique_emp_id ON employee(employee_id); ``` * 数据列值必须唯一 * 与主键区别:一个表只能有1个主键,但可创建多个唯一索引 2. **函数索引**(达梦8.0+支持) ```sql CREATE INDEX idx_upper_name ON employee(UPPER(name)); ``` * 支持表达式计算的索引 * 常用于大小写不敏感的查询优化 3. **位图索引** ```sql CREATE BITMAP INDEX idx_bit_gender ON employee(gender); ``` * 适用于低基数列(重复值多) * 典型场景:性别、状态标志等字段 ### 三、索引管理操作 1. 查看索引信息 ```sql -- 查看表所有索引 SELECT index_name, index_type, uniqueness FROM USER_INDEXES WHERE table_name = 'EMPLOYEE'; -- 查看索引列明细 SELECT * FROM USER_IND_COLUMNS WHERE index_name = 'IDX_EMP_DEPT_SALARY'; ``` 2. 重建索引 ```sql ALTER INDEX idx_emp_name REBUILD; ``` 3. 删除索引 ```sql DROP INDEX idx_emp_name; ``` ### 四、索引优化策略 1. **选择合适列** - WHERE子句频繁使用的列 - JOIN连接字段 - ORDER BY/GROUP BY涉及的列 2. **复合索引设计原则** - 最左前缀原则:`INDEX(a,b,c)` 可生效的查询条件 ```sql WHERE a=1 AND b>5 -- ✅ 生效 WHERE b=2 AND c=3 -- ❌ 不生效 ``` - 区分度高的列放左边 3. **避免过度索引** - 单表索引建议不超过5个 - 数据修改频度高的表需谨慎 ### 五、性能监控 1. 查看索引使用情况 ```sql SELECT sql_text, execution_count FROM V$SQL_PLAN WHERE object_name = 'IDX_EMP_DEPT_SALARY'; ``` 2. 索引效率分析 ```sql EXPLAIN SELECT * FROM employee WHERE department_id = 101 AND salary > 5000; ``` ### 六、特殊场景处理 1. **大表建索引** ```sql CREATE INDEX idx_large_table ON big_table(create_time) ONLINE; -- 在线创建(8.0+支持) ``` 2. **分区表索引** ```sql CREATE INDEX idx_partitioned ON sales(sale_date) GLOBAL; -- 全局索引 ``` ### 七、常见问题排查 1. 索引失效场景: - 列使用函数或运算:`WHERE salary+100 > 5000` - 隐式类型转换:`WHERE emp_no = 1001`(emp_no为字符串类型) - 使用`<>` `NOT IN`等否定操作符 2. 索引选择异常处理: ```sql -- 强制使用指定索引 SELECT /*+ INDEX(employee idx_emp_name) */ * FROM employee WHERE name = '张三'; ``` 建议通过达梦性能管理工具(如DEM)进行可视化索引分析,结合具体业务场景设计索引方案。定期使用`DBMS_STATS`包收集统计信息以保证优化器选择最优执行计划。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值