我有一张包含400万条记录的表格。此查询快速运行
SELECT Id
FROM Table1
WHERE contains(Text,'great OR good') >0
OFFSET 10 ROWS FETCH NEXT 3 ROWS ONLY
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 225 | 6035 (0)| 00:00:01 |
|* 1 | VIEW | | 3 | 225 | 6035 (0)| 00:00:01 |
|* 2 | WINDOW NOSORT STOPKEY | | 35926 | 64M| 6035 (0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| Table1 | 35926 | 64M| 6035 (0)| 00:00:01 |
|* 4 | DOMAIN INDEX | IDX_ADS_TEXT | | | 6035 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
但是这个查询
SELECT Id
FROM Table1
WHERE contains(Text,'great OR good') >0
ORDER BY SomeDateColumn
OFFSET 10 ROWS FETCH NEXT 3 ROWS ONLY
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 35926 | 2947K| | 20265 (1)| 00:00:01 |
|* 1 | VIEW | | 35926 | 2947K| | 20265 (1)| 00:00:01 |
|* 2 | WINDOW SORT PUSHED RANK | | 35926 | 64M| 70M| 20265 (1)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| Table1 | 35926 | 64M| | 6035 (0)| 00:00:01 |
|* 4 | DOMAIN INDEX | IDX_ADS_TEXT | | | | 6035 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
跑得太慢了。我能做什么,原因是什么?我有SomeDateColumn
答案 0 :(得分:2)
您可以提高性能,这是值得怀疑的。
为何与众不同?想象一下:我有一个装有400万网球的篮子。它们有不同的颜色,每个都有一个日期。
问题1:从篮子里拿球;忽略前10个蓝色或绿色,然后保持(返回)接下来的三个。
问题2:找到篮子里的所有蓝色和绿色球。按照写在它们上的日期顺序排列它们。然后忽略前10个(按日期顺序)并返回接下来的三个。
在问题1中,甚至可能只有50,000个球(甚至更少)被观察,直到其中13个为蓝色或绿色。
在问题2中,你必须查看所有400万个球,并且只保留蓝色和绿色球。然后你必须花费额外的时间来订购它们。
我希望你能明白为什么问题1可以很快解决,但问题2可能需要很长时间。