AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-33170

James Anderson's questions

Martin Hope
James Anderson
Asked: 2015-11-07 06:24:06 +0800 CST

使用 fn_validate_plan_guide 的计划指南验证给出误报

  • 3

在为引用名为“#test”的临时表的存储过程中的一段 SQL 验证计划指南时,函数 fn_validate_plan_guide 返回错误:对象名称“#test”无效。

但是计划指南仍然将查询提示推送到 SQL 中,并实现了所需的执行。

这是否突出了 fn_validate_plan_guide 函数的问题?

下面的脚本重现了这个问题。

--Enable the actual execution plan before running the query so the plans can be compared

USE [msdb]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[test]
AS
BEGIN
    CREATE TABLE #test 
    (
        ID INT
    )

    INSERT INTO #test
    SELECT ROW_NUMBER() OVER(ORDER BY job_id) 
    FROM dbo.sysjobs

    SELECT * 
    FROM #test t
    JOIN #test t2 ON t.ID = t2.ID

    DROP TABLE #Test 
END
GO

--Execution before the plan guide is created will have a hash join in the second batch
EXEC msdb.dbo.test
GO

--Create the plan guide
EXEC sp_create_plan_guide 'test',
'   SELECT * 
    FROM #test t
    JOIN #test t2 ON t.ID = t2.ID', 
'OBJECT', 'dbo.test', NULL, 'OPTION (MERGE JOIN)'
GO

--Validate the plan guide. This returns the error "Invalid object name '#test'."
SELECT 
    plan_guide_id, msgnum, severity, state, message, 
    name, create_date, is_disabled, query_text, scope_type_desc, scope_batch, parameters, hints
FROM sys.plan_guides
CROSS APPLY fn_validate_plan_guide(plan_guide_id);
GO

--Execution after the plan guide is created will have a merge join in the second batch
EXEC msdb.dbo.test
GO

EXEC sp_control_plan_guide 'DISABLE', 'test'
GO

--Execution after the plan guide is disabled will go back to having a hash join in the second batch
EXEC msdb.dbo.test
GO

EXEC sp_control_plan_guide 'ENABLE', 'test'
GO

--Execution after the plan guide is re-enabled will go back to having a merge join in the second batch
EXEC msdb.dbo.test
GO

--Clean up
EXEC sp_control_plan_guide 'DROP', 'test'
GO

DROP PROCEDURE test
GO

这个函数给出的错误是误报,还是这些只是计划指南可能失败的警告,还是我没有想到的其他事情?

我在这里用上面的文字创建了一个连接项目,但我还没有收到回复。

sql-server sql-server-2012
  • 1 个回答
  • 296 Views
Martin Hope
James Anderson
Asked: 2015-10-02 04:17:40 +0800 CST

联机聚集索引重建使用比预期更多的日志空间

  • 5

我有一张桌子TableA

ID PK BIGINT
TrxID BIGINT
CardBalance INT
AccountBalance INT

SP_SPACEUSED 'TableA'输出:

name    rows       reserved     data         index_size   unused
TableA  904054184  55547120 KB  34661408 KB  19963544 KB  922168 KB

因此数据大小约为 33 GB。TrxID 上有一个聚簇索引。有一个非聚集索引,大约有 19GB。

我的事务日志文件大小约为 250 GB。DBCC SQLPERF('logspace')显示 < 1% 的使用率。

当我跑步时:

ALTER INDEX CIX_TableA_TrxID ON dbo.TableA REBUILD WITH (ONLINE = ON)

事务日志在大约 20 分钟后达到 100%,然后继续增长。

有没有可靠的方法来计算此操作需要多少日志空间?

此外,这似乎在日志文件中使用了很多空间,这听起来对吗?

  • 此数据库与 1 个其他异步副本位于可用性组(因此使用完整恢复模型)。
  • 这是一个测试数据库,因此没有任何其他事务与重建索引同时运行。
sql-server sql-server-2012
  • 1 个回答
  • 333 Views
Martin Hope
James Anderson
Asked: 2015-01-16 03:19:24 +0800 CST

为了可重用性,按语句拆分查询计划会更好吗?

  • 11

根据我对查询如何编译、存储和检索查询计划的有限了解,我了解到多语句查询或存储过程将生成它的查询计划,该查询计划将存储在查询计划缓存中,供查询在未来的执行中使用。

我认为该计划是使用查询哈希从查询计划缓存中检索的,这意味着如果编辑和执行查询,则哈希会有所不同,并且会生成一个新计划,因为在查询计划缓存中找不到匹配的哈希。

我的问题是:如果用户执行的语句是多语句查询中的语句之一,它可以使用已经在缓存中的查询计划的相关部分进行多语句查询吗?我希望答案是否定的,因为散列值显然不匹配,但是在多语句查询中对每个语句进行散列是否更好,以便用户从查询中运行单个语句时可以使用它们?

我希望有一些我没有考虑到的并发症(我真正想知道的是这些)但似乎我们可以在许多查询计划中存储相同的“语句计划”,占用更多空间并占用更多空间CPU 和生成时间。

可能只是显示我的无知。

sql-server execution-plan
  • 1 个回答
  • 372 Views
Martin Hope
James Anderson
Asked: 2014-12-31 06:21:48 +0800 CST

从站的 MySQL 复制从站未接收到更新

  • 2

我有 4 个服务器:A、B、C 和 D。

A 和 B 处于主-主设置中。

C是B的奴隶,D是C的奴隶。

A 或 B 上的更改会到达 D 以外的所有节点。我需要它们到达 D

C 上的更改到达 D,但显然它们不会转到 A 或 B,这很好。

经过一些阅读后,我发现我需要在 C 上设置 log-slave-updates 选项,这样 C 会记录复制到它的更改,然后 D 可以读取这些并进行相同的更新。

我已将选项设置为开,D 正在等待它的主人发送事件,但来自 A 或 B 的更改仍未到达 D。

mysql replication
  • 1 个回答
  • 985 Views
Martin Hope
James Anderson
Asked: 2014-10-30 09:30:33 +0800 CST

加入前过滤表

  • 6

我有一个用 Id 列表填充临时表 #employee_benefits 的存储过程。该表最终大约有 10,000 行长。然后下面的查询从一个名为 EmployeeBenefitData 的表中进行选择,该表有大约 400 万行。

SELECT  ebd.EmployeeBenefitDataId, ebd.EmployeeBenefitId, ebd.[DataDefinitionId]
FROM    #employee_benefits eb
INNER JOIN EmployeeBenefitData ebd ON eb.EmployeeBenefitId = ebd.EmployeeBenefitId

瓶颈是对 EmployeeBenefitData 表的索引扫描。它首先进行索引扫描,然后将其加入临时表。临时表充当过滤器,这意味着在连接之前扫描所有数据效率非常低。我添加了以下代码以将扫描更改为搜索并显着减少所需的读取量。

DECLARE @MinEmpBenId INT, @MaxEmpBenId INT

SELECT @MinEmpBenId = MIN(EmployeeBenefitId), @MaxEmpBenId = MAX(EmployeeBenefitId)
FROM #employee_benefits

SELECT  ebd.EmployeeBenefitDataId, ebd.EmployeeBenefitId, ebd.[DataDefinitionId],
        dd.TypeId, dd.DataDefinitionId, dd.Name, ebd.[Value], ebd.[Date], ebd.[Text]
FROM    #employee_benefits eb
INNER JOIN EmployeeBenefitData ebd ON eb.EmployeeBenefitId = ebd.EmployeeBenefitId
INNER JOIN DataDefinition dd ON ebd.DataDefinitionId = dd.DataDefinitionId
WHERE   ebd.EmployeeBenefitId >= @MinEmpBenId AND ebd.EmployeeBenefitId <= @MaxEmpBenId

它对客户统计数据产生了巨大影响

总执行时间 74, 1794
服务器回复的等待时间 11, 11

我的问题是:这是好的做法吗?为什么优化器不这样做呢?

更新 我应该提到临时表在 EmployeeBenefitID 上有一个聚集索引

sql-server sql-server-2012
  • 2 个回答
  • 4112 Views
Martin Hope
James Anderson
Asked: 2014-06-14 01:53:15 +0800 CST

SQL Server 2012 本地 SSD TempDB 慢

  • 5

我有一个使用本地 SSD 进行 tempDB 的生产部署。我在 RAID1 配置中有 2 个 SSD。我看到平均读取时间为 1-2 毫秒,但我的所有四个 tempdb 数据文件的平均写入时间显示为 1377 毫秒。

每个 tempdb 数据文件为 2GB,增长设置为 1GB(自 5 个月前部署以来,它们没有增长)

tempdb 日志显示平均读取时间为 67 毫秒,平均写入时间为 215 毫秒。

SSD 是三星 840 专业版。

以下代码是我用来获取统计信息的代码

SELECT a.database_Id, 
a.file_id, 
db_name(a.database_id) AS dbname, 
b.name, 
db_file_type =  CASE 
                WHEN a.file_id = 2 THEN 'Log' 
                ELSE 'Data' 
                END, 
UPPER(SUBSTRING(b.physical_name, 1, 2)) AS disk_location, 
a.io_stall, 
a.io_stall_read_ms / Case When a.num_of_reads = 0 Then 1 Else a.num_of_reads end AvgRead,  
a.io_stall_write_ms / Case When a.num_of_writes = 0 Then 1 Else a.num_of_writes end AvgWrite,  
Cast(Round(((( a.size_on_disk_bytes / 1024 ) / 1024.0 ) / 1024), 2) as float) AS size_on_disk_gb                    

FROM sys.dm_io_virtual_file_stats (NULL, NULL) a 
JOIN sys.master_files b ON a.file_id = b.file_id AND a.database_id = b.database_id 

ORDER BY a.io_stall DESC

以下是返回的前 5 行

database_Id file_id dbname  name    db_file_type    disk_location   io_stall    AvgRead AvgWrite    size_on_disk_gb
2   1   tempdb  tempdev Data    F:  19782846713 2   1377    2
2   3   tempdb  tempdev2    Data    F:  19782655021 2   1377    2
2   5   tempdb  tempdev4    Data    F:  19782364070 2   1377    2
2   4   tempdb  tempdev3    Data    F:  19782151571 2   1377    2
2   2   tempdb  templog Log F:  378829065   67  215 1

所以我在 SSD 上的 tmepdb 文件是我拥有的最慢的驱动器。从配置/基础架构的角度来看,我应该注意什么?我目前正在研究 tempdb 的应用程序使用情况和任何内存溢出,但我没有看到任何可怕的东西。

performance sql-server-2012
  • 1 个回答
  • 1493 Views
Martin Hope
James Anderson
Asked: 2014-05-02 06:48:17 +0800 CST

限制用户只复制备份

  • 14

我希望在我的生产环境中部署日志传送。这意味着我将不得不管理备份链,这些备份链可能会因人们进行备份以刷新开发环境而中断。如果我遇到故障并想使用日志备份恢复到某个时间点,我还需要开发人员进行的备份。

如果开发人员仅使用 COPY ONLY 备份,则不会发生这种情况。所以我的问题是:有没有办法限制用户只能执行 COPY ONLY 备份?

sql-server backup
  • 3 个回答
  • 1653 Views
Martin Hope
James Anderson
Asked: 2014-01-22 05:13:13 +0800 CST

1次收缩滥用的数据库或从备份中恢复[重复]

  • 1
这个问题在这里已经有了答案:
我需要缩小我的数据库——我刚刚释放了很多空间 (4 answers)
8 年前关闭。

我有一个我继承的数据库,它已经被遗留了很长时间,不断发展壮大。95% 的增长是由我们的应用程序使用的 1 个日志表引起的。数据库为 120GB 并处于完全恢复模式。压缩后的备份大约为 10GB。服务器是2008。日志文件是3.5GB

在询问之后我发现我可以从这个日志表中删除超过 3 个月的所有数据。这给了我 100GB 的可用空间。我还编写了一个代理作业来将日志表保持在这个级别。

这意味着我将永远有大约 100GB 的空间坐在这个文件中(只要没有其他表开始以以前没有的方式增长或代理作业失败)

我想释放一些空间,同时为未来的增长留出足够的空间,这应该比我的代理人工作之前少得多。

所以我不想收缩然后整理索引,因为这可能需要大量停机时间并且几乎总是一个坏主意。

删除数据库并恢复 10GB 备份是一种选择吗?我什至不确定这是否会给我想要的结果,即一个较小的数据库,其文件中有 2GB 的可用空间以供将来增长。

谢谢

sql-server-2008 restore
  • 1 个回答
  • 97 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve