我可以提高膨胀系统表的性能吗?


12

背景:
我有大量的数据库,其中包含大量的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ᵀᴹ

2
多租户?其实没有 不是。搞砸了吧?FWIW,据我了解,对于每个应用程序用户,为每个表创建5个SYNONYM。幸运的我。
戴夫·梅森

删除对其中某些对象的许可权是否会提高性能(以便减少潜在的使用量?)我不知道这是否是用户级别的选择。
ConstantineK

看到对此的执行计划会很有趣。也许您可以将它从sql哨兵计划资源管理器发布到Answers.sqlperformance.com并链接到它,除非也有在此嵌入的方法。我在看它是有趣
SheldonH

Answers:


1

如果尚未这样做,则可以通过将主数据文件与其余数据移到另一组主轴上来获得性能(请参阅文件和文件组体系结构SQL Server:仅用于系统表的文件组?)。


我认为这是合理的建议,但是,如果IO设置不是具有附加磁盘的标准物理服务器(例如具有SAN的虚拟实例或SSD驱动器)将对分离主数据文件的显着影响最小化,它将对影响不大到另一个位置,对不对?
谢尔顿H

1
如果可以控制硬件(例如,您不是由第三方托管),则SAN中可以有不同的主轴集(例如,两个或更多单独的RAID-10卷)。如果您使用(或托管)SSD,那么就没有主轴,IO将会受到驱动器和母板之间的瓶颈(例如SATA,RAID或NIC卡,电缆,路由器/交换机)的限制,SAN,SSD速度),因此在这种情况下,通过分离文件不会有任何好处。
Ziggy Crueltyfree Zeitgeister
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.