数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

1
DBCC CheckDB之后,性能监视器中的数据库缓存内存显着下降
我们一直在监视一些SQLServer: Memory Manager指标,并注意到DBCC CheckDB工作后指标 Database Cache Memory (KB) 下降明显。确切地说,它从140 GB缓存的DB内存降至60 GB。之后,请在一周内慢慢增加速度。(“ Free Memory KB”的数量从之后的20 GB变为100 GB CheckDB) DBCC CheckDB 在每个星期日运行,因此数据库高速缓存内存必须每周再次增加 What is the behavior of this ? Why CheckDB pushes database pages out of memory ? 第二个问题是为什么“ buffer cache hit ratio” DBCC CheckDB完成后没有变化? 它平均为99.99%,而在DBCC CheckDB工作后下降至〜98.00%,并很快恢复至99%,而我预计buffer cache hit ratio会大幅下降,因为数据库数据必须再次从存储读取到RAM?

3
在数据库表中使用SPID(而不是表变量)
用于预订事物的交易数据库... 我们的供应商被要求用@tablevariables替换#temptables(由于繁重的编译锁),但他们替换为一个实际表,该表将SPID作为列添加,以确保存储过程仅作用于适用的行。 您认为这种操作方法有任何风险吗?在所有事务都隔离在它们自己的事务中之前,我担心我们最终可能会将该表锁定一堆,但他们的意见是SQL使用行级锁定并且不会创建更多的锁。 SQL Server版本:2016 Enterprise-13.0.5216.0 CREATE TABLE dbo.qryTransactions ( ID int IDENTITY (0,1) NOT NULL CONSTRAINT pk_qryTransactions PRIMARY KEY CLUSTERED, spid int NOT NULL, OrderID int, ItemID int, TimeTransactionStart datetime, TimeTransactionEnd datetime, ...other fields ) CREATE INDEX idx_qryTransactions_spidID ON qryTransactions (spid, ID) INCLUDE (ItemID, OrderID, TimeTransactionStart, TimeTransactionEnd)

2
尽管缺少列但仍使用覆盖指数
我有以下查询,使用MariaDB 10 / InnoDB: SELECT id, sender_id, receiver_id, thread_id, date_created, content FROM user_message WHERE thread_id = 12345 AND placeholder = FALSE ORDER BY date_created DESC LIMIT 20 该查询根据给定的条件获取消息,并按创建日期排序。 我的覆盖范围超过(thread_id, date_created)。 当运行EXPLAIN时,使用正确的索引,尽管查询使用的是语句中间不在索引中的列,但我得到的输出为“在哪里使用”。我可以将任何值用于“占位符= x”,并且结果相同。 如果我将排序更改为使用另一列,则EXPLAIN正确指示“在哪里使用。使用文件排序”。 我正在抓头。有人可以阐明这一点吗?我希望看到的是,由于覆盖列无法完全使用,因此需要额外的文件排序。

1
在where子句中同时包含“ contains”和“ =”时查询缓慢
以下查询大约需要10秒钟才能完成具有12k条记录的表 select top (5) * from "Physician" where "id" = 1 or contains("lastName", '"a*"') 但是如果我将where子句更改为 where "id" = 1 要么 where contains("lastName", '"a*"') 它会立即返回。 两列都被索引,lastName列也被全文索引。 CREATE TABLE Physician ( id int identity NOT NULL, firstName nvarchar(100) NOT NULL, lastName nvarchar(100) NOT NULL ); ALTER TABLE Physician ADD CONSTRAINT Physician_PK PRIMARY …

3
XML查询问题
我正在尝试生成SQL查询,以从以下SQL XML中获取“ DATE”值: 我已经尝试过类似的方法,但我认为我不了解这些概念。 select xConfig.value('(/SearchjobConfig/QueryString/SearchCriteria/ExpressionSet/SimpleAttributeExpression) [1]','nvarchar(max)') from Job 这是XML文本: <SearchJobConfig> <QueryID>1072</QueryID> <QueryString> <SearchCriteria name="Search query" > <ExpressionSet logicalOperator="AND"> <SimpleAttributeExpression displayName="Date" npmPropertyId="4" searchOperation="GREATER_EQUAL" dataType="string" caseSensitive="false">2019-06-01T04:00:00</SimpleAttributeExpression> <SimpleAttributeExpression displayName="Date" npmPropertyId="4" searchOperation="LESS_EQUAL" dataType="string" caseSensitive="false">2019-06-13T03:59:59</SimpleAttributeExpression> <SimpleAttributeExpression displayName="Class" npmPropertyId="1056" searchOperation="EQUALS" dataType="int32" caseSensitive="false">65</SimpleAttributeExpression> </ExpressionSet> </SearchCriteria> </QueryString> </SearchJobConfig> 预期的输出将是日期: 2019-06-01T04:00:00 2019-06-13T03:59:59 以及如何在同一行上获得结果。示例: date_val_start date_val_end 2019-06-01T04:00:00 2019-06-13T03:59:59 我正在使用SQL …

1
initdata:内核缓冲区没有内存
我最近将RedHat Enterprise Linux 7.6上的SQL Server 2017 Developer Edition升级到SQL Server 2019 CTP 3.0。 mssql-server服务将不再启动。/ var / opt / mssql / log / errorlog显示以下内容: 2019-06-12 09:36:31.98服务器Microsoft SQL Server 2019(CTP3.0)-15.0.1600.8(X64) 2019年5月17日00:56:19 版权所有(C)2019 Microsoft Corporation 开发人员版(64位) Linux(Red Hat Enterprise Linux) 2019-06-12 09:36:32.04服务器UTC调整:-5:00 2019-06-12 09:36:32.05服务器(c)Microsoft Corporation。 2019-06-12 09:36:32.07服务器保留所有权利。 2019-06-12 09:36:32.08服务器服务器进程ID为 32.2019-06-12 09:36:32.09服务器在文件'/ var / opt …

2
为什么带有参数的此递归CTE在处理文字时不使用索引?
我在树结构上使用递归CTE来列出树中特定节点的所有后代。如果我在WHERE子句中写入文字节点值,则SQL Server似乎实际上仅将CTE应用于该值,从而给出了具有较少实际行数的查询计划,等等: 但是,如果我将值作为参数传递,它似乎实现了(假脱机)CTE,然后在事实之后对其进行过滤: 我可能看错了计划。我还没有注意到性能问题,但是我担心CTE的实现会导致更大数据集的问题,尤其是在繁忙的系统中。另外,我通常会自己遍历此遍历:我遍历祖先,然后遍历到后代(以确保收集所有相关节点)。由于我的数据如何,每组“相关”节点都非常小,因此实现CTE没有任何意义。当SQL Server似乎意识到CTE时,它给我的“实际”数量带来了相当大的数目。 有没有办法让查询的参数化版本像文字版本一样工作?我想将CTE放在可重用的视图中。 用文字查询: CREATE PROCEDURE #c AS BEGIN; WITH descendants AS (SELECT t.ParentId Id ,t.Id DescendantId FROM #tree t WHERE t.ParentId IS NOT NULL UNION ALL SELECT d.Id ,t.Id DescendantId FROM descendants d JOIN #tree t ON d.DescendantId = t.ParentId) SELECT d.* FROM descendants d WHERE …

1
删除自动创建的NT AUTHORITY和NT SERVICE帐户
因此,我最近转移了工作-下面是我在新SQL Server安装的构建脚本中发现的一段代码。 IF EXISTS ( SELECT * FROM [sys].[syslogins] WHERE [name] = N'NT AUTHORITY\SYSTEM' ) BEGIN DROP LOGIN [NT AUTHORITY\SYSTEM]; END IF EXISTS ( SELECT * FROM [sys].[syslogins] WHERE [name] = N'NT SERVICE\SQLWriter' ) BEGIN DROP LOGIN [NT SERVICE\SQLWriter]; END IF EXISTS ( SELECT * FROM [sys].[syslogins] WHERE [name] = …

2
Postgres会执行视图中未选择的计算列的计算吗?
我试图了解从视图中选择数据的性能影响,其中视图中的列之一是原始表中其他数据的功能。 不管计算的列是否在所选列的列表中,都可以执行计算吗? 如果我有一个表并且视图这样声明 CREATE TABLE price_data ( ticker text, -- Ticker of the stock ddate date, -- Date for this price price float8, -- Closing price on this date factor float8 -- Factor to convert this price to USD ); CREATE VIEW prices AS SELECT ticker, ddate, price, factor, price …

3
存储过程可以引用存储它的数据库吗?
假设我有一个存储过程,它在几个数据库中进行了重复的修改。而且我想引用存储过程存储在其中的数据库,即使它在另一个数据库中执行也是如此。 有没有办法检索完整路径(..)或以其他方式检索存储过程的数据库,而不是当前数据库?

3
在只读副本上长时间运行的查询会占用主数据库上的时间
我有一个4节点AG设置,如下所示: 所有节点的VM硬件配置: Microsoft SQL Server 2017企业版(RTM-CU14)(KB4484710) 16个vCPU 356 GB RAM(长话短说...) 最大并行度:1(根据应用程序供应商的要求) 并行成本阈值:50 服务器最大内存(MB):338944(331 GB) AG配置: 节点1:主节点或同步提交不可读的辅助节点,配置为自动故障转移 节点2:主节点或同步提交不可读的辅助节点,配置为自动故障转移 节点3:具有异步提交的可读辅助集,配置为手动故障转移 节点4:具有异步提交的可读辅助节点集,配置为手动故障转移 有疑问的查询: 此查询没有什么疯狂的,它提供了应用程序内各种队列中未完成工作项的摘要。您可以从下面的执行计划链接之一查看代码。 主节点上的执行行为: 在主要节点上执行时,执行时间通常约为1秒标记。这是执行计划,以下是从主节点从STATISTICS IO和STATISTICS TIME捕获的统计信息: (347 rows affected) Table 'Worktable'. Scan count 647, logical reads 2491, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, …

1
为什么我有多个(未关联的)时间历史表?
我一直在建立具有SQL Server 2017后端的概念证明系统。 系统使用临时表记录资产配置并跟踪随时间的变化。 我有一个链接到历史记录表的数据表,我们称它为dbo.MSSQL_TemporaryHistoryFor_12345678900。 到目前为止,一切都很好。我有两个问题: 今天,我关闭了表的版本控制功能,因此可以添加一个计算列。完成此操作,然后再次打开,没有错误。 现在,我发现我无法查询更改之前的任何历史数据。新数据将添加到历史记录中,但是没有任何预先设置。 在SSMS内部,我现在可以看到有多个历史记录表,它们都具有相同的名称,但带有十六进制后缀,例如dbo.MSSQL_TemporaryHistoryFor_12345678900_A0B1C2D3。它们未链接在主数据表下方。它们只是在数据库内部自行浮动。当我查询sys.tables时,这些没有显示为历史表,也没有链接到主数据表。 这些表确实包含丢失的历史数据。 因此,我的问题是: 这些附加表代表什么? 他们是如何创建的? 有什么办法可以将它们重新链接到主要历史链中,以便我可以获取历史报告吗? 这非常令人沮丧,因此将非常感谢您能提供的任何帮助。谢谢。

2
为charindex函数分割/存储长字符串的最快方法
我有一个1 TB的数字字符串。给定一个12个字符的数字序列,我想在原始字符串(charindex函数)中获得该序列的开始位置。 我已经使用SQL Server使用1GB字符串和9位子字符串测试了此字符串,并将该字符串存储为varchar(max)。Charindex需要10秒。将1GB的字符串分成900个字节的重叠块,并创建一个表(StartPositionOfChunk,Chunkofstring),该表的二进制排序规则中使用chunkofstring,建立索引所需的时间不到1秒。10GB的后一种方法是10个数字子串,将charindex升至1.5分钟。我想找到一种更快的存储方法。 例 字符串:0123456789-搜索345 charindex('345','0123456789')的子字符串得出4 方法1:现在,我可以将其存储在由一列组成的SQL Server表strtable中colstr并执行: select charindex('345',colstr) from strtable 方法2:或者我可以通过拆分原始字符串来组成表strtable2(pos,colstr1):1; 012 | 2; 123 | 3; 234 aso,然后我们可以进行查询 select pos from strtable2 where colstr1='345' 方法3:我可以通过将原始字符串分成较大的块1; 01234 |来组成表strtable2(pos2,colstr2)。4; 34567 | 7; 6789然后 select pos2+charindex('345',colstr2) from strtable2 where colstr2 like '%345%' 第一种方法最慢。 第二种方法炸毁了数据库的存储容量! 方法3:在二进制排序规则中,将colstr2长度设置为900字节,在此列上创建索引需要1秒的时间来进行1GB字符串和9位数字子字符串的搜索。对于10GB的字符串和10位的子字符串,ist需要90秒。 还有其他想法如何使它更快(也许通过利用包含长整数的数字组成的字符串,....)? SQL Server 2017 …

4
SQL Server 2014的MAXDOP设置
我知道这个问题已经被问过很多次,并且也有答案,但是,我仍然需要更多有关该主题的指导。 以下是来自SSMS的CPU的详细信息: 以下是数据库服务器任务管理器中的“ CPU”选项卡: 我MAXDOP通过以下公式保持设置为2: declare @hyperthreadingRatio bit declare @logicalCPUs int declare @HTEnabled int declare @physicalCPU int declare @SOCKET int declare @logicalCPUPerNuma int declare @NoOfNUMA int declare @MaxDOP int select @logicalCPUs = cpu_count -- [Logical CPU Count] ,@hyperthreadingRatio = hyperthread_ratio -- [Hyperthread Ratio] ,@physicalCPU = cpu_count / hyperthread_ratio -- [Physical …

1
我是否需要“停机时间”来更新存储过程?(由于“定义更改”错误)
我一直以为更新存储过程是我在用户积极使用系统时可以做的事情。 但是我目前正在测试存储过程的更新,并且正在执行对sproc的长时间运行的调用(调用时已超过4分钟),因此我更新了sproc。(我打算在单独的窗口中尝试其他查询计划。) 当我回到长期运行的机器时,出现了以下错误: The definition of object 'MySprocName' has changed since it was compiled. 该错误似乎表明,如果更新了该存储过程的定义,则任何正在执行的存储过程都会失败。(我认为,一旦存储程序开始运行,尽管定义有所更改,它将在其余的运行中使用该计划。) 这是真的?我是否需要停机才能更新存储过程的定义?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.