我们有许多具有相同配置的系统
每天晚上 SQL Server 会做大约 2-3 小时的处理,然后是 2-3 小时的 AS 处理。然后全天只查询 AS。
假设这是一个专用服务器,没有其他应用程序值得关注,并且两组处理是完全同步的 - 没有重叠总是一个接一个 - 我怎样才能最好地设置 SQL 和 AS 服务器内存限制。
询问的原因是,如果我不为 SQL 设置限制,它将抢占它所能获取的所有内存。但是 - 我的理解是,如果出现以下情况,SQL 将很乐意放弃此内存:
它没有使用它并且
另一个服务/程序请求它。
所以从逻辑的角度来看,我相信允许 SQL 根据需要使用尽可能多的东西,但我不太确定 AS' TotalMemoryLimit。我不确定 AS 是否会放弃它的记忆。事实上,阅读更多让我相信让它承担一切是错误的。
这是否意味着我实际上需要为两者设置限制?我对最佳实践应该是什么以及考虑到流程不重叠我们需要衡量什么感到困惑。
希望这是有道理的。

今天我在 The Heap 上,正在查看我认为可以改进的查询计划。然而,它创造了一些东西,动摇了我对 SQL Server 查询优化器的信念。如果sql-server甚至不能计数到 100%,我还可以信任它吗?
表的特点:
date_entered列有没有人以前见过这个,是什么导致计划看起来如此扭曲?

我是初级 DBA,有 3 年的经验。我们的工作是微调查询或建议开发人员应该重写特定代码或需要索引。
开发团队经常问的一个简单问题是:“昨天运行良好,突然发生了什么变化?” 我们将被要求检查基础设施方面。对任何问题的第一反应似乎总是将最大的责任归咎于基础设施,这始终是首先要验证的事情。
我们应该如何回答开发团队提出的“改变了什么”的问题?大家有遇到过同样的情况吗?如果是这样,请分享您的经验。
基于此查询,如果我看到少量的总读取(非常接近 0 或 0,如 1 或 2)和大量或中等数量的用户更新(我无法通过此查询找到插入或删除)行数很大,理论上我应该删除索引。
SELECT DISTINCT
OBJECT_NAME(s.[object_id]) AS ObjectName
, p.rows TableRows
, i.name AS [INDEX NAME]
, (user_seeks + user_scans + user_lookups) AS TotalReads
, user_updates UserUpdates
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i ON i.[object_id] = s.[object_id]
AND i.index_id = s.index_id
INNER JOIN sys.partitions p ON p.object_id = i.object_id
WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') = 1
AND s.database_id = DB_ID()
AND i.name IS NOT NULL
ORDER BY (user_seeks + user_scans + user_lookups) ASC
Run Code Online (Sandbox Code Playgroud)
我想在这里交叉检查这个假设的准确性。例如,一个已经存在一年多但从未被阅读过但高度更新的索引,似乎是一个坏主意。是否存在这种假设无效的情况?
我在 Microsoft SQL Server 2008 中编写了一个表值函数,以在数据库中使用逗号分隔的列来为每个值吐出单独的行。
例如:“一、二、三、四”将返回一个只有一列包含以下值的新表:
one
two
three
four
Run Code Online (Sandbox Code Playgroud)
这段代码看起来容易出错吗?当我测试它时
SELECT * FROM utvf_Split('one,two,three,four',',')
Run Code Online (Sandbox Code Playgroud)
它永远运行并且永远不会返回任何东西。这真的很令人沮丧,尤其是因为 MSSQL 服务器上没有内置的拆分函数(为什么为什么为什么?!)而且我在网上找到的所有类似函数都是绝对垃圾或根本与我想要做的事情无关.
这是函数:
USE *myDBname*
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[utvf_SPlit] (@String VARCHAR(MAX), @delimiter CHAR)
RETURNS @SplitValues TABLE
(
Asset_ID VARCHAR(MAX) NOT NULL
)
AS
BEGIN
DECLARE @FoundIndex INT
DECLARE @ReturnValue VARCHAR(MAX)
SET @FoundIndex = CHARINDEX(@delimiter, @String)
WHILE (@FoundIndex <> 0)
BEGIN
DECLARE @NextFoundIndex INT
SET @NextFoundIndex = CHARINDEX(@delimiter, @String, @FoundIndex+1)
SET @ReturnValue = SUBSTRING(@String, @FoundIndex,@NextFoundIndex-@FoundIndex)
SET …Run Code Online (Sandbox Code Playgroud) 我创建了一个非常基本的 SQL 表,如下所示
CREATE TABLE [dbo].[TickData](
[Date] [varchar](12) NULL,
[Time] [varchar](12) NOT NULL,
[Symbol] [varchar](12) NOT NULL,
[Side] [varchar](2) NOT NULL,
[Depth] [varchar](2) NOT NULL,
[Quote] [varchar](12) NOT NULL,
[Size] [varchar](18) NOT NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
然后我执行了 3 Gig Bulk Insert
BULK
INSERT TickData
FROM
'C:\SUMO.csv'
GO
Run Code Online (Sandbox Code Playgroud)
然后 SQL 服务器的 RAM 使用量飙升,吃掉了大约 30Go 的 RAM:


我更愿意认为这是一种异常行为,可以采取措施来避免这种情况。
编辑:
好的,这似乎是默认行为。很公平。
但是,为什么在批量插入完成后很久没有释放内存?
一些额外的考虑:
至于有关 SQL 服务器在操作系统“告知”时释放内存的评论,我在 24 核 32 Gb Xeon 服务器上的实践经验证明这是不准确的:一旦内存消耗大的 BCP 提取结束我有一个数据处理应用程序的 .Net 实例池,它们需要处理提取的数据,并且它们会窒息/争吵以共享剩余内存以尝试执行它们的工作,这比打开 SQL Server 需要更长的时间关闭,内存可供所有应用程序共享。我必须停止 …
我正在尝试对外部磁盘进行简单备份并收到此错误:
服务器“服务器名称”的备份失败
附加信息:
System.Data.SqlClient.SqlError:加载在“C:\Program Files\Microsoft SQL..”上的媒体被格式化为支持 1 个媒体系列,但根据备份设备规范需要 2 个媒体系列。(Microsoft.SqlServer.Smo)`
备份类型:完整
为什么我会收到此错误,为什么消息指向C:\Program Files..目标文件是外部设备?
SQL Server 如何计算查询执行结果集中记录的顺序?
我试图让它正面或反面,但发现自己挠头。当我更改字段时,我选择的顺序也会更改。当我用 a 执行下面的 SQL 时,SELECT *我得到相同的记录,但顺序大不相同。
SELECT TOP (900)
AD.ATTACHMENTID,
AD.NAME,
AD.ISINLINE,
AD.INSERTEDDATETIME,
ATMT.ATTACHMENTBLOB,
U.UFID
FROM ATTACHMENTDETAIL AD WITH (NOLOCK)
INNER JOIN MESSAGEATTACHMENT MA ON MA.ATTACHMENTID = AD.ATTACHMENTID
INNER JOIN ATTACHMENT ATMT ON ATMT.ATTACHMENTID = AD.ATTACHMENTID
INNER JOIN MESSAGE MSG ON MSG.ID = MA.MESSAGEID
INNER JOIN MESSAGEDETAIL MD ON MD.MESSAGEID = MA.MESSAGEID
INNER JOIN [USER] U ON U.ID = MD.USERID
LEFT OUTER JOIN XmlExtractionMapping XM ON MA.MESSAGEID = XM.MessageId
WHERE AD.FILEBOXTOKEN IS NULL
AND (XM.XMLEXTRACTIONDATE …Run Code Online (Sandbox Code Playgroud) 我使用 SQL Server 2008 R2 已经有一段时间了,它运行良好。现在我需要使用 SQL Server 2012。这会影响我现有的数据库吗?在运行 SQL Server 2008 R2 的计算机上安装 SQL Server 2012 涉及多少风险?
运行以下脚本时出现错误;
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE' AND TABLE_NAME='Table_Name')
BEGIN
CREATE TABLE Table_Name
(
Field_Name_1 binary(32) NOT NULL CONSTRAINT PK_Name_Goes_Here PRIMARY KEY NONCLUSTERED
, Field_Name_2 int NOT NULL
, Field_Name_3 datetime NOT NULL INDEX IX_Name_Goes_Here CLUSTERED
)
END
Run Code Online (Sandbox Code Playgroud)
特别是它的聚集索引创建抛出以下错误:
消息 1018,级别 15,状态 1,第 15 行
“INDEX”附近的语法不正确。如果这是作为表提示的一部分,现在需要 WITH 关键字和括号。有关正确的语法,请参阅 SQL Server 联机丛书。
这很奇怪,因为它适用于我们所有的服务器,除了特定的 QA 服务器。我们采取的修复措施是在表创建语句之外创建聚集索引,但如果有人以前遇到过这个问题,我会感兴趣吗?
sql-server ×10
index ×2
memory ×2
backup ×1
ddl ×1
functions ×1
index-tuning ×1
installation ×1
optimization ×1
order-by ×1
performance ×1
ssas ×1
ssms ×1
t-sql ×1