Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Downsides to "WITH SCHEMABINDING" in SQL Server?

I have a database with hundreds of awkwardly named tables in it (CG001T, GH066L, etc), and I have views on every one with its "friendly" name (the view "CUSTOMERS" is "SELECT * FROM GG120T", for example). I want to add "WITH SCHEMABINDING" to my views so that I can have some of the advantages associated with it, like being able to index the view, since a handful of views have computed columns that are expensive to compute on the fly.

Are there downsides to SCHEMABINDING these views? I've found some articles that vaguely allude to the downsides, but never go into them in detail. I know that once a view is schemabound, you can't alter anything that would impact the view (for example, a column datatype or collation) without first dropping the view, so that's one, but aside from that? It seems that the ability to index the view itself would far outweigh the downside of planning your schema modifications more carefully.

like image 704
SqlRyan Avatar asked Nov 02 '09 03:11

SqlRyan


People also ask

Does Schemabinding improve performance?

With schemabinding can improve performance in some cases. Edit: Paul White indicated that this doesn't actually impact view table spools just used for joins. Schema binding definitely adds some additional maintenance when changing schema.

What is the result of with Schemabinding in a view?

SCHEMABINDING. Binds the view to the schema of the underlying table or tables. When SCHEMABINDING is specified, the base table or tables cannot be modified in a way that would affect the view definition.

What is the purpose of Schemabinding?

Answer: SCHEMABINDING keywords prevent tables used in the views to make any such modifications that can affect the view's definition. When this keyword is used in the view it binds the view to the schema of the underlying tables.

Can we create index on view without Schemabinding?

You Can't… The view is created with the WITH SCHEMABINDING option. You can't always predict what the query optimizer will do. If you're using Enterprise Edition, it will automatically consider the unique clustered index as an option for a query – but if it finds a “better” index, that will be used.


Video Answer


3 Answers

You wont be able to alter/drop the table, unless you drop the view first.

like image 74
Dan S Avatar answered Sep 21 '22 13:09

Dan S


Oh, there are DEFINITELY DOWNSIDES to using SCHEMABINDING - these come from fact the SCHEMABINDING, especially when coupled with COMPUTED columns "LOCKS" THE RELATIONSHIPS and makes some "trivial changes" darn near impossible.

  1. Create a table.
  2. Create a SCHEMABOUND UDF.
  3. Create a COMPUTED PERSISTED column that references the UDF.
  4. Add an INDEX over said column.
  5. Try to update the UDF.

Good luck with that one!

  1. The UDF can't be dropped or altered because it is SCHEMABOUND.
  2. The COLUMN can't be dropped because it is used in an INDEX.
  3. The COLUMN can't be altered because it is COMPUTED.

Well, frak. Really..!?! My day just became a PITA. (Now, tools like ApexSQL Diff can handle this when provided with a modified schema, but the issue is here that I can't even modify the schema to begin with!)

I'm not against SCHEMABINDING, mind (and it's needed for a UDF in this case), but I'm against there not being a way (that I can find) to "temporarily disable" the SCHEMABINDING.

like image 22
user2246674 Avatar answered Sep 18 '22 13:09

user2246674


None at all. It's safer. we use it everywhere.

like image 31
gbn Avatar answered Sep 20 '22 13:09

gbn