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-5189

Oleg Dok's questions

Martin Hope
Oleg Dok
Asked: 2015-01-22 00:03:37 +0800 CST

为什么以及如何有时在肯定有 Sch-M 锁的情况下出现“缺少表错误”?

  • 7

我有一个综合测试,它重现了我们在生产环境中遇到的一些错误。这是重现它的 2 个脚本:

第一

DBCC TRACEOFF(-1,3604,1200) WITH NO_INFOMSGS;
SET NOCOUNT ON;
IF @@TRANCOUNT > 0 ROLLBACK
IF object_id('test') IS NOT NULL 
    DROP TABLE test
IF object_id('TMP_test') IS NOT NULL 
    DROP TABLE TMP_test
IF object_id('test1') IS NOT NULL 
    DROP TABLE test1
CREATE TABLE test(Id INT IDENTITY PRIMARY KEY)
GO
INSERT test DEFAULT VALUES
GO 2000
WHILE 1 = 1
BEGIN
    CREATE TABLE TMP_test(Id INT PRIMARY KEY)
    INSERT TMP_test SELECT * FROM test

    WAITFOR DELAY '0:00:00.1'
    BEGIN TRAN

    EXEC sp_rename 'test', 'test1'
    EXEC sp_rename 'TMP_test', 'test'
    EXEC sp_rename 'test1', 'TMP_test'


    DROP TABLE TMP_test
    commit
END

第二名

SET NOCOUNT ON;

DECLARE @c INT
WHILE 1 = 1
BEGIN
    SELECT @c = COUNT(*) FROM Test IF @@ERROR <> 0 BREAK
    SELECT @c = COUNT(*) FROM Test IF @@ERROR <> 0 BREAK

    /* and repeat this 10-20 times more*/
    SELECT @c = COUNT(*) FROM Test IF @@ERROR <> 0 BREAK
END

所以,问题是当我在一个会话中运行第一个脚本并让它运行,然后在单独的会话中运行第二个脚本时,我会得到这种类型的错误:

消息 208,级别 16,状态 1,第 13 行对象名称“测试”无效。

问题是 -为什么我会在第一个脚本的循环结束时看到此错误,COMMIT而如果有ROLLBACK?

我有一种感觉,它与情况有某种联系,当脚本提交时,仍然有同名的表,test但它是一个不同的对象,第二个脚本必须重新编译自己。这没关系。但是为什么会出现 missed table 错误呢?AFAIK - 当我在事务中重命名表时 - 它持有 Sch-M 锁到 tran 端?

有人可以回答或指导我阅读我可以深入阅读并理解原因的技术论文吗?

sql-server sql-server-2005
  • 1 个回答
  • 249 Views
Martin Hope
Oleg Dok
Asked: 2012-01-10 00:52:14 +0800 CST

SQL Server:我的白皮书需要主键建议

  • 0

我已经厌倦了向我们研发团队中的每一位新初级开发人员解释为什么他应该使用主键以及如何做到这一点。所以我决定写一份小白皮书,每个新开发人员都应该阅读。这是它的草稿。

免责声明:

  1. 我知道并理解聚集索引和主键之间的区别
  2. 在下面的问题中PRIMARY KEY表示PRIMARY KEY CLUSTERED,WITHOUT PRIMARY KEY表示WITHOUT PK AND CLUSTERED INDEX
  3. 请注意,这是面向初级而非 SQL 程序员的白皮书
  4. 他们所做的所有事情 - 在进入主要开发分支之前进行审查
  5. 我不打算向他们解释——什么时候使用聚集索引和非聚集主键会有好处——否则我会陷入过早的优化地狱

问题是——我还应该在文档中添加什么?可能是——我应该改变什么?以及更详细地解释什么?

草稿来了:

  • 主键必须约束数据库中的任何表。
  • 如果没有 PK,表将被视为堆,SQL Server 对此类数据的使用非常有限——我唯一应该说它是合适的——一个用于从 SQL Server 引擎外部快速批量加载数据的缓冲区。
  • 避免使用自然主键。主要是因为它们的自然(高斯)分布。例如,在具有基于 Family 和 Name 的主键的 PhoneBook 表中,将有许多 Smiths 和 Wilsons,而 Zimmerbergs 少得多,这说明,包含 Smiths 和 Wilsons 的页面将比其他页面更频繁地被拆分,并且查询也更频繁 - 这乘以性能影响。这会导致性能下降,因为主键的页面已满,并且大多数搜索将命中 PK 的稀疏页面。

此外,即使使用(我希望)平坦分布的 SSN 或 ID 号码,因为 PK 也不能解决 PK 页面拆分的问题,因为这些号码没有任何组织顺序。

  • 次要 - 自然 PK 通常是复合的。这会创建复合外键和宽索引,从而损害性能。所以, ...
  • 避免使用复合 PK。最好使用简单的代理 PK 和复合 UNIQUE 索引,而不是一体式复合 PK,因为它会导致复合 FK 和宽索引,因为语句导致表上的每个二级索引都必须包含整个 PK。
  • 避免使用整数或唯一标识符类型以外的代理主键
  • 在数据库设计阶段,识别实体和对应的表非常重要,这些实体和对应的表可能具有“数以亿计”的行,或者表的键不仅必须是全表唯一的,而且必须是数据库甚至世界唯一的,或者必须通过这个键在几个跳表上与其他表连接 - 这个表最好有 UUID PK,其他 - 普通整数,因为 SQL Server 非常好地调整为使用整数 PK。
  • 这两种类型可以保证向量分布(IDENTITY 或 NEWSEQUENTIALID())和单调序列。
  • 主要数据库设计规则 -花 20 分钟进行深思熟虑的设计将在生产数据库维护期间节省数天甚至数周的时间
sql-server database-design
  • 3 个回答
  • 1035 Views
Martin Hope
Oleg Dok
Asked: 2012-01-07 02:34:17 +0800 CST

我锁定是正确的吗?

  • 6

关于这个问题我想问

比较两个查询:

(1)
DELETE dbA.dbo.tableA
FROM dbA.dbo.tableA a WITH(NOLOCK)
JOIN dbB.dbo.tableB b WITH(NOLOCK)
  ON 
      b.colA = a.colA
  AND b.colB = a.colB

和

(2)
DELETE FROM dbA.dbo.tableA 
WHERE EXISTS
(
  SELECT *
  FROM dbB.dbo.tableB b WITH(NOLOCK) 
  where
      b.colA = dbA.dbo.tableA .colA 
  AND b.colB = dbA.dbo.tableA .colB 
) 

很明显,如果我们不考虑可能导致脏读的并发写入,查询会做类似的工作。

但我有疑问

我对以下评论是否正确?

请注意,将从语句 (2) 的最开始放置一个共享(可升级?)锁 @ tableA,而不是在连接 (1) 中放置两个 NOLOCK 表,这将放置第一个锁 - UX 锁仅在此之后将找到要删除的第一行

sql-server sql-server-2005
  • 1 个回答
  • 208 Views
Martin Hope
Oleg Dok
Asked: 2012-01-06 05:49:18 +0800 CST

需要 SQL Server Frozen Ghost 清理解决方法

  • 15

我有几张表,行数在 5M 到 1.5G 之间

每个表都有其 BLOB 字段,其大小从 100 字节到 30 MB 不等,并且存储为“行外的大值类型”= ON

表存储在不同的文件组中,每个文件组有 3-4 个文件,每个文件在不同的磁盘上 @ 不同的 LUN @ 非常快的 SAN

这些表每天都会增长 5-100 Gb,行数为 600k - 150 万

经过一定的时间,从 2 周到 6 个月不等,一些行被删除或移动到存档数据库,所以 - 工作表中没有任何超过 6 个月的行。

服务器的当前配置:

  • SQL 服务器引擎是 2008 R2 SP1 Enterprise @ 24 核,@ 64Gb RAM
  • SQL Server 使用额外的启动标志运行:

-T 3640; (消除了为存储过程中的每个语句向客户端发送 DONE_IN_PROC 消息。这类似于 SET NOCOUNT ON 的会话设置,但是当设置为跟踪标志时,每个客户端会话都以这种方式处理)

-T 1118;(将 tempDB 中的分配从一次 1pg(前 8 页)切换到一个程度。)

-T 2301;(启用特定于决策支持查询的高级优化。此选项适用于大型数据集的决策支持处理)

-T 1117;(一次增长所有数据文件,否则依次增长。)

-E; (增加为文件组中的每个文件分配的范围数。此选项可能对运行索引或数据扫描的用户数量有限的数据仓库应用程序很有帮助)

-T 834; (导致 SQL Server 对分配给缓冲池的内存使用 Windows 大页面分配, http: //msdn2.microsoft.com/en-us/library/aa366720.aspx,http : //support.microsoft。 com/kb/920093 )

  • SQL Server 使用大页面扩展
  • SQL Server 利用快速文件初始化选项
  • AUTOSHRINK 对所有数据库都关闭

问题是- 从服务器正常运行时间的某个时间点(从几天到几个月)开始,GHOST CLEANUP进程拒绝进行强制清理并简单地完成其通常的工作 - 在几秒钟内清理几个页面(which is seen thru Extended Events),这是不合适的,因为它无法清理所有已删除的行

从 SQL Server 2005 RTM Enterprise 时代开始,问题就一直存在

我是如何尝试解决这个问题的:

  • 试图对表的聚集索引强制 SCAN 操作
  • 试图强制 SCAN 操作,这涉及到表的聚集索引上 BLOB 列的所有内容
  • 系统 sp_clean_db_free_space & sp_clean_db_file_free_space
  • 为数据库中的所有文件和页面手动 dbcc cleanpage(@dbid , @fileid, @page)
  • 聚集索引重建和重组
  • 重建数据库
  • DBCC FORCEGHOSTCLEANUP

  • 当我运行查询时:

    select * 
    from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
    

    我看到数以百万计的幽灵记录,但仅适用于 LOB_DATA 的分配单元类型

唯一有帮助的东西:

  • 使用 SHUTDOWN 命令停止服务器或重新启动整个主机 - 它会有所帮助,重新启动后 GHOST CLEANUP 进程会运行几个小时并实际清除所有重影记录
  • 带有 EMPTYFILE 选项的 DBCC SHRINKFILE - 将所有数据从一个文件移动到其他文件或新创建的文件只会清除该文件中的幽灵记录 - 问题是我真的很讨厌收缩操作。一个文件需要 3-4 天

问题- 是否存在任何程序化(首选)或维护方式来强制 GHOST CLEANUP 而无需服务器停机,因为服务器停机成本太高,甚至无法接受 - 每小时从数千美元到数万美元

发现与我类似的问题在这里:

  • http://support.microsoft.com/kb/932115
  • http://www.sqlservercentral.com/Forums/Topic496244-149-1.aspx

和这里一样:

  • http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/c023e51c-92ad-471b-89a6-8c93732ee6cb/
sql-server sql-server-2008-r2
  • 2 个回答
  • 8085 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