On Tue, Aug 19, 2014 at 3:20 PM, Joe Van Dyk <j...@tanga.com> wrote: > On Tue, Aug 19, 2014 at 3:16 PM, Joe Van Dyk <j...@tanga.com> wrote: > >> On Tue, Aug 19, 2014 at 3:10 PM, Joe Van Dyk <j...@tanga.com> wrote: >> >>> I have a large table that I don't want to lock for more than couple >>> seconds. I want to add a nullable column to the table, the type of the >>> column is a domain with a check constraint. >>> >>> It appears that the check constraint is being checked for each row, even >>> though the column can be nullable? Is there a way around this? >>> >>> BEGIN >>> Timing is on. >>> >>> create domain test_enum numeric check (value > 0); >>> CREATE DOMAIN >>> Time: 1.817 ms >>> >>> create table test_enum_table (id serial primary key); >>> CREATE TABLE >>> Time: 2.213 ms >>> >>> insert into test_enum_table select * from generate_series(1, 2000000); >>> INSERT 0 2000000 >>> Time: 4299.000 ms >>> >>> alter table test_enum_table add column t test_enum; >>> ALTER TABLE >>> Time: 3165.869 ms -- Takes 3 seconds in this test example >>> >>> Also: >> >> alter table test_enum_table add column t1 numeric check (t1 > 0); >> ALTER TABLE >> Time: 140.185 ms >> >> which is much more reasonable. >> > > johnto on irc says: > > "I'm not sure why it's done this way. it seems like it could test the > domain once against NULL and see whether that's rejected or not. instead > it just forces a rewrite :-(" >
Would it be possible to check the domain against null and if that works, then don't check any of the rows? Joe