标签: sql-server

SQL 数据库物理文件碎片

我知道有真正的三个种类的碎片,我需要被关心的DBA:

  1. SQL 数据文件中的索引碎片,包括聚集索引(表)碎片。使用 DBCC SHOWCONTIG(在 SQL 2000 中)或 sys.dm_db_index_physical_stats(在 2005+ 中)识别这一点。

  2. SQL 日志文件中的VLF 碎片。运行 DBCC LOGINFO 以查看每个 SQL 日志文件中有多少 VLF。

  3. 硬盘驱动器上数据库文件的物理文件碎片。使用 Windows 中的“磁盘碎片整理程序”实用程序对此进行诊断。(灵感来自这篇优秀的博客文章

很多注意力都集中在索引碎片上(请参阅Paul Randall 的这个出色的 Serverfault 回答),所以这不是我的问题的重点。

我知道我可以在最初创建数据库时通过规划合理的预期数据文件和日志大小来防止物理碎片(和 VLF 碎片),因为这种碎片最常发生于频繁的增长和收缩,但我有一些关于如何修复的问题一旦识别出物理碎片:

  • 首先,物理碎片是否与企业 SAN 相关?我可以/应该在 SAN 驱动器上使用 Windows 碎片整理程序,还是 SAN 团队应该使用内部碎片整理实用程序?在 SAN 驱动器上运行时,我从 Windows 工具获得的碎片分析是否准确

  • 物理碎片对 SQL 性能的影响有多大?(让我们假设一个内部驱动器阵列,等待上一个问题的结果。)它比内部索引碎片更重要吗?或者它真的是同一类问题(驱动器必须进行随机读取而不是顺序读取)

  • 如果驱动器存在物理碎片,碎片整理(或重建)索引是否是在浪费时间?在我解决另一个问题之前,我需要先修复一个吗?

  • 在生产 SQL 机器上修复物理文件碎片的最佳方法是什么?我知道我可以关闭 SQL 服务并运行 Windows Defrag,但我也听说过一种技术,您可以执行完整备份,删除数据库,然后从备份还原到空驱动器。是否推荐使用后一种技术?从这样的备份中恢复是否也会从头开始构建索引,从而消除内部索引碎片?或者它只是将页面顺序返回到与备份时相同的顺序?(如果这很重要,我们正在使用带有压缩的 Quest Lightspeed 备份。)

更新:到目前为止,关于是否对 …

fragmentation sql-server

19
推荐指数
2
解决办法
1万
查看次数

如何让 SQL Server 释放其内存?

我知道 SQL 喜欢 RAM,但是当 Windows 询问时会释放它。我知道这就是 SQL 应该如何工作。但是我有一个 Windows 管理员不相信 SQL 实际上会返回 RAM,并且在这个特定的(虚拟)服务器上,一旦 Analysis Services 完成,SQL 就不需要太多多问 SQL。

所以我试图向 Windows 管理员保证虚拟环境的问题不是“因为 SQL 使用了太多 RAM”,但我似乎无法说服 SQL 在不重新启动服务的情况下释放它。

在处理多维数据集时,SQL 服务愉快地占用了 8GB 的​​ RAM,但由于它没有压力,所以在正常的一天中它不会释放太多内存。Windows 人尖叫,让 SQL 发布它会更好。

我不想使用最大内存设置,因为我确实希望 SQL 在处理时使用那么多 RAM。我只是希望它之后再次下降。

它可能是SQL Server 不释放内存从 SQL Server 回收内存的重复,但我想知道是否有不同的答案。等待 Windows 收回它不会说服这里的 Windows 人员。重新启动服务是一种选择,但我真的不喜欢这个想法。

我想知道如何让 Windows 要求它回来......

windows memory sql-server

19
推荐指数
2
解决办法
7万
查看次数

在 SQL Server 中,如何为现有用户创建登录名?

我将一个数据库从一个 SQL Server 实例恢复到另一个 SQL Server 实例。数据库已经添加了用户。但是他们没有新 SQL Server 实例的登录名。

我知道如何为新用户创建新登录名,但如何为现有用户创建登录名?

login sql-server

19
推荐指数
3
解决办法
3万
查看次数

有没有办法确定用于创建 MDF 或 BAK 文件的 SQL Server 版本?

我有一个存储为 MDF 文件的 SQL Server DB 的本地副本。有没有办法告诉您使用哪个版本的 SQL Server 创建该文件?

sql-server

19
推荐指数
3
解决办法
3万
查看次数

我无法连接到本地 SQL Server 2008?

我刚刚安装了 SQL Server 2008,但无法使用 SQL Server Management Studio 连接到它。我的目的是让我的本地 Windows 用户通过身份验证,但我不完全确定如何做到这一点

在我写的连接对话框中:

Server type: Database Engine
Server name: (local)
Authentication: Windows Authentication
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是这是否是我应该连接的?当我尝试连接时,我收到此错误消息:

TITLE: Connect to Server
------------------------------

Cannot connect to (local).

------------------------------
ADDITIONAL INFORMATION:

A network-related or instance-specific error occurred while establishing a connection
to SQL Server. The server was not found or was not accessible. Verify that the instance 
name is correct and that SQL Server is configured to allow remote connections.
(provider: Named Pipes Provider, …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008

18
推荐指数
1
解决办法
15万
查看次数

SQL - 登录前握手期间发生错误

直到昨天晚上,我才能从本地机器连接到我的服务器。现在,我收到以下错误:

已成功与服务器建立连接,但在登录前握手期间发生错误。(提供程序:SSL 提供程序,错误:0 - 等待操作超时。)(.Net SqlClient 数据提供程序)

请注意,我可以毫无问题地登录到实际服务器。

昨天,我在我的机器上安装了 IIS 并使用我的 IP 地址设置了一个站点 - 不知道这是否有什么关系。

我确实遇到了这篇文章,按照步骤操作,但似乎没有帮助。

http://escapekeys.com/microsoft-sql-server-error-64-a-connection-was-successfully-established-with-the-server/89

我也看了下面的文章,更改了TC/IP设置,重新启动,但没有。

http://blog.sqlauthority.com/2009/05/21/sql-server-fix-error-provider-named-pipes-provider-error-40-could-not-open-a-connection-to-sql-服务器-microsoft-sql-server-error/

也开始尝试从评论中提出建议,但当我意识到我可能会把事情搞砸时就停止了。

那么,为什么会发生这种情况/我该如何解决?

iis connection sql-server

18
推荐指数
2
解决办法
22万
查看次数

SQLEXPRESS 的别名

我有 SQL Server 2008 的开发人员版,但现在我有一个带有硬编码连接字符串的软件:

Data Source=.\SQLEXPRESS;Initial Catalog=db;User Id=sa;Password=1234;
Run Code Online (Sandbox Code Playgroud)

现在我尝试将配置工具中的别名添加到 SQLEXPRESS,但它只是不想使用这个新别名。

我启用了 TCP/IP 并重新启动了服务。

sql-server sql-server-2008

17
推荐指数
1
解决办法
9312
查看次数

SQL Server 中 LOB 数据的删除性能

这个问题与此论坛主题有关

在我的工作站和企业版两节点虚拟机集群上运行 SQL Server 2008 开发版,我将其称为“alpha 集群”。

删除带有 varbinary(max) 列的行所需的时间与该列中数据的长度直接相关。起初这听起来可能很直观,但经过调查,它与我对 SQL Server 通常如何实际删除行和处理此类数据的理解相冲突。

该问题源于我们在 .NET Web 应用程序中看到的删除超时(> 30 秒)问题,但为了本次讨论,我已对其进行了简化。

当一条记录被删除时,SQL Server 将它标记为一个幽灵,以便在事务提交后稍后由 Ghost 清理任务清理(参见Paul Randal 的博客)。在分别删除 varbinary(max) 列中包含 16 KB、4 MB 和 50 MB 数据的三行的测试中,我看到这种情况发生在包含行内部分数据的页面以及事务中日志。

我觉得奇怪的是,在删除过程中所有 LOB 数据页上都放置了 X 锁,并且这些页在 PFS 中被释放。我在事务日志以及DMVsp_lock的结果中看到了这一点dm_db_index_operational_stats( page_lock_count)。

如果这些页面不在缓冲区缓存中,这会在我的工作站和我们的 alpha 集群上创建 I/O 瓶颈。事实上,page_io_latch_wait_in_ms来自同一个DMV的实际上是整个删除的持续时间,并且page_io_latch_wait_count与锁定页面的数量相对应。对于我工作站上的 50 MB 文件,当以空缓冲区缓存 ( checkpoint/ dbcc dropcleanbuffers)启动时,这会转化为超过 3 秒,而且我毫不怀疑,对于大量碎片和负载不足的情况,时间会更长。

我试图确保它不只是在缓存中分配空间占用了那段时间。在执行删除而不是checkpoint方法之前,我从其他行读取了 2 GB 的数据,这多于分配给 SQL Server …

sql-server

17
推荐指数
1
解决办法
3350
查看次数

SSMS:SQL Server 在哪里存储其服务器名称?

我有许多“旧”服务器或服务器名称,其中有拼写错误,它们一直显示在 SQL Server Management Studio 的“连接到数据库”对话框中的服务器下拉列表中:

在此处输入图片说明

这些名字存储在哪里?有没有办法清理该列表并删除一些条目?

sql-server ssms

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

如何更改 SQL Server 数据库的排序规则?

我正在尝试在单个排序规则上标准化所有数据库 - Latin1_General_CI_AS(标准排序规则)。我有一些数据库位于 SQL_Latin1_General_CP1_CI_AS 中。

我知道我可以使用 ALTER DATABASE 来更改数据库排序规则,但这只会影响新对象。我的理解是,更改现有列的唯一方法是对每个表中的每一列执行 ALTER COLUMN - 我需要删除并重新创建所有索引才能做到这一点。

我想它看起来像这样:

DROP INDEX indexname ON tablename

GO

ALTER TABLE tablename ALTER COLUMN columname varchar(50) COLLATE Latin1_General_CI_AS NULL

GO

CREATE CLUSTERED INDEX indexname ON tablename (columname ASC)
Run Code Online (Sandbox Code Playgroud)

并对整个数据库中的每个 varchar、char、text、nvarchar、nchar 和 ntext 列重复。那将是一个巨大的SQL 脚本。

有没有更简单的方法来做到这一点,或者任何人都可以建议一种自动创建 SQL 脚本的方法来做到这一点?

sql sql-server sql-server-2005

16
推荐指数
1
解决办法
4万
查看次数