sql:select * from user_info where userid='1100907' and status='1'
对userid进行索引,该表的行数少于10000,并且具有LOB列。
sql需要1秒钟(我在sqlplus中使用“set timing on”得到了这个)。我试图使用所有列名来替换*,但仍然是1秒。删除LOB列后,sql需要0.99秒。当我将列数减少一半时,时间也减少了一半。
最后,select userid from user_info where userid='1100907' and status='1'
需要0.01秒。
有人可以解决这个问题吗?
答案 0 :(得分:3)
请记住,“挂钟性能测试”是不可靠的。它受环境数据库条件的影响,并且 - 在输出到SQL * Plus时 - 取决于物理显示数据所需的时间。这也许可以解释为什么选择一半列真的会对经过的时间产生如此大的影响。这张表有多少列?
调整从EXPLAIN PLAN开始。该工具将向您展示数据库将如何执行您的查询。 Find out more。
例如,提供此查询的速度更快
select userid from user_info
然后这一个
select * from user_info
因为数据库可以使用来自userid上的索引的信息来满足第一个查询,而根本不触及该表。
修改强>
“你能告诉我为什么sqlplus打印 列名称很多次 而不只是返回结果“
这与分页有关。 SQL Plus每次抛出页面时都会重复列标题。您可以使用以下任一SQL Plus命令来抑制此行为:
set heading off
或
set pages n
在第二种情况下,使 n 非常大(例如2000)或零。
答案 1 :(得分:0)
也许你在user_info表中有100列?如果是这样,您在查询中实际需要多少列?