CREATE TABLE "HUIYING"."T_TEST_HH"
(
"ID" INT IDENTITY(1, 1) NOT NULL,
"NAME" VARCHAR(50),
"ADDRESS" VARCHAR(100),
"SEX" TINYINT,
"ALIAS" VARCHAR(50),
"AGE" INT,
"CREATE_TIME" TIMESTAMP(0),
"COLUMN_1" VARCHAR(255),
"COLUMN_2" VARCHAR(255),
"COLUMN_3" VARCHAR(255),
"COLUMN_4" VARCHAR(255),
"COLUMN_5" VARCHAR(255),
"COLUMN_6" TEXT,
NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE INDEX "index_name_add" ON "HUIYING"."T_TEST_HH"("NAME" ASC,"ADDRESS" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE INDEX "index_sex_age" ON "HUIYING"."T_TEST_HH"("SEX" ASC,"AGE" ASC,"CREATE_TIME" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
CREATE INDEX "index_sex_time" ON "HUIYING"."T_TEST_HH"("SEX" ASC,"CREATE_TIME" DESC) STORAGE(ON "MAIN", CLUSTERBTR) ;
加载400万条数据,使用sex+create_time复合索引
!
用OR子句连接查询很慢,改成in之后查询也很慢
优化SQL,不论什么数据库,返回百万以上,性能都在磁盘IO了,如果返回很少的数据,怎么着也能优化的。就算来个更大的联合索引,没有回表了,意义也不大。数据库本质离不开磁盘IO的。同样1G的数据量,数据库都要比在电脑上面复制粘贴1G文本都慢,没有缓存的情况下。
执行下试试
select /*+OPTIMIZER_OR_NBEXP(2)*/ id from HUIYING.T_TEST_HH where sex = 0 or sex = 1 order by create_time desc limit 0, 15;
sex字段应该是无过滤性的 你这个建个create_time的索引就好了 然后加上hint /+top_order_opt_flag(1)/
收集sql语句+执行计划+trace计划+et时间等西悉尼
步骤如下:
1、进入到数据库服务器或其他命令行客户端dmdbms/bin目录下
2、使用disql登录数据库
命令:./disql 用户名/密码:端口
3、执行命令
SQL>explain sql语句
获取执行计划,复制到文本中
4、执行命令
sf_set_session_para_value('MONITOR_SQL_EXEC',1);
set autotrace trace;
5、执行命令ed
6、类似vi编辑器,删除里边内容后,将sql粘到编辑器里,然后:wq
7、输入 / 执行SQL
8、获取trace计划,复制到文本中
9、输入命令et(执行号);
10、获取et时间,复制到文本中
然后把文本内容贴上来