我如何使用DB2的Explain函数? - 既可以运行它,也可以用它来优化查询.有没有更好的DB2工具?
我之前已经建立了查询,但是我必须告诉他们需要多长时间的唯一方法就是运行它们并计算时间 - 这几乎不是理想的.
编辑:我的答案结果是"你做不到.你没有,也无法获得访问权限." 你不喜欢官僚主义吗?
当我们使用关键字"explain"为SQL查询添加前缀时,我们会得到一个包含一些列的表.请告诉我什么是"类型"列.是什么eq_ref和ref意味着在这方面.
我在Mysql中运行了一个查询,如下所示:
EXPLAIN
SELECT *
FROM(
SELECT * # Select Number 2
FROM post
WHERE parentid = 13
ORDER BY time, id
LIMIT 1, 10
) post13_childs
JOIN post post13_childs_childs
ON post13_childs_childs.parentid = post13_childs.id
Run Code Online (Sandbox Code Playgroud)
结果是:
id |select_type |table |type |possible_keys |key |key_len |ref |rows |Extra
1 |PRIMARY |<derived2> |ALL | NULL | NULL |NULL |NULL |10 |
1 |PRIMARY |post13_childs_childs|ref |parentid |parentid |9 |post13_childs.id |10 |Using where
2 |DERIVED |post |ALL |parentid |parentid |9 | |153153 |Using where; Using filesort
Run Code Online (Sandbox Code Playgroud)
这意味着它使用了索引, …
我打算使用这个SQL SELECT创建一个视图,但它的解释显示它使用临时和使用filesort.我无法弄清楚我需要什么指数才能解决这个问题.大多数情况下,我想知道为什么它使用fileort intead使用索引进行排序.
这是我的表格:
CREATE TABLE `learning_signatures` (
`signature_id` int(11) NOT NULL AUTO_INCREMENT,
`signature_file` varchar(100) NOT NULL,
`signature_md5` varchar(32) NOT NULL,
`image_file` varchar(100) NOT NULL,
PRIMARY KEY (`signature_id`),
UNIQUE KEY `unique_signature_md5` (`signature_md5`)
) ENGINE=InnoDB AUTO_INCREMENT=640 DEFAULT CHARSET=latin1
CREATE TABLE `learning_user_suggestions` (
`user_suggestion_id` int(11) NOT NULL AUTO_INCREMENT,
`signature_id` int(11) NOT NULL,
`ch` char(1) NOT NULL,
`time_suggested` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`user_suggestion_id`),
KEY `char_index` (`ch`),
KEY `ls_sig_id_indx` (`signature_id`),
KEY `user_id_indx` (`user_id`),
KEY `sig_char_indx` (`signature_id`,`ch`)
) …Run Code Online (Sandbox Code Playgroud) 我有一个包含INT列的200k条目表.我想创建一个索引来加快查询速度.这是我想要执行的查询:SELECT A,B,C,D,E FROM table WHERE A=23 and (B=45 or C=43).我创建了以下指标:B,ACD,C,ABC.
通过EXPLAIN命令,我发现MySQL选择了索引ACD.所以我一直用更多的值填充表格,我意识到MySQL正在上面的索引之间切换(并不总是相同的).
由于存在许多插入,具有各种索引将导致性能问题,并且我们可以假设该表由其他查询访问,这些查询需要不同的列,其中每个索引都有意义.
我知道USE INDEX(),但我想了解我们是否应该相信MySQL选择正确的索引.
我一直在寻找这个,他们都说了某种百分比,解释一下:
EXPLAIN EXTENDED SELECT * FROM PageAccess ORDER BY AccessId DESC LIMIT 20;
SELECT COUNT(*) FROM PageAccess;
Run Code Online (Sandbox Code Playgroud)
赠送:
id, select_type, table, type, possible_keys, key, key_len, ref, rows, filtered, Extra
1, 'SIMPLE', 'PageAccess', 'index', '', 'PRIMARY', '4', '', 20, 9295.00, ''
Run Code Online (Sandbox Code Playgroud)
(是的,过滤= 9295.00)
和:
1830
Run Code Online (Sandbox Code Playgroud)
对于计数(*)
是的我想要最后20行,AccessId是自动递增的主键.
9295是什么意思!?
我想知道如何使用Java获取解释计划.我需要这个的原因是因为我们有一个特殊用户可以制作报告的框架.这些报告有时会构建大量查询,我们希望在其中动态解释并存储成本.这样我们就可以在以后分析高成本查询并进行优化.
给出非法列异常的示例代码:
ResultSet rs = null;
try {
oracle = ConnectionManager.getConnection(ConnectionManager.Test);
pstmt = oracle.prepareStatement("begin execute immediate
'explain plan for SELECT 1 from Dual'; end;");
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString(1));
}
Run Code Online (Sandbox Code Playgroud) 例如,我有3个表:user,group和permission,和他们之间有两个many2many关系:user_groups和group_permissions.
我需要选择给定用户的所有权限,不重复.每次遇到类似问题时,我都无法确定哪个版本的查询更好:
SELECT permisson_id FROM group_permission WHERE EXISTS(
SELECT 1 FROM user_groups
WHERE user_groups.user_id = 42
AND user_groups.group_id = group_permission.group_id
)
SELECT DISTINCT permisson_id FROM group_permission
INNER JOIN user_groups ON user_groups.user_id = 42
AND user_groups.group_id = group_permission.group_id
Run Code Online (Sandbox Code Playgroud)
我有足够的经验可以根据解释得出结论.第一个查询有子查询,但我的经验表明第一个查询更快.也许是因为结果中有大量过滤后的权限.
在这个情况下,你会怎么做?为什么?谢谢!
mysql> select count(*) from table where relation_title='xxxxxxxxx';
+----------+
| count(*) |
+----------+
| 1291958 |
+----------+
mysql> explain select * from table where relation_title='xxxxxxxxx';
+----+-------------+---------+-
| id | select_type | rows |
+----+-------------+---------+-
| 1 | SIMPLE | 1274785 |
+----+-------------+---------+-
Run Code Online (Sandbox Code Playgroud)
我认为"解析select*from table where relation_title ='xxxxxxxxx';" 通过索引返回relation_title ='xxxxxxxxx'的行.但它比真正的数字要小.
我有一个遗留系统的表,没有主键.它记录了工厂发布材料的交易数据.
为简单起见,我们可以说每行包含job_number,part_number,quantity&date_issued.
我在日期发布列中添加了一个索引.当我运行EXPLAIN SELECT*FROM issued_parts WHERE date_issued>'20100101'时,它显示如下:
+----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+ | 1 | SIMPLE | issued_parts | ALL | date_issued_alloc | NULL | NULL | NULL | 9724620 | Using where | +----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+
所以它看到了关键,但它不使用它?有人可以解释原因吗?