如何使用索引优化SELECT *命令?

时间:2012-10-09 11:32:07

标签: sql indexing db2 database-indexes

我是索引的新手,我有很大的问题。

我的查询SELECT * FROM TABLE持续时间过长。

是否可以使用索引对结果进行优化以获得更快的结果?

我知道索引对WHERE子句很有用但类似但是SELECT *

我有超过20万条记录,当然它们都有唯一的ID。

只需创建一个带有ID列的索引或什么是最佳策略?

3 个答案:

答案 0 :(得分:3)

不要在25列上创建索引。创建多个索引,甚至每列可以创建一个索引。如果用户可以过滤所有列,请确保过滤器是AND而不是OR。如果您在过滤器之间进行OR操作,那么索引也将无法正常工作。

首先尝试将其作为测试:

SELECT * FROM Ticket WHERE Name = 'AAA'
-- Take length of time that takes

CREATE INDEX IX_TICKET_NAME ON Ticket(Name)

SELECT * FROM Ticket WHERE Name = 'AAA'
-- Seel how long it takes now

如果你看到了很大的性能提升,那么是的索引会有所帮助。然后尝试找出哪些其他列需要索引。

编辑:不允许用户将所有过滤器留空。给他们一个警告,说明必须至少应用一些过滤器。或者如果你不能这样做,如果所有过滤器都是空白的,只需将结果限制为100行或其他

答案 1 :(得分:3)

  1. 对于您要过滤的所有列,添加仅包含此列的索引

  2. 在DB2中,您可以通过添加FETCH FIRST N ROWS来限制返回的行数,请参阅http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2.doc.admin%2Ffrstnrw.htm。这将尽可能快,因为在找到所有200k行之前返回前N行(前提是搜索条件已编入索引)。

  3. 获取200k行是荒谬的,因为没有人会查看所有行。您可能想要计算行数(确实可以使用COUNT等快速完成),并显示前N行,见上文。关键是要查看匹配的行数,而不是查看行本身。我打赌!或者你们100%疯狂。

答案 2 :(得分:1)

您所指的唯一ID很可能是索引键。选择这么多数据并在应用程序中处理它并不会很快,特别是如果你正在构建一个网页。您可以尝试:

  • 选择部分数据并分批处理。
  • 在数据库中使用sql执行尽可能多的数据处理,然后在应用程序中显示结果。