[prev in list] [next in list] [prev in thread] [next in thread] 

List:       sqlite-users
Subject:    Re: [sqlite] Equal distribution from random rows
From:       John Elrick <john.elrick () fenestra ! com>
Date:       2007-05-31 12:33:47
Message-ID: 465EC0AB.8070801 () fenestra ! com
[Download RAW message or body]

Alex Teslik wrote:
> On Wed, 30 May 2007 15:18:18 -0400, John Elrick wrote
> <snip>
>   
>> After running a simple test, I confirmed a suspicion.  VACUUM 
>> doesn't reorder the ROWIDs, so you still have breaks.
>>     
>
> My tests show otherwise:
>
>
>   
SNIP
> did I do something incorrectly?
>
>   

Not incorrectly, just differently.  In my test I unintentionally used an 
INTEGER PRIMARY KEY:

CREATE TABLE FOO(
  ID INTEGER PRIMARY KEY,
  MYSTUFF TEXT
);

If you retrieve the ROWID from this test (full Ruby program at end):

CREATE TABLE FOO(
  ID INTEGER INTEGER PRIMARY KEY,
  MYSTUFF TEXT
);

INSERT INTO FOO VALUES (1, 'One');
INSERT INTO FOO VALUES (2, 'Two');
INSERT INTO FOO VALUES (3, 'Three');


You get this result:

["rowid", "ID", "MYSTUFF"]
["1", "1", "One"]
["2", "2", "Two"]
["3", "3", "Three"]
["rowid", "ID", "MYSTUFF"]
["1", "1", "One"]
["3", "3", "Three"]

I have confirmed that removing the PRIMARY KEY designator permits VACUUM 
to reorder the ROWID.  So I would amend my statement:

"After running a simple test, I confirmed a suspicion.  VACUUM may not 
reorder the ROWIDs if you use an INTEGER PRIMARY KEY, so you would still 
have breaks under those conditions."

Thanks for running your test.  I wouldn't have thought there would be a 
difference.


John


Full program:
-------------
require 'sqlite3'

FILENAME = ":memory:"
$db = SQLite3::Database.new( FILENAME )
$db.execute_batch(<<eof
CREATE TABLE FOO(
  ID INTEGER INTEGER PRIMARY KEY,
  MYSTUFF TEXT
);

INSERT INTO FOO VALUES (1, 'One');
INSERT INTO FOO VALUES (2, 'Two');
INSERT INTO FOO VALUES (3, 'Three');
eof
)

$db.execute2('SELECT ROWID,* FROM FOO') do |i|
  p i
end

$db.execute('DELETE FROM FOO WHERE ID = 2')
$db.execute('VACUUM')

$db.execute2('SELECT ROWID,* FROM FOO') do |i|
  p i
end


-----------------------------------------------------------------------------
To unsubscribe, send email to sqlite-users-unsubscribe@sqlite.org
-----------------------------------------------------------------------------

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic