我有点像一个新的 DBA,我正在管理一个具有大量活动的 SQL Server 2012 实例。我在完全恢复模式下运行,因为我们需要时间点恢复。
现在,我每天凌晨 5 点对数据库和日志进行完整备份。一些日志文件已经膨胀到 300gb,即使在进行备份后,它们的大小也不会减小。我可以通过运行类似于以下内容的内容来减小它们的大小:
BACKUP LOG db1 TO DISK = '\\server\share\db1_log1.trn';
DBCC ShrinkFile([db1_log], 0);
BACKUP LOG db1 TO DISK = '\\server\share\db1_log2.trn';
DBCC ShrinkFile([db1_log], 0);
BACKUP LOG db1 TO DISK = '\\server\share\db1_log3.trn';
DBCC ShrinkFile([db1_log], 0);
Run Code Online (Sandbox Code Playgroud)
当我检查备份文件的 LSN 时,我看到如下内容:
RESTORE headeronly FROM DISK = N'\\server\share\db1_log1.trn'
FirstLSN: 15781000014686200001
SecondLSN: 15802000000665000001
RESTORE headeronly FROM DISK = N'\\server\share\db1_log2.trn'
FirstLSN: 15802000000665000001
SecondLSN: 15805000000004100001
RESTORE headeronly FROM DISK = N'\\server\share\db1_log3.trn'
FirstLSN: 15805000000004100001
SecondLSN: 15808000000004200001
Run Code Online (Sandbox Code Playgroud)
我不相信我通过缩小日志文件来破坏我的日志链。读到这里,我确实相信我正在损害我的性能,因为那些缩小的日志文件必须重新增长自己。
问题:
有没有办法找出 SQL Server 2008 R2 中缓存的内容?我发现了以下不错的文章:http : //blog.sqlauthority.com/2010/06/17/sql-server-data-pages-in-buffer-pool-data-stored-in-memory-cache。但是,我想知道每个表和索引存储了多少数据(例如百分比和 KB)。有没有一些简单的方法来获取这些数据?
有人可以帮我解决这些问题吗?
BULK INSERT DATABESE01.dbo.TABLE01
FROM '\\COMPUTER01\FOLDER01\TextFile.txt'
WITH
(
FIELDTERMINATOR = ' ',
rowterminator = '\n',
tablock
)
Run Code Online (Sandbox Code Playgroud)
错误显示,无法打开:
无法批量插入,因为无法打开文件“\SERVERNAME\FOLDERNAME\textFile.txt”。操作系统错误代码 5(访问被拒绝。)
该路径位于网络上的另一台计算机上。
我有一个来自 DBA 对我的一个数据库所做的跟踪的 .trc 文件。我的 PC 上没有安装 SQL 分析器工具,因此无法查看内容和分析跟踪日志。如何在我的 PC 上未安装 SQL 分析器的情况下读取此文件?
您必须原谅我的天真,因为我不是 DBA,但我的理解是,随着时间的推移,必须重新编译数据库更改和存储过程的统计信息,以使查询计划与最新的统计信息保持同步。
假设我在我的数据库中的存储过程,在对重新编译的最新统计一些固定的间隔,是什么在衬里的存储过程的代码,并在包裹它的含义sp_executesql的语句?我是否会丢失过去作为过程重新编译的一部分发生的查询计划的刷新?
如果在进行此更改之前我需要考虑其他任何事项(权限除外),那么我将不胜感激。
我在 MSDN 上读到这个:
SQL Server 查询优化器将新的 Transact-SQL 字符串与现有执行计划相匹配的能力受到字符串文本中不断变化的参数值的阻碍,尤其是在复杂的 Transact-SQL 语句中。
因此,假设我尝试内联和换行的存储过程sp_executesql确实包含一些参数,这是否是说虽然我的执行计划已缓存,但我让 SQL Server 更难找到和重用它?
以下面的代码示例为例:
SELECT MaritalStatus,
COUNT(*) AS CountResult
COUNT(*) OVER() AS CountOverResult
FROM (schema).(table)
GROUP BY Marital Status
Run Code Online (Sandbox Code Playgroud)
COUNT(*) 返回所有行忽略空值对吗?
有什么作用COUNT(*) OVER()?
这个问题是在练习考试中出现的,所以我没有要查询的数据。我一直在使用 Adventure Works 和这个网站http://www.sqlishard.com/Exercise来练习。
如果我输入一个查询
SELECT ID, COUNT(*) AS 'COUNT(*)' , COUNT(*) OVER() AS 'COUNT(*) OVER()'
FROM Customers
GROUP BY ID
Run Code Online (Sandbox Code Playgroud)
进入练习站点,我得到 3794 行返回,其中一Count(*)列是 1,一Count(*) Over()列是总行数。我不明白这个模式(对不起)所以我来到了这里。
我正在尝试为员工时间记录完成一些报告。
我们有两个专门针对这个问题的表格。员工列在Members表中,他们每天输入他们已完成工作的时间条目并存储在Time_Entry表中。
使用 SQL Fiddle 的示例设置:http ://sqlfiddle.com/#!3/e3806/7
最终的结果我要的是一个表,表示所有的Members列中的列表,然后将展示他们的总和小时,在其他列查询的日期。
问题似乎是,如果Time_Entry表中没有特定成员的行,那么该成员现在有行。我尝试了几种不同的连接类型(左、右、内、外、全外等),但似乎都没有给我想要的,这将是(基于 SQL Fiddle 中的最后一个示例):
/*** Desired End Result ***/
Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL
ADavis | 0 | 11-10-2013 | 0 | 0
BTronton | 0 | 11-10-2013 | 0 | 0
CJones | 0 | 11-10-2013 | 0 | 0
DSmith | 0 | 11-10-2013 | 0 | 0
EGirsch | 1 | 11-10-2013 | 0.92 …Run Code Online (Sandbox Code Playgroud) 我已经从这里下载了基于 AdventureWorks 的内存示例,并遵循了随附文档中描述的所有步骤。但是,当我尝试在 SQL Server Management Studio 中运行脚本时,我收到错误消息:
多语句事务中不允许使用 ALTER DATABASE 语句
错误指向第 9 行,即:
IF NOT EXISTS (SELECT * FROM sys.data_spaces WHERE type='FX')
ALTER DATABASE CURRENT ADD FILEGROUP [AdventureWorks2012_mod]
CONTAINS MEMORY_OPTIMIZED_DATA
GO
Run Code Online (Sandbox Code Playgroud)
由于这是(或多或少)微软官方文档,我假设这是我做错的事情,但我无法弄清楚它是什么。
今天,我试图在现有数据库上恢复数据库,我只需在 SSMS --> 任务 --> 脱机中右键单击该数据库,以便我可以恢复数据库。
一个小的弹出窗口出现并显示Query Executing.....了一段时间,然后抛出一个错误说Database is in use cannot take it offline。我从中收集了一些与该数据库的活动连接,因此我尝试执行以下查询
USE master
GO
ALTER DATABASE My_DatabaseName
SET OFFLINE WITH ROLLBACK IMMEDIATE
GO
Run Code Online (Sandbox Code Playgroud)
再次在这一点上 SSMS 显示Query Executing.....了一段时间,然后抛出以下错误:
Msg 5061, Level 16, State 1, Line 1
ALTER DATABASE failed because a lock could not be placed on database 'My_DatabaseName'. Try again later.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.
Run Code Online (Sandbox Code Playgroud)
在此之后,我无法通过 SSMS 连接到数据库。当我尝试使用 SSMS 将其离线时,它抛出了一个错误:
Database is …Run Code Online (Sandbox Code Playgroud) 我正在解决一个死锁问题,同时我注意到当我在 id 字段上使用聚集和非聚集索引时,锁定行为是不同的。如果将聚集索引或主键应用于 id 字段,则死锁问题似乎已解决。
我有不同的事务对不同的行进行一次或多次更新,例如事务 A 只会更新 ID=a 的行,tx B 只会接触 ID=b 的行等。
而且我了解到,如果没有索引,更新将获取所有行的更新锁,并在必要时转换为排他锁,这最终会导致死锁。但是我没有找到为什么使用非聚集索引,死锁仍然存在(虽然命中率似乎下降了)
数据表:
CREATE TABLE [dbo].[user](
[id] [int] IDENTITY(1,1) NOT NULL,
[userName] [nvarchar](255) NULL,
[name] [nvarchar](255) NULL,
[phone] [nvarchar](255) NULL,
[password] [nvarchar](255) NULL,
[ip] [nvarchar](30) NULL,
[email] [nvarchar](255) NULL,
[pubDate] [datetime] NULL,
[todoOrder] [text] NULL
)
Run Code Online (Sandbox Code Playgroud)
死锁跟踪
deadlock-list
deadlock victim=process4152ca8
process-list
process id=process4152ca8 taskpriority=0 logused=0 waitresource=RID: 5:1:388:29 waittime=3308 ownerId=252354 transactionname=user_transaction lasttranstarted=2014-04-11T00:15:30.947 XDES=0xb0bf180 lockMode=U schedulerid=3 kpid=11392 status=suspended spid=57 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2014-04-11T00:15:30.953 lastbatchcompleted=2014-04-11T00:15:30.950 lastattention=1900-01-01T00:00:00.950 clientapp=.Net SqlClient Data …Run Code Online (Sandbox Code Playgroud)