标签: sql-server-2005

我可以在一页上存储一半的记录,在另一页上存储一半的记录吗?

我正在观看来自http://technet.microsoft.com/en-us/sqlserver/gg313756.aspx 的Paul Randal 的 MCM 视频

从视频的27:11,作者说记录必须保存在一页中,不能在一页上有一半记录,在另一页上有一半记录。这个观点不是我学到的。但是我对此没有信心,因为我的母语不是英语,可能会误解保罗的意见。谁能帮忙解释一下?

提前致谢。

sql-server-2005 sql-server-2008 sql-server

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

文本或 NVARCHAR(MAX) 字段的索引策略

我有以下查询(针对问题进行了简化)我正在尝试加快只读数据库的速度...

SELECT 
 [sysid]
,[Date]=CONVERT(CHAR, DATEADD(D, [date], '1800-12-28'),101)   
,[From]=[from_addr]   
,[To]=[to_addr]  --I'm a very long Text or NVARCHAR(MAX) Field
,[Subject]=[subject]  
,CASE WHEN [attach] = 1 THEN 'Yes' ELSE 'No' END AS 'Att'   
,[Code]=[ccode]   
,[Staff]=[staff]  
,[MatNo]=[mat_no]  
FROM dbo.[email] 
DYNAMIC WHERE CLAUSE ON ANY OF ABOVE
Run Code Online (Sandbox Code Playgroud)

我已经尝试添加一些索引,包括覆盖索引我不能包含 to_addr 的方式(作为文本或 NVARCHAR(MAX) col),并且查询优化器最终使用聚集索引,因为不包含 to_addr 字段。有什么方法可以处理这样的情况?不幸的是,我仅限于 2005 年。

编辑

尝试添加 Full_Text For to_addr 仍然进行表扫描。但是,如果我注释掉该行,它将使用索引。:(该死的文本数据!

performance index sql-server-2005 sql-server index-tuning query-performance

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

删除聚簇索引后,仍然在尝试做聚簇插入

我正在尝试将数据从一个数据库系统转换为另一个数据库系统。我需要传输和格式化的表之一包含超过 1000 万行。

我正在运行以下脚本来做到这一点:

USE [Cvti101687]
go
truncate table [IDAT_MR_NOTEHISTORY]
go
IF  EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[IDAT_MR_NOTEHISTORY]') AND name = N'PK_iMR_NOTES')
    ALTER TABLE [dbo].[IDAT_MR_NOTEHISTORY] DROP CONSTRAINT [PK_iMR_NOTES]
GO
USE [101687_test2]
GO

declare @ChunkCounter int
declare @ChunkSize int
set @ChunkCounter = 0
set @ChunkSize = 50000

--hack to do a do-while loop in sql
while 1 = 1
begin
    insert into cvti101639..IDAT_MR_NOTEHISTORY with (tablock)
    SELECT newid(), '00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000000'
    ,'00000000-0000-0000-0000-000000000000',    ISNULL(TargetClientAccountNum, [REC_CLINUM]), ISNULL(TargetPetAccountNum, '     ')
    ,ISNULL(pck_desc, 'Converted …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server clustered-index insert bulk

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

捕获所有使用提示的查询

如何捕获或列出自上次实例重启以来使用提示并已执行的所有查询?

我使用的是 SQL Server 2005 标准版。

sql-server-2005 sql-server

2
推荐指数
2
解决办法
1125
查看次数

如何避免在一系列嵌套的 SELECT 语句中重复信息?

我正在处理一个 SQL 查询,它根据过去的购买(行业是场地票务)将客户历史记录放在一起。报告将是大的,类似于 80-90 列,输出 CSV 中的每个事件或每个记录的事件类别一列。

数据库结构要求我使用嵌套的 select 语句将必要的数据放入每条记录的列中——每列包含该类型事件的票证数量。我在理论上知道如何执行此操作,但是每个嵌入的 select 语句都非常大,以至于完整报告将突破我的数据库界面上的 8,000 个字符限制。这些语句之一如下所示:

(select count (*)
FROM
guest ig, event2 e, eventseat es, "order" o
WHERE ig.guestid = g.guestid
and ig.guestid = o.guestid
and o.orderid = es.orderid
and e.eventid = es.eventid
and e.incometype = 'T'
and e.eventtype in ('SS', 'BMF')
and es.status in ('2','4')
and es.price <> '0.00'
and es.price <> '5.00'
and e.year = '2010'       <-- THESE LINES ARE THE ONLY ONES THAT 
and e.run in ('SS-DANCE') <-- …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server select

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

跟进证书共享问题

跟进帖子在数据库和实例之间共享由密码加密的证书

我创建了一个带密码的证书

CREATE CERTIFICATE testcert
ENCRYPTION BY PASSWORD = 'test123' 
WITH SUBJECT = 'Certificate for stored procedures using dynamic SQL',
START_DATE = '2010-01-01',
EXPIRY_DATE = '2100-01-01'
Run Code Online (Sandbox Code Playgroud)

然后我删除了私钥

ALTER CERTIFICATE testcert REMOVE PRIVATE KEY 
Run Code Online (Sandbox Code Playgroud)

最后,我尝试备份证书

BACKUP CERTIFICATE testcert TO FILE = 'd:\mssql\testcert.cer' 
WITH PRIVATE KEY ( DECRYPTION BY PASSWORD = 'S3creT!' ,
FILE = 'd:\mssql\testcert.pvk' , 
ENCRYPTION BY PASSWORD = 'test123' );
Run Code Online (Sandbox Code Playgroud)

我得到这个错误:

消息 15246,级别 16,状态 1,第 1 行无法转储证书“testcert”的私钥,因为找不到私钥。

自从我删除私钥以来,这似乎很正常。

第一个问题:使用上一篇文章中解释的方法,这是否意味着要备份证书我会使用这个语句?

BACKUP CERTIFICATE testcert TO FILE = 'd:\mssql\testcert.cer' 
Run Code Online (Sandbox Code Playgroud)

第二个问题:您将如何将证书恢复到另一台服务器和数据库?

例子 …

sql-server-2005 sql-server

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

我可以将数据和全文搜索文件移动到另一个驱动器并更改驱动器号吗?

我服务器的 G: 驱动器空间正在迅速耗尽。它主要包含系统和用户数据库的数据文件 (*.mdf)。全文目录也存在于该驱动器上。

IT 添加了更大的 E:驱动器。

我想要:

  • 关闭 SQL Server
  • 将所有内容从 G:\ 复制到 E:\
  • 将 G:\ 驱动器更改为 X:\
  • 将 E:\ 驱动器更改为 G:\
  • 重启

这会导致 SQL Server 出现任何问题吗?在该过程结束时,所有文件都将位于 G:\ 驱动器上;只是不在原来的 G:\ 驱动器上。

sql-server-2005 sql-server

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

解决亲和掩码和 I/O 亲和掩码之间的冲突?

我在我们的一台 SQL Server 机器上执行了这个:

EXEC sp_configure 'show advanced options', 1

然后执行RECONFIGURE。这向我展示了以下错误消息:

指定的关联掩码与指定的 IO 关联掩码冲突。使用 override 选项强制此配置。

通过执行RECONFIGURE WITH OVERRIDE我确实可以强制配置。但这不是解决错误消息中提到的冲突的方法。

中的值sp_configure如下:

name                 minimum        maximum       config_value   run_value
affinity I/O mask    -2147483648    2147483647    126            126
affinity mask        -2147483648    2147483647    126            126
Run Code Online (Sandbox Code Playgroud)

我在这里找到了一些解释,但这基本上只是说“不应该有冲突”,没有关于如何解决它。有知识的人可以向我解释这个错误消息的实际含义以及我应该如何/是否应该尝试解决它?

2012 年 12 月 12 日更新

我们找不到任何理由为冲突的值的设置affinity I/O maskaffinity mask。我将它们改回默认值,两者均为 0。重新配置后affinity mask立即设置为 0,affinity I/O mask显然需要重新启动实例。

sql-server-2005

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

通过插入触发器安全地发送数据库邮件

到目前为止,我已经花了大约 30 个小时努力sp_send_dbmail去上班。我终于得到了一些工作,但我严重怀疑它的安全性。我想知道一种更好但快速且易于设置的方法(此时我的时间受到严重限制),以及“理想”(最佳实践)解决方案。

当前 SQL Server 2005 配置

- `After Insert` Trigger on table executes `sp_send_dbmail`
- Database Mail SMTP Account setup (with successful mail test)
- Database Mail Profile setup (with "Public Profile" ticked)
- "guest" account added to "DatabaseMailUserRole"
Run Code Online (Sandbox Code Playgroud)

我发现这篇文章提出了“正确”的解决方案,我阅读了这篇文章,在那里我发现这是一个非常复杂的解决方案,似乎有太多可能出错的事情,更不用说难以维护了。

我对替代解决方案的想法是这些。

1. Setup an Application Role in msdb (this would be my first time using one
    and not even sure if it IS a solution :P), and use it to ensure that …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server-2005 security database-mail

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

SQLOS 内部 – 调度

使用在 Windows Server 2008 R2 SP1 上运行的 SQL Server 2012 Enterprise Edition SP1 对于 SQLOS 上的每个逻辑处理器核心,都有一个分配给它的调度程序。这些调度程序可以被视为状态“VISIBLE ONLINE”sys.dm_os_schedulers

工作线程(任务)可以在调度程序上运行,并且这些线程(任务)可以具有各种状态,例如基于等待队列

a) 暂停在等待队列中等待资源可用
b) 可运行队列(主要是 FIFO,除非受资源调控器控制)或
c) 当前在调度程序上运行。

我的问题是说例如一个任务(SELECT在这种情况下是查询)首先进入调度程序(我们称之为调度程序 A)但发现它必须等到页面被带入内存(IO 操作)它现在被放入等待队列在挂起状态下,一旦 IO 完成,该特定工作线程(任务)就会发出信号并按到达该队列的顺序放入可运行队列。

任务是否总是必须转到调度程序A来完成其时间片,或者它可以切换其上下文,现在可以在没有可运行任务的任何空闲调度程序(我们称之为调度程序B)上运行?如果有上下文切换,它的作用是什么?

sql-server-2005 sql-server-2008 sql-server-2012

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