背景:
我有大量的数据库,其中包含大量的VIEW和大量的SYNONYM。例如,一个分贝具有超过10k的VIEW和2+百万个SYNONYM。
一般问题:
涉及sys.objects
(通常是系统表)的查询往往很慢。涉及sys.synonyms
的查询是冰河。我想知道如何才能提高性能。
具体示例
此命令由第三方工具运行。在应用程序和SSMS中速度都很慢:
exec sp_tables_rowset;2 NULL,NULL
我的问题:
如何使运行速度更快?
我尝试过的内容:
如果SET STATISTICS IO ON
我得到以下输出:
(受影响的2201538行)
表'sysobjrdb'。扫描计数1,逻辑读28,物理读0,预读0,lob逻辑读0,lob物理读0,lob
预读0。表'sysschobjs'。扫描计数1,逻辑读53926,物理读0,预读0,lob逻辑读0,lob物理读0,lob预读0。
我已经能够更新基础系统表上的统计信息。这已在我的SQL 2008 R2或更高版本的环境中起作用:
UPDATE STATISTICS sys.sysobjrdb WITH FULLSCAN
UPDATE STATISTICS sys.sysschobjs WITH FULLSCAN
我还能够执行索引维护。这适用于我的SQL 2012或更高版本的环境。例如,运行sp_help 'sys.sysschobjs'
标识了表上的索引,然后从那里创建并运行以下命令:
ALTER INDEX clst ON sys.sysschobjs REORGANIZE
ALTER INDEX nc1 ON sys.sysschobjs REORGANIZE
ALTER INDEX nc2 ON sys.sysschobjs REORGANIZE
ALTER INDEX nc3 ON sys.sysschobjs REORGANIZE
更新统计数据和重新组织索引会有所帮助,但效果不大。
哎哟。我猜想您正在做一些混乱的多租户类型,将每个人的数据保留在同一表中,并用视图对其进行过滤,并使用同义词在基础对象上大规模命名它们?无论哪种方式,我对你的感觉
—
Philᵀᴹ
多租户?其实没有 不是。搞砸了吧?FWIW,据我了解,对于每个应用程序用户,为每个表创建5个SYNONYM。幸运的我。
—
戴夫·梅森
删除对其中某些对象的许可权是否会提高性能(以便减少潜在的使用量?)我不知道这是否是用户级别的选择。
—
ConstantineK
看到对此的执行计划会很有趣。也许您可以将它从sql哨兵计划资源管理器发布到Answers.sqlperformance.com并链接到它,除非也有在此嵌入的方法。我在看它是有趣
—
SheldonH