SQL Server在系统表sys.sysschobjs上创建索引[关闭]
Posted
技术标签:
【中文标题】SQL Server在系统表sys.sysschobjs上创建索引[关闭]【英文标题】:SQL Server create index on system table sys.sysschobjs [closed] 【发布时间】:2018-04-03 19:37:17 【问题描述】:我正在尝试在系统基表 sys.sysschobjs
上创建一个非聚集索引并收到此错误:
无法在对象“sys.sysschobjs”上创建索引,因为该对象不是用户表或视图。
我尝试过使用 DAC 和单用户模式
有没有办法在系统基表上创建索引?
谢谢,
【问题讨论】:
不确定该错误可能有多清晰。该信息中是否有部分不清楚?为什么您认为需要在该表上创建索引? @marc_s sys.sysschobjs 是系统基表。 docs.microsoft.com/en-us/sql/relational-databases/system-tables/… 我想如果你真的想索引一个 sys 表出于某种原因你可以在它上面创建一个物化视图然后索引它? @AnthonyHancock SQL Server 也不支持 sys 对象的索引视图。 @SeanLange 我有包含 800k 个对象的用户数据库(是的,我知道,糟糕的设计)。由于系统表查询繁重,无法打开 IntelliSense... 【参考方案1】:在 Sean 看来,不,您不能在系统表或系统视图上创建索引。
更新 1:因为微软这么说:
https://docs.microsoft.com/en-us/sql/relational-databases/databases/master-database
https://docs.microsoft.com/en-us/sql/relational-databases/system-tables/system-base-tables
这个想法是系统数据库,如 master,是 SQL Server 启动所必需的。因此,禁止用户对 MS 开发人员构建的这些系统对象进行更改,以防止用户炸毁服务器。微软没有明确说明这一点,但从他们在其网站上列出的限制中可以明显看出。
如果您对系统数据库的性能有疑问,那么您可能需要查看以下链接以创建维护计划:
https://docs.microsoft.com/en-us/sql/relational-databases/maintenance-plans/use-the-maintenance-plan-wizard
您还可以运行 DBCC CHECKDB(master) 来检查数据库的运行状况。有关 DBCC CHECKDB() 工作原理的更多信息,请参阅以下内容(由创建函数的人编写):
https://www.sqlskills.com/blogs/paul/checkdb-from-every-angle-complete-description-of-all-checkdb-stages/
更新 2 - 最后一点:
阅读页面上的两个紫色重要气泡:https://docs.microsoft.com/en-us/sql/relational-databases/system-tables/system-base-tables
1.) 系统基表仅在 SQL Server 数据库引擎中使用,不供一般客户使用。它们可能会发生变化,并且不保证兼容性。
2.) 使用 DAC 访问系统基表仅供 Microsoft 人员使用,不支持客户方案。
这应该可以解决您的问题。
【讨论】:
但是……为什么不呢?对此的答案,将使这个答案比改写错误消息更有价值。还有其他不是用户表或视图的对象,我希望这会失败:) @scsimon 公平地说,问题是“有没有办法”,我同意唯一正确的答案是否。我不确定您是否可以将所问的问题归咎于回答者,或者是否回答者的工作是通过回答未提出的问题以某种方式使问题变得更好。我也不确定您能否得到“为什么”问题的“正确”答案 - 这将是 Microsoft 内部信息。 @AaronBertrand 绝对没有将上述问题归咎于回答者——我只是认为这是一个深入研究的好机会。顺便说一句——喜欢你所有的博客。 @scsimon 我已经更新了我的答案。请注意,您询问是否可以向系统表/视图添加索引。这意味着一个是或否的答案。结果,我已经为你解答了。 谢谢你的回答,我试图创建索引的系统表不在master数据库上,它在其他用户数据库上。所以没有解决方法?以上是关于SQL Server在系统表sys.sysschobjs上创建索引[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server系统表sysobjects介绍与使用(转))
SQL Server在系统表sys.sysschobjs上创建索引[关闭]