What is the formula to figure out how much space an index will need to be created ?
IMPORTANT: We are using sql server express 2005. So 4GB is the limit. Hence this question.
Unrestricted Autogrow of log files is not an option. t-sql psuedo code below will explain further.
int spaceNeeded =
FN_COMPUTE_SPACE_NEEDED_TO_CREATE_UNCLUSTERED_INDEX(MyTableName, MyColumnName)
It’s the one function above that I am stuck at while coding this stored proc
I think I can handle all the below with info available on msdn etc.
While(GetDBSpaceAvailable() < spaceNeeded )
{
purge some data (go thru all tables and delete data logically)
}
create the index we need
CREATE NONCLUSTERED INDEX [IX_NonClustered_MyTable] ON [dbo].[MyTable]
( [MyColumn] ASC
)
Any pointers appreciated in this regards. Hoping this is a repeat but could not find anything when I searched.
thank you
UPDATE: Solution that worked for me uses Aaron’s suggestion. (additional 1.2X over and above the space the index occupies now). So basically I purge oldest data until space available is 1.2 to 1.5x over and above the current index size reported by sp_spaceused tablename. Then create the index.
The size limit is only per database. Have you considered putting some of your junk, static or at least less volatile data into a separate database? You can create synonyms to make it so that the code doesn’t realize some of the data is in its own 4GB space. All on one instance you’d be hard-pressed to notice any performance difference by splitting it up, the biggest problem would be backup consistency as you’d be backing up the data separately. But it would be one way to avoid your index space requirements.
Also, instead of using this old version of SQL Server 2005 Express, why not move to the most recent released version (SQL Server 2008 R2), where you have 6 more GB to play with (database size is limited to 10 GB instead of 4 GB). In addition you get some new features, T-SQL syntax and performance benefits.