how to make selecting random rows in oracle faster with table with millions of rows

前端 未结 7 1134
后悔当初
后悔当初 2021-02-13 11:25

Is there a way to make selecting random rows faster in oracle with a table that has million of rows. I tried to use sample(x) and dbms_random.value and its taking a long time to

7条回答
  •  广开言路
    2021-02-13 12:14

    Someone told sample(x) is the fastest way you can. But for me this method works slightly faster than sample(x) method. It should take fraction of the second (0.2 in my case) no matter what is the size of the table. If it takes longer try to use hints (--+ leading(e) use_nl(e t) rowid(t)) can help

    SELECT *
      FROM My_User.My_Table
     WHERE ROWID = (SELECT MAX(t.ROWID) KEEP(DENSE_RANK FIRST ORDER BY dbms_random.value)
                      FROM (SELECT o.Data_Object_Id,
                                   e.Relative_Fno,
                                   e.Block_Id + TRUNC(Dbms_Random.Value(0, e.Blocks)) AS Block_Id
                              FROM Dba_Extents e
                              JOIN Dba_Objects o ON o.Owner = e.Owner AND o.Object_Type = e.Segment_Type AND o.Object_Name = e.Segment_Name
                             WHERE e.Segment_Name = 'MY_TABLE'
                               AND(e.Segment_Type, e.Owner, e.Extent_Id) =
                                  (SELECT MAX(e.Segment_Type) AS Segment_Type,
                                          MAX(e.Owner)        AS Owner,
                                          MAX(e.Extent_Id) KEEP(DENSE_RANK FIRST ORDER BY Dbms_Random.Value) AS Extent_Id
                                     FROM Dba_Extents e
                                    WHERE e.Segment_Name = 'MY_TABLE'
                                      AND e.Owner = 'MY_USER'
                                      AND e.Segment_Type = 'TABLE')) e
                      JOIN My_User.My_Table t
                        ON t.Rowid BETWEEN Dbms_Rowid.Rowid_Create(1, Data_Object_Id, Relative_Fno, Block_Id, 0)
                       AND Dbms_Rowid.Rowid_Create(1, Data_Object_Id, Relative_Fno, Block_Id, 32767))
    

提交回复
热议问题