在过去,使用varcharoverchar是一个很大的禁忌,因为varchar与行的其余部分存储在不同的页面上。今天的 SQL Server 2008 是否仍然如此?将 1-3varchar(5)列更改为char(5)表中的列,我会看到任何内存/性能提升吗?
a) 说 2.000.000 行 b) 如果任何varchar列是索引/主键的一部分
我需要在包含数百万行的表中将一列从 NOT NULL 更改为 NULL。我试过一个简单的
alter table Table1 ALTER COLUMN Column1 XML NULL
Run Code Online (Sandbox Code Playgroud)
但它需要永远。所以这里是我的问题:
我有几个工作包,我在 sql server 代理中设置了一个工作。有时我应该一起跑。以给定的顺序运行它们的最佳方法是什么?我有点惊讶 sql server 代理无法将作业作为要执行的作业步骤包含在内。我确实尝试过
我在 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_id、currency_id和transaction_amount都定义为 中的NOT NULL列dbo.transactions。但是,当我查看 Management Studio 的对象资源管理器中的视图定义时,它在视图中将balance_amount和都标记transaction_count为NULL可列。
我查看了几个讨论,这是其中最相关的一个,建议对函数进行一些改组可能有助于 SQL Server 识别视图列始终为NOT NULL. 但是,在我的情况下不可能进行这种改组,因为在索引视图中不允许 …
我在 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) 在我的办公室,我们有一个非常难看的查询,但在生产和开发环境中运行得很好(分别为 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) 在这种情况下,在我正在检查的数据库中,有一个保存用户历史记录的存档表,并且有一个触发器或存储过程在一段时间后从该表中删除行,以避免数据过大同样,我没有设计DB,我只是在维护一个使用这个DB的应用程序,所以我不知道这些存储过程或触发器的名称,我想做的是定位这个存储过程或触发器,检查代码并修改它以在表上保留更长的“用户历史记录”。
有人告诉我检查“sysobjects”表,在那里我实际上可以看到与表同名的东西,但这是我能够检索的唯一信息,有什么建议吗?
谢谢你。
我正在将存储过程从 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 中的等效列或找到登录密码上次更改日期的解决方法?
我们正在构建一个最初为 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 日志充满了以下消息:
在队列 '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 ×10
sql-server ×4
backup ×1
constraint ×1
logins ×1
null ×1
sybase ×1
trigger ×1
view ×1