标签: sql-server-2008

在 SQL Server 2008 中使用 varchar 的速度影响

在过去,使用varcharoverchar是一个很大的禁忌,因为varchar与行的其余部分存储在不同的页面上。今天的 SQL Server 2008 是否仍然如此?将 1-3varchar(5)列更改为char(5)表中的列,我会看到任何内存/性能提升吗?

a) 说 2.000.000 行 b) 如果任何varchar列是索引/主键的一部分

sql-server-2008 sql-server

9
推荐指数
1
解决办法
953
查看次数

在具有数百万行的表中更改列定义的最有效方法是什么

我需要在包含数百万行的表中将一列从 NOT NULL 更改为 NULL。我试过一个简单的

alter table Table1 ALTER COLUMN Column1 XML NULL
Run Code Online (Sandbox Code Playgroud)

但它需要永远。所以这里是我的问题:

  1. 为什么应用更改需要这么长时间?
  2. 有没有更好的方法来做到这一点?

sql-server-2008 database-design

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

链接 SQL Server 代理作业

我有几个工作包,我在 sql server 代理中设置了一个工作。有时我应该一起跑。以给定的顺序运行它们的最佳方法是什么?我有点惊讶 sql server 代理无法将作业作为要执行的作业步骤包含在内。我确实尝试过

sql-server-2008

9
推荐指数
3
解决办法
7515
查看次数

如何帮助 SQL Server 识别我的索引视图列不能为 NULL?

我在 SQL Server 2008 中定义了以下索引视图(您可以从 gist下载工作架构以进行测试):

CREATE VIEW dbo.balances
WITH SCHEMABINDING
AS
SELECT
      user_id
    , currency_id

    , SUM(transaction_amount)   AS balance_amount
    , COUNT_BIG(*)              AS transaction_count
FROM dbo.transactions
GROUP BY
      user_id
    , currency_id
;
GO

CREATE UNIQUE CLUSTERED INDEX UQ_balances_user_id_currency_id
ON dbo.balances (
      user_id
    , currency_id
);
GO
Run Code Online (Sandbox Code Playgroud)

user_idcurrency_idtransaction_amount都定义为 中的NOT NULLdbo.transactions。但是,当我查看 Management Studio 的对象资源管理器中的视图定义时,它在视图中将balance_amount和都标记transaction_countNULL可列。

我查看了几个讨论,是其中最相关的一个,建议对函数进行一些改组可能有助于 SQL Server 识别视图列始终为NOT NULL. 但是,在我的情况下不可能进行这种改组,因为在索引视图中不允许 …

sql-server-2008 null constraint view

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

尽管总是说作业成功,但计划备份任务并不总是备份所有数据库

我在 SQL 2008 中有一份工作,它运行一个存储过程来备份所有数据库。这通过 sql server 代理作业每天运行。

它每天都成功退出,但有时只有在备份了几个数据库后才成功退出。每次可以是不同数量的数据库。大多数情况下,它会成功备份所有数据库,但有时会成功备份 2 次,有时会成功备份 5 次,等等。

我在作业历史记录、事件查看器或 sql server 日志中没有看到任何错误。

备份是在本地磁盘上进行的,尽管该文件夹是可扩展存储卷上文件夹的“连接点”。

操作系统是 Windows 2003 64 位运行 Sql Server 2008 网络版 64 位作为在 Vmware ESXi 5 主机上运行的虚拟机。

存储过程:

ALTER PROCEDURE [dbo].[backup_all_databases] 
@path VARCHAR(255)='c:\backups\'

AS

DECLARE @name VARCHAR(50) -- database name  
DECLARE @fileName VARCHAR(256) -- filename for backup  
DECLARE @fileDate VARCHAR(20) -- used for file name 
DECLARE @dbIsReadOnly sql_variant -- is database read_only?
DECLARE @dbIsOffline sql_variant -- is database offline?

DECLARE db_cursor CURSOR FOR  
SELECT name …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server backup

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

查询在 SQL 2005 与 SQL 2008R2 上的运行方式不同

在我的办公室,我们有一个非常难看的查询,但在生产和开发环境中运行得很好(分别为 20 秒和 4 秒)。然而,在我们的测试环境中,它需要 4 小时以上。SQL2005(+最新补丁)正在生产和开发中运行。SQL2008R2 正在测试中运行。

我查看了查询计划,它表明 SQL2008R2 正在使用 TempDB,通过表假脱机(懒惰假脱机)来存储从链接服务器返回的行。下一步是显示嵌套循环(左反半连接)占用了 96.3% 的查询。两个运营商之间的界限是 5,398MB!

SQL 2005 的查询计划显示没有使用 tempdb,也没有使用 Left Anti Semi Join。

下面是经过消毒的代码和执行计划,上面是 2005 计划,下面是 2008R2。

是什么导致了急剧放缓和变化?我期待看到不同的执行计划,所以这不会打扰我。查询时间的显着减慢让我感到困扰。

我是否必须查看底层硬件,因为2008R2版本使用的是tempdb,我必须看看如何优化它的使用?

有没有更好的方法来编写查询?

谢谢您的帮助。

    INSERT INTO Table1_GroupLock (iGroupID, dLockedDate)
SELECT 
 Table1.iGroupID,
 GETDATE()
FROM Table1
WHERE 
 NOT EXISTS (
  SELECT 1
  FROM LinkedServer.Database.Table2 Alias2
  WHERE 
   (
    Alias2.FirstName + Alias2.LastName = dbo.fnRemoveNonLetter(Table1.FullName)
    AND NOT dbo.fnRemoveNonLetter(Table1.FullName) IS NULL
    AND NOT Alias2.FirstName IS NULL 
    AND NOT Alias2.LastName  IS NULL
   ) OR (
    Alias2.FamilyName = dbo.fnRemoveNonLetter(Table1.FamilyName)
    AND Alias2.Child1Name …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server-2008

9
推荐指数
3
解决办法
4079
查看次数

如何知道哪个存储过程或触发器正在使用 SQL Server 2008 R2 上的表?

在这种情况下,在我正在检查的数据库中,有一个保存用户历史记录的存档表,并且有一个触发器或存储过程在一段时间后从该表中删除行,以避免数据过大同样,我没有设计DB,我只是在维护一个使用这个DB的应用程序,所以我不知道这些存储过程或触发器的名称,我想做的是定位这个存储过程或触发器,检查代码并修改它以在表上保留更长的“用户历史记录”。

有人告诉我检查“sysobjects”表,在那里我实际上可以看到与表同名的东西,但这是我能够检索的唯一信息,有什么建议吗?

谢谢你。

trigger sql-server-2008 stored-procedures

9
推荐指数
1
解决办法
6775
查看次数

如何在 SQL Server 2008 中找到上次更改登录密码的日期?

我正在将存储过程从 Sybase 15 移植到 SQL Server 2008。

在 Sybase 中,此语句通过向 syslogins.pwdate(密码上次更改的日期)添加天数来计算到期日期,并且工作正常:

SELECT @l_pwd_date = dateadd( day, @l_pwd_max_expire, pwdate)
FROM master.dbo.syslogins
WHERE name = @v_user
Run Code Online (Sandbox Code Playgroud)

...但是在 SQL Server 2008 中尝试编译时抛出此错误:

消息 207,级别 16,状态 1,第 21 行无效的列名“pwdate”。

syslogins 在 SQL Server 2008 中不再包含该列 pwdate。

有谁知道我在哪里可以找到 SQL Server 2008 中的等效列或找到登录密码上次更改日期的解决方法?

sql-server-2008 sybase

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

什么时候应该删除和重新创建索引?

我们正在构建一个最初为 1 TB 的数据仓库,并将每月增长约 20gigs。

对于某些表,我们每天都在执行 ETL 过程,而对于其他表,我们每周/每月执行一次。

当有数据导入到表中时,是否需要删除并重新创建索引?

是否有必要删除和重新创建索引,或者它们是否会自动更新?

统计信息设置为自动更新。

非常感谢您的帮助和指导。

我得到了这个天才脚本:

SELECT 'ALTER INDEX [' + ix.name + '] ON [' + s.name + '].[' + t.name + '] ' +
       CASE WHEN ps.avg_fragmentation_in_percent > 40 THEN 'REBUILD' ELSE 'REORGANIZE' END +
       CASE WHEN pc.partition_count > 1 THEN ' PARTITION = ' + cast(ps.partition_number as nvarchar(max)) ELSE '' END
FROM   sys.indexes AS ix INNER JOIN sys.tables t
           ON t.object_id = ix.object_id
       INNER JOIN sys.schemas s
           ON t.schema_id = …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 data-warehouse sql-server

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

什么会导致孤立的##MS_PolicyEventProcessingLogin##?

今天早上我注意到我的 SQL 日志充满了以下消息:

在队列 'msdb.dbo.syspolicy_event_queue' 上运行的激活过程 '[dbo].[sp_syspolicy_events_reader]' 输出以下内容:
'无法作为数据库主体执行,因为主体“##MS_PolicyEventProcessingLogin##”不存在,这种类型的主体不能被冒充,或者您没有权限。

运行以下EXEC sp_change_users_login 'report'显示登录实际上已被孤立。

我能够按照此 MSDN 帖子中的建议运行以下命令来修复它。

EXEC sp_change_users_login 
    'Auto_Fix', '##MS_PolicyEventProcessingLogin##', 
    NULL, 'fakepassword'
Run Code Online (Sandbox Code Playgroud)

但问题仍然存在:究竟是什么原因导致这位校长成为孤儿?谷歌搜索和研究表明其他人也有这个问题,但我还没有找到原因的描述。在错误开始出现的那一刻,我没有注意到任何值得注意的事情。

去年夏天,我们将整个服务器迁移到 SAN 存储模型,在迁移期间我们恢复了所有内容(包括 msdb),但那是几个月前的事情。只是最近的事情才使症状明显,因为它没有出现在几周前的日志中。

sql-server-2008 sql-server logins

9
推荐指数
1
解决办法
9794
查看次数