我在 SQL Server 数据库中有一个包含 10+ 百万条记录的大表。该表包含美国所有 50 个州的某些类型的数据。因此,如果我从这个表中创建 50 个视图,每个状态一个,从我的应用程序进行查询的性能会得到改善吗?其他建议?
6 回答
不。视图是一个扩展的宏,因此相同的表最终会出现在计划中。
除非它被索引。50 个索引视图很可能是矫枉过正。
如果您在 5000 万行时性能很慢(实际上并没有那么多),那么这是一个索引问题。
编辑:
首先,我将使用加权缺失索引 dmv 查询来查看您在哪里获得最大的收益
普通(非索引)视图不能提高性能——它们可以被认为是 SELECT 查询的“速记”或“别名”,因为它们下面没有物理结构。
索引视图是另一种野兽,但到目前为止您似乎并不需要它们。
您需要在表上创建适当的索引,并且可能重新设计表(例如,将其拆分为多个表)。
如果您需要更具体的建议,请在此处发布表结构和一些典型查询示例(您想要优化的查询)。
这是一个如此小的数据库,如果您遇到性能问题,您的索引错误,您的数据库设计很糟糕,或者您设计了性能不佳的查询。如果设计得当,SQL Server 可以毫不费力地处理数万亿条记录。
顺便说一句,如果您使用调用视图的视图,视图可能会成为性能杀手。
你在正确的轨道上:
首先确保您索引数据以反映您需要快速读取的数据。然后,由于过滤确实使它更快,我会考虑通过允许通过存储过程(使用状态参数)访问数据来过滤状态。
如果您的执行计划中有正确的索引和使用情况,那么最大的问题是内存缓存的数量和磁盘的读取速度。创建视图不会解决任何这些问题,它仍然是相同磁盘/缓存上的相同数据,只是引用它的不同逻辑方式。
一个简单的建议:
use [YourDataBase]
select * from sys.dm_db_missing_index_details as ddmid