>CREATE TABLE TEST(ITEM VARCHAR(20) NOT NULL PRIMARY KEY, VAL BLOB SUB_TYPE 
>BINARY);
>SELECT VAL FROM TEST WHERE ITEM = '...';
>
>INSERT INTO TEST(ITEM, VAL) VALUES('...', ...);
>SELECT FIRST 1 RIGHT(ITEM, 8) FROM TEST WHERE LEFT(ITEM, 8) = '...' ORDER BY 
>ITEM DESC;
>
>These are sql statements that I will use.
>
>Is it better to create indexes for this table?
>Someone told me that PRIMARY KEY field is automatically indexed internally.  
>But I am not sure if it is true or not.  Can anyone verify this?

Others have already answered your actual question. I'd like to add a few hints:

1) It is a bad idea to use meaningful data in the primary key. It works OK as 
long as you don't change the definition in any way, if there is a slight 
possibility of ITEM ever to change from VARCHAR(20) to something else, then the 
change would be simpler to implement if you added a meaningless identifier - 
typically a 'TEST_ID INTEGER PRIMARY KEY' field being filled through a BEFORE 
INSERT trigger. Then have a unique constraint on ITEM (it doesn't really matter 
as long as you only have one table, add a few other tables containing fields 
that have foreign keys to the TEST table and you'll see how much simpler the 
change in the definition of ITEM will be if those foreign keys points to 
TEST_ID rather than ITEM).

2) SELECT FIRST 1 RIGHT(ITEM, 8) FROM TEST WHERE LEFT(ITEM, 8) = '...' ORDER BY 
ITEM DESC cannot use any index, better change that statement to SELECT FIRST 1 
RIGHT(ITEM, 8) FROM TEST WHERE ITEM STARTING '...' ORDER BY ITEM DESC;

3) Maybe (I haven't checked) the STARTING query above could benefit from an 
additional DESCending index on ITEM (Firebird indexes are unidirectional and 
the unique constraint will automatically generate an ASCending index, I don't 
think descending indexes are ever created automatically).

HTH,
Set

Reply via email to