标签: statistics

更新服务器中所有数据库所有表的统计信息

嗨,我一直在编写一个脚本来更新我所有数据库上所有表的统计信息。这个想法是稍后对其进行参数化,但作为一个快速解决方案,今天不想实施Ola 的脚本,请按照下面的脚本进行操作。

我已经在几台服务器上对其进行了测试,但在我安排它在周日早上在实时服务器上运行之前,想获得一些想法并与您分享。

SET NOCOUNT ON

DECLARE @DBS TABLE (I INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
                    DBNAME SYSNAME NOT NULL )

DECLARE @I INT
        ,@Z INT
        ,@SQL VARCHAR(1008) 
        ,@j INT
        ,@Y INT
        ,@MYDB SYSNAME

INSERT INTO @DBS
SELECT s.name 
FROM sys.databases s
INNER JOIN SYS.master_files F ON S.DATABASE_ID = F.database_id  AND F.data_space_id = 1
WHERE S.STATE = 0 -- online
  AND S.database_id > 3 -- exclude master, tempdb and model -- I left msdb 
  AND S.is_read_only = …
Run Code Online (Sandbox Code Playgroud)

sql-server statistics index-statistics

3
推荐指数
1
解决办法
6733
查看次数

为什么此统计信息不针对过滤索引自动更新?

在 SQL Server 2012 SP1 实例中,我在表的 PK 列上有一个筛选索引,如下所示:

CREATE INDEX [RF_IXF_Orders_OrderNumber] ON [dbo].[Orders]
(
    [OrderNumber] ASC
)
WHERE [OrderSource]='MO'
AND [Cancelled]=(0)
AND [NumItems]>(0)
AND [OrderDate]>'2014-05-15';
Run Code Online (Sandbox Code Playgroud)

索引的 Row Count (dm_db_partition_stats.row_count) 为 8416,Rows Changed (sysindexes.rowmodctr) 为 16803 (193.6%),Auto Update Statistics 为 True。有 8400 个 user_scans 和 50,088 个 user_updates。上次 user_scan 是今天,但统计数据已经大约一周没有更新了。

为什么统计数据不会自动更新?

statistics sql-server-2012

3
推荐指数
1
解决办法
222
查看次数

哪个版本的 SQL Server 2016 支持 R

Microsoft 购买 REvolution 结果(除其他外)将 R 集成到 SQL Server 2016 中

查看SQL Server 2016 支持功能,我找不到 R-Support。有谁知道 R-Integration 属于什么功能或哪个版本集成了这个功能?

sql-server statistics sql-server-2016 r-language

3
推荐指数
1
解决办法
3374
查看次数

有没有更快的方法来计算 JSONB 标签?

我试图在 Postgres 9.5 中从这个查询中挤出更多的性能。我正在运行超过 400,000 行。

在玩弄它时,我注意到这些CASE语句增加了相当多的查询成本 - 如果我用简单地对一些现有列求和来替换它们,它会将执行时间减半。有没有更有效的方法来计算这些总和?

SELECT sum("tag1"), sum("tag2"), sum("total_tags")
FROM (
    SELECT people.data->'recruiter_id' AS recruiter_id,
          (CASE WHEN people.data->'tags' ? 'tag1' THEN 1 END) AS "tag1",
          (CASE WHEN people.data->'tags' ? 'tag2' THEN 1 END) AS "tag2", 
          ((CASE WHEN people.data->'tags' ? 'tag1' THEN 1 ELSE 0 END) +
           (CASE WHEN people.data->'tags' ? 'tag2' THEN 1 ELSE 0 END)) AS total_tags
    FROM people WHERE people.data->'tags' ?| ARRAY['tag1','tag2'] ) AS target
GROUP BY recruiter_id
Run Code Online (Sandbox Code Playgroud)

的输出EXPLAIN ANALYSE: …

postgresql performance statistics execution-plan json postgresql-performance

3
推荐指数
1
解决办法
1975
查看次数

更新统计信息后查询计划不会失效

我正在运行一些测试以找出更新统计信息后查询计划何时失效。我用于测试的机器是 SQL Server Developer 2016 SP1 CU7。

我在BrentOzar.com上找到了一篇关于如何跟踪重新编译的文章,但我从未得到重新编译。 Auto Update Statistics并且Auto Create Statistics都启用

这是我的测试:

/* Create a table and put over 1k rows in it (to get past the 500 row stats threshold) */
CREATE TABLE dbo.MyTable (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, StringField VARCHAR(50));
GO
INSERT INTO dbo.MyTable(StringField) 
SELECT 'Stuff' FROM sys.all_objects;
GO

/* Start a trace monitoring recompiles */
exec sp_BlitzTrace @Action='start', @TargetPath='c:\temp\', @SessionId=@@SPID, @TraceRecompiles=1;
GO
SELECT * FROM dbo.MyTable WHERE StringField = …
Run Code Online (Sandbox Code Playgroud)

statistics extended-events sql-server-2016

3
推荐指数
1
解决办法
347
查看次数

您应该多久更新一次统计数据?

您应该多久更新一次统计数据?什么是“太少”?“太频繁”有多频繁?

答案是“这取决于”您的数据库、用户、数据等。

所以我试图在两个表中记录我们的统计数据随着时间的推移是什么样的。他们来了:

DROP TABLE /*IF EXISTS */ dbo.dm_db_stats_histogram
DROP TABLE /*IF EXISTS */ dbo.dm_db_stats_properties
go
CREATE TABLE dbo.dm_db_stats_properties(
  dm_db_stats_propertiesID INT IDENTITY(1,1) NOT NULL constraint PK_dm_db_stats_properties PRIMARY KEY CLUSTERED,
  DatabaseId INT NOT NULL,
  object_id int NOT NULL,
  stats_id  int NOT NULL,
  last_updated  DATETIME2 NOT NULL,
  rows  BIGINT NOT NULL,
  rows_sampled  BIGINT NOT NULL,
  steps int NOT NULL,
  unfiltered_rows   BIGINT NOT NULL,
  modification_counter  BIGINT NOT NULL,
  persisted_sample_percent  FLOAT  NULL
  , SampleDate DATETIME2 NOT NULL CONSTRAINT df_dm_db_stats_properties_SampleDate DEFAULT SYSUTCDATETIME()
)
GO
ALTER …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server statistics azure-sql-database sql-server-2017

3
推荐指数
1
解决办法
329
查看次数

idx_scan 统计信息是否自动重置(默认)?

我正在查看表(pg_stat_user_indexespg_stat_user_tables)并发现许多未使用的索引。

但在我考虑执行任何操作来删除这些索引之前,我需要了解此数据的分析时间段(idx_scan),是自数据库创建以来的时间段吗?

pg_stat_database ( stats_reset ) 表中,有一个日期通常是今天或最多 15 天前,但是这个过程是否会干扰我上面提到的表?

  • 没有执行%reset()命令。

%reset() 命令是否清除表(pg_stat_user_indexespg_stat_user_tables)?

我的目标是了解收集数据的时间段,以便我可以做出决定。

postgresql index statistics index-statistics

3
推荐指数
1
解决办法
2390
查看次数

为什么它在做索引查找

我创建了一个示例表,如下所示

CREATE TABLE [dbo].[StatisticsDemo](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL
   ) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

然后我插入以下数据如下:

SELECT NAME,COUNT(*) AS COUNT 
FROM StatisticsDemo 
GROUP BY NAME

NAME    COUNT
-------------
AABBCC  59999
XXYYZZ  1
Run Code Online (Sandbox Code Playgroud)

然后我在下面创建了非聚集索引:

CREATE NONCLUSTERED INDEX [NCI_STATISTICSDEMO_NAME] ON [dbo].[StatisticsDemo]
(
    [Name] ASC
)
Run Code Online (Sandbox Code Playgroud)

现在我运行了以下查询:

SELECT NAME FROM [dbo].[StatisticsDemo] 
WHERE NAME = 'AABBCC'
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它返回 59999 行,但它正在对非聚集索引进行索引查找。但据我所知,它应该进行索引扫描,因为 99.99% 的数据满足选择查询中提到的过滤条件。

有人能告诉我为什么它在做索引搜索而不是索引扫描吗?

整个活动的目的是证明(正如我将要介绍的统计数据)SQL Server 在准备执行计划之前查看统计数据以识别符合查询过滤条件的记录数,并基于百分比记录匹配表中的总记录,它将决定执行扫描或搜索。如果匹配记录的百分比大约等于表中的记录总数,则应执行 SCAN。但这并没有发生。当我使用 AdventureWorks2016 数据库并运行以下查询时也是如此:

select * from [Sales].[SalesOrderHeader] WHERE SalesOrderID >= 43659 AND 
SalesOrderID <= 73659
Run Code Online (Sandbox Code Playgroud)

上面的查询返回 31465 条记录中的 30001 …

sql-server statistics execution-plan

3
推荐指数
2
解决办法
259
查看次数

为什么创建和删除随机索引可以解决这个性能问题?

我有一个包含 17,093,139 行的大堆表。该表是数据库中使用最频繁的表。由于这是一个堆表,因此该表中只有非聚集索引。我定期重建/重组这个表上的碎片索引。

现在我们经常面临这个问题:访问此表的大量查询突然开始比平时花费更长的时间。当我检查时,我观察到查询的执行计划已更改。

我创建并删除了一个随机的非聚集索引,这解决了这个问题。

我不明白的是,是什么导致这些突然突然变慢的原因是什么,创建和删除索引在后台对表做了什么来修复它,而索引重建作业没有做?

我需要找出究竟是什么触发了这些减速,以便找到一个永久的解决方案,因为我不能只是每次都继续创建和删除索引来解决这个问题。

这里的任何帮助将不胜感激。

sql-server statistics index-tuning amazon-rds query-performance

3
推荐指数
1
解决办法
63
查看次数

查询行为 - 关于统计

问题的快速背景:我们有一个应用程序,我们有许多为客户端运行的应用程序实例。虽然它们的版本可能略有不同,但它们基本上是相同的。

昨天,一位客户遇到了 SQL 超时问题。查看查询,我们发现某些表存在问题,并使用OUTER APPLY并重新编写它来规避该问题。

今天检查查询计划,我可以清楚地看到统计数据很糟糕,因为它预计大约有 250 万行,这是不正确的。我更新了统计数据,它已经解决了这个问题,现在预计有 30 行。

我的困惑来自于我检查其他客户数据库的查询计划时,统计信息似乎关闭,但是,查询在大约 1 秒内返回,而不是在所面临的问题中看到的 45 秒。

两个数据库都打开了自动统计。这是否表明问题数据库上的自动统计有问题?

在测试时,我确实清除了缓存,DBCC FREEPROCCACHE因此引擎每次都必须生成一个计划。但是,我没有在及时返回数据的数据库上执行此操作。

抱歉含糊不清,很遗憾,由于敏感信息,我无法分享查询计划。

目前,我们只运行自动统计更新(没有预定的统计/索引维护)。这会改变;数据库在某种程度上被忽视了。我还应该提到,这些数据库在 Azure 中。我不确定这是否会改变什么?

sql-server statistics index-statistics azure-sql-database

3
推荐指数
1
解决办法
86
查看次数