让 SQL 服务器优化器认为记录数很大

Make SQL Server Optimizer to think that record count is huge

我们在生产中几乎没有巨大的 tables(有数百万行),持有发票相关数据。由于这些 tables,我们在生产中面临性能问题。

在预生产环境中,由于数据量较少,我们无法模拟性能测试。比如说,dbo.InvoiceHeader, dbo.InvoiceDetails

我看到过一些地方,我们可以在其中人为地更新 table 的统计信息,以使优化器相信 table 中存在大量行。这样,我们就可以在预生产中调整查询并对其进行测试。我在网上搜索。我找不到相同的。

能否请您指导,如何临时操作 table 的大量行的统计信息。我们将进行性能调整并将其恢复为预生产环境中的原始设置。

感谢您的意见。

我相信这就是您要找的东西

https://sqlsunday.com/2016/02/27/update-statistics-with-rowcount/

https://blogs.msdn.microsoft.com/queryoptteam/2006/07/21/update-statistics-undocumented-options/

以下内容为以上链接的组合,以防以后链接失效

UPDATE STATISTICS table | view
[
    {
        { index | statistics_name }
      | ( { index |statistics_name } [ ,...n ] )
            }
]
[    WITH
    [
        [ FULLSCAN ]
        | SAMPLE number { PERCENT | ROWS } ]
        | RESAMPLE
        | <update_stats_stream_option> [ ,...n ]
    ]
    [ [ , ] [ ALL | COLUMNS | INDEX ]
    [ [ , ] NORECOMPUTE ]
] ;

<update_stats_stream_option> ::=
[ STATS_STREAM = stats_stream ]
[ ROWCOUNT = numeric_constant ]
[ PAGECOUNT = numeric contant ]

<update_stats_stream_option>


This syntax is for internal use only and is not supported. Microsoft reserves the right to change this syntax at any time.

您可以使用以下方法更改统计数据

UPDATE STATISTICS <Table Name> WITH ROWCOUNT=10000000, PAGECOUNT=24000;
UPDATE STATISTICS <Table Name> WITH ROWCOUNT=120;

您可以使用重置统计信息 DBCC UPDATEUSAGE (database_name, <table name>, index_name) WITH COUNT_ROWS;

警告:不要在生产中这样做。索引的统计信息是全局的,这意味着对 table 统计信息的任何更改都会影响使用该索引的任何查询。仅将其用于演示或测试目的。