我正在处理一个相当大的 SQL Server 数据库并遇到一些问题。
数据库很新,我一直在将数据导入表中,这使整个服务器运行得很慢。数据库现在是 15GB,例如在 1 个表中它只有 4 列,但有 1.22 亿行,占用了 3.5GB。另一个表大约有 35 列,300 万行,占用大约 1.5GB。
每当我打开一张大表,或开始在我的 MVC3 应用程序中使用它时,它几乎使服务器瘫痪;内存使用量达到最大值,它开始运行非常缓慢。(服务器规格:奔腾双核 E6300 2.8GHz,2GB RAM,Windows 2008,SQL Server 2005,一张磁盘)。
这确实是我第一次处理如此大量的数据,因此一直在添加索引以尝试加快速度,但是一旦内存达到最大水平,我必须重新启动服务器才能使其正常工作正常的速度。
无论如何,我不觉得 15GB 有那么大——2GB RAM 肯定可以处理吗?我什至还没有完成第一轮数据的添加,所以它会变得更大。
有没有人对如何更好地设置和提高效率有任何建议。所有 PK's 和 FK's 都已经设置好,我已经在大表中添加了索引,看看这是否有帮助,但它最终又开始慢慢变慢了。顺便说一句,在数据库属性中,它显示“可用空间 - 1596.96MB”你如何增加这个数字?
我有一个包含以下列定义的表:
ID (INT, PK)
Name (VarChar)
Active (Bit)
Bunch_of (Other_columns)
Run Code Online (Sandbox Code Playgroud)
问:我想有一个约束Name/Active,使得我们只能有1条记录与给定的Name是Active(Active= 1),但我们也能有同样的多条记录Name是Inactive(Active= 0)。这可能吗?
我已经尝试了普通的 Unique 约束,但它们将数据集限制为仅允许 1 条记录的给定Name为Inactive.
我们似乎遇到了一个莫名其妙的问题。检查点进程卡在 SLEEP_BPOOL_FLUSH 状态,并没有真正减少日志文件中的使用。
这在以前似乎从未发生过。
我知道 SLEEP_BPOOL_FLUSH 是磁盘子系统繁忙时对 CHECKPOINT 进程的正常等待。实际上,我们一直有一个非常繁忙的磁盘子系统,所以我不明白为什么这会成为一个问题。
(如果您手动运行检查点命令,同样的结果...您的用户进程在 SLEEP_BPOOL_FLUSH 中等待)。
我们可以做些什么来推动检查点发生?是否可以调整检查点的参数以免发生这种情况?
(SQL Server 2005,RAID 子系统,简单恢复模型)
我通常可以使用生成脚本/ DTS 来移动数据和表等。但是,其中一个数据库有大量的加密程序,我无法通过脚本来移动它们。
我也没有旧的 2005 年数据库备份。
我没有手动恢复解密程序。
有什么办法可以复制/移动它们吗?
有没有办法计算全文搜索目录所需的物理驱动器空间?空间很便宜,但我想知道我在做什么。
我正在查看一个包含大约 200 篇长度不等的文章的表格。我想索引标题字段和文章的正文。
更新: 我有点想预测未来。例如200篇文章,标题是varchar(500),文章正文是varchar(max)。那么,在不创建索引的情况下,是否可以估算全文搜索目录的大小?
我有一个按日期顺序运行的项目表,每个条目都有开始和结束:
ID | Start | End
----------------------------------------
1 | 2012-08-20 00:00 | 2012-08-20 23:59
2 | 2012-08-21 00:00 | 2012-08-21 23:59
3 | 2012-08-22 00:00 | 2012-08-22 23:59
4 | 2012-08-23 00:00 | 2012-08-23 23:59
5 | 2012-08-24 00:00 | 2012-08-24 23:59
6 | 2012-08-28 00:00 | 2012-08-28 23:59
7 | 2012-08-29 00:00 | 2012-08-29 23:59
8 | 2012-08-30 00:00 | 2012-08-30 23:59
Run Code Online (Sandbox Code Playgroud)
请注意,数据中存在差距(周末和银行假期)。是否可以编写一个查询来选择间隙边缘的记录?我想要的是一种通用的方式来结束这样的事情:
ID | Start | End
----------------------------------------
1 | 2012-08-20 09:00 | 2012-08-20 23:59
2 | 2012-08-21 …Run Code Online (Sandbox Code Playgroud) 我有一个表,用于存储从现场设备接收到的数据序列(计数器)。无论如何,这些序列需要在可配置的时间跨度内有序,但可以无序进入系统。如果设备被重置,那么它的序列号将被设置回 0。
CREATE TABLE [dbo].[TapGapDetail]
(
[Id] [bigint] NOT NULL, --FK to another table
[DeviceESN] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[TapDateUTC] [datetime] NOT NULL, --date event occurred on device
[CreatedDateUTC] [datetime] NOT NULL,
[Counter] [int] NOT NULL,
)
CREATE CLUSTERED INDEX [CX_TapGapDetail] ON [dbo].[TapGapDetail] ([DeviceESN], [CreatedDateUTC], [Counter]) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
我尝试通过 DeviceESN 和 CreatedDateUTC 切换 CX 的顺序,但在我的系统上,它似乎对 IO 没有太大影响。该表中有数百万行。
示例插入将是:
INSERT INTO TapGapDetail (1, 'A', '1/1/2012 01:00AM', '1/1/2012 01:10AM', 5)
INSERT INTO TapGapDetail (2, 'A', '1/1/2012 12:05AM', '1/1/2012 01:15AM', …Run Code Online (Sandbox Code Playgroud) 我有一个存储过程,它由在某种 Java/WebSphere 类型平台上运行的应用程序远程访问。它需要一个参数,返回一些数据,就是这样。
最近有人谈论它可能运行缓慢 - 我非常有信心 SP 没有理由运行缓慢。但是我向数据库添加了一个日志表,并让 SP 在进入时写入它,并在SELECT完成后再次写入,这样我就可以看到调用需要多长时间。
此更改适用于我的 Windows 身份验证登录 - 当我使用远程应用程序正在使用的应用程序登录时,它也适用。但是,我是从 .Net 环境而不是从 Java 进行连接。
当我更改 SP 以进行日志记录时,我注意到我INSERT输入到日志表中的 ID正在跳跃 - 表明发生了失败的插入 - 大概是由远程应用程序引起的(因为这是唯一使用的这个SP)。
应用程序登录只有db_datareader分配给它的角色。我已经GRANT编EXEC到应用程序日志上,当然。
是不是INSERT因为访问的登录只有一个,SP就不能连续db_datareader?如果是这样,INSERT当我使用相同的登录时,SP 怎么办?
我在我们的一个生产数据库中有大约 40 个表,由于各种原因,这些表不是使用聚集索引创建的。
转换这些堆的最佳自动化方法是什么?
由于我天生是一名开发人员,我真的不想手动执行此操作。
我开始为此创建一个过程,如为什么此游标以不正确的顺序产生结果中所述?,然而我对那篇文章的回应让我怀疑我在做什么。
我们允许我们的用户dbo在他们自己的数据库中,但是这确实使他们能够删除他们自己的数据库。这并不经常发生,但我想阻止他们这样做。
我设计了以下触发器来防止这种情况发生,并将数据库删除到sysadmin角色成员:
CREATE TRIGGER [deny_customer_db_drop]
ON ALL SERVER
FOR DROP_database
AS
IF IS_SRVROLEMEMBER('sysadmin') = 0
BEGIN
PRINT 'You are not permitted to drop this database'
ROLLBACK
END
GO
Run Code Online (Sandbox Code Playgroud)
这有效,但我想知道是否有更优雅的方法来使用权限而不调整每个登录自己的特定权限?
sql-server-2005 ×10
sql-server ×6
checkpoint ×1
constraint ×1
disk-space ×1
heap ×1
index ×1
performance ×1
permissions ×1
role ×1
t-sql ×1