Re: Using PK value as a String

From: Mario Weilguni <mweilguni(at)sime(dot)com>
To: valiouk(at)yahoo(dot)co(dot)uk
Cc: Jay <arrival123(at)gmail(dot)com>, Gregory Stark <stark(at)enterprisedb(dot)com>, pgsql-performance(at)postgresql(dot)org
Subject: Re: Using PK value as a String
Date: 2008-08-12 09:58:39
Message-ID: 48A15ECF.5030203@sime.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Valentin Bogdanov schrieb:
> --- On Mon, 11/8/08, Gregory Stark <stark(at)enterprisedb(dot)com> wrote:
>
>
>> From: Gregory Stark <stark(at)enterprisedb(dot)com>
>> Subject: Re: [PERFORM] Using PK value as a String
>> To: "Jay" <arrival123(at)gmail(dot)com>
>> Cc: pgsql-performance(at)postgresql(dot)org
>> Date: Monday, 11 August, 2008, 10:30 AM
>> "Jay" <arrival123(at)gmail(dot)com> writes:
>>
>>
>>> I have a table named table_Users:
>>>
>>> CREATE TABLE table_Users (
>>> UserID character(40) NOT NULL default
>>>
>> '',
>>
>>> Username varchar(256) NOT NULL default
>>>
>> '',
>>
>>> Email varchar(256) NOT NULL default
>>>
>> ''
>>
>>> etc...
>>> );
>>>
>>> The UserID is a character(40) and is generated using
>>>
>> UUID function. We
>>
>>> started making making other tables and ended up not
>>>
>> really using
>>
>>> UserID, but instead using Username as the unique
>>>
>> identifier for the
>>
>>> other tables. Now, we pass and insert the Username to
>>>
>> for discussions,
>>
>>> wikis, etc, for all the modules we have developed. I
>>>
>> was wondering if
>>
>>> it would be a performance improvement to use the 40
>>>
>> Character UserID
>>
>>> instead of Username when querying the other tables, or
>>>
>> if we should
>>
>>> change the UserID to a serial value and use that to
>>>
>> query the other
>>
>>> tables. Or just keep the way things are because it
>>>
>> doesn't really make
>>
>>> much a difference.
>>>
>> Username would not be any slower than UserID unless you
>> have a lot of
>> usernames longer than 40 characters.
>>
>> However making UserID an integer would be quite a bit more
>> efficient. It would
>> take 4 bytes instead of as the length of the Username which
>> adds up when it's
>> in all your other tables... Also internationalized text
>> collations are quite a
>> bit more expensive than a simple integer comparison.
>>
>> But the real question here is what's the better design.
>> If you use Username
>> you'll be cursing if you ever want to provide a
>> facility to allow people to
>> change their usernames. You may not want such a facility
>> now but one day...
>>
>>
>
> I don't understand Gregory's suggestion about the design. I thought using natural primary keys as opposed to surrogate ones is a better design strategy, even when it comes to performance considerations and even more so if there are complex relationships within the database.
>
> Regards,
> Valentin
>
>
UUID is already a surrogate key not a natural key, in no aspect better
than a numeric key, just taking a lot more space.

So why not use int4/int8?

In response to

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Jay D. Kang 2008-08-12 10:18:26 Re: Using PK value as a String
Previous Message Sabin Coanda 2008-08-12 08:17:12 Re: long transaction