我们sys.dm_exec_query_stats用来追踪慢查询和违反 IO 的查询。
这很好用,我们得到了很多非常有见地的统计数据。很明显,这不如运行探查器跟踪准确,因为您不知道 SQL Server 何时决定放弃执行计划。
我们有很多查询缓存了错误的执行计划。例如如下查询:
选择前 30 名
援助
FROM 帖子 a
加入帖子 q ON q.Id = a.ParentId
加入 PostTags pt ON q.Id = pt.PostId
哪里 a.PostTypeId = 2
并且 a.DeletionDate 为 NULL
并且 a.CommunityOwnedDate 为 NULL
AND a.CreationDate > @date
AND LEN(a.Body) > 300
AND pt.Tag = @tag
AND a.Score > 0
按 a.Score DESC 排序
问题是理想计划实际上取决于所选日期(理想计划的屏幕截图):

但是,如果缓存了错误的计划,则当日期范围很大时它会完全窒息:(注意大粗线)

为了克服这个问题,我们建议使用OPTION (OPTIMIZE FOR UNKNOWN)或OPTION (RECOMPILE)
OPTIMIZE FOR UNKNOWN导致一个稍微好一点的计划,这远非最佳。执行在sys.dm_exec_query_stats.
RECOMPILE结果是选择了最佳计划,但是 …
我正在将用户分配给新数据库。与作为 db_owner 角色成员分配登录相比,作为默认 dbo 用户的用户有什么区别?
我们有一些 MS SQL 服务器,它们在同一台服务器上设置了不同的实例以分隔应用程序数据库,还有一些服务器在同一实例上设置了所有数据库,只是用安全设置分开了。
什么时候为 SQL 服务器创建一个新实例并在该实例中安装你的数据库而不是仅仅在同一个实例上创建一个新的数据库并围绕数据库本身设置安全性是可取的?是否有更多的决定只是一个安全方面?
任何有使用 SQL 2008 经验但都在 RAM 中的人?试图使某些事情更快,并且可能会继续这样做,谢谢
我熟悉分离/附加过程。但是我不能让数据库脱机。
有没有办法支持数据库,并最终得到一个可用的 mdf 数据库文件,而无需使其脱机?
是否可以重定向(或创建别名)以便对 SQL 的默认实例的请求重定向到命名实例?
场景是我将 SQL 2008 R2 安装为命名实例MACHINENAME\SQL2008R2并且我有一些我无法更新的脚本试图连接到 sql 的默认实例(通过 Data Source=. 或 Data Source=MACHINENAME)并且我希望它们针对命名实例运行,而不必安装新的默认实例。是否可以?
我正在调试对 SSMS (2012) 中存储过程的调用。经常和代码中的各种随机点,弹出一个对话框:
Microsoft SQL Server Management Studio:
Unable to Step. Invalid Operation.
Run Code Online (Sandbox Code Playgroud)
一旦我关闭对话框,调试似乎可以继续......我可以继续执行代码直到最后,没有任何明显的问题。迄今为止....
我们有一个在单个数据库服务器上使用 SQL Server 2008 的 Web 应用程序。所有存储都是本地的。在过去的一年里,我们一直试图让任何形式的 SQL Server 复制与我们的配置一起工作,但它不会。原因是因为我们有 2,000 多个不断更新的数据库(每个客户端一个),因此我们的测试表明所有形式的复制都过于占用资源。
每次我问这个问题时,人们都会关注我们有太多数据库这一事实。这是无法改变的(出于监管和其他原因),所以我想专注于我们如何复制数据。
我们被告知,一种选择是将所有数据移动到 SAN 并让 SAN 复制数据(或拍摄频繁的快照)。但是,如果我们的数据库服务器出现故障,在这种情况下是否存在数据库损坏的风险?是否可以利用复制到另一个 SAN 的 SAN 来提供合适的 DR 解决方案(在我们的例子中,我们最多可以丢失大约 30 分钟的数据,但我们不能丢失一整天的价值......即我们可以' t 去前一晚的备份)。
我有一个数据库 XYZ,它有一个损坏的日志文件,现在由于日志文件完全无法使用,这导致这个特定的数据库无法使用,我需要能够重建它。
我已经对这个过程进行了大量研究,但我陷入了 dbcc checkdb 的困境。
我运行了命令
alter database xyz SET single_user with immediate rollback
Run Code Online (Sandbox Code Playgroud)
随后
use master
dbcc checkdb('xyz',REPAIR_ALLOW_DATA_LOSS)
Run Code Online (Sandbox Code Playgroud)
但我一直遇到这个错误:
Msg 924, Level 14, State 1, Line 2
Database 'XYZ' is already open and can only have one user at a time.
Run Code Online (Sandbox Code Playgroud)
我研究的所有内容都表明数据库需要处于紧急模式,然后该数据库需要处于单用户模式。如果我将数据库恢复为多用户模式,则表明数据库需要处于单用户模式。好吧,我这样做,然后得到这个问题。
我跑了
select spid from master..sysprocesses where dbid = DB_ID('XYZ') and spid <> @@spid
Run Code Online (Sandbox Code Playgroud)
检查使用数据库的任何进程,但没有返回任何行,并且日志不显示有关正在恢复的数据库或任何此类性质的任何信息。DB 确实显示为“紧急情况”。
有任何想法吗?
我已经尝试重新安装 SQL Server 2014,但在尝试重新安装时仍然收到以下错误消息import-module sqlps。存在相同的注册表项,但附加了 120。我可以使用像Invoke-SqlCmd. 不确定这里是什么问题。任何帮助表示赞赏。
在 x86 窗口中:
PS H:> import-module sqlps -disablenamechecking
Get-ItemProperty : Cannot find path 'HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps' because it does not exist.
At C:\Users\russell_johnson\Documents\WindowsPowerShell\Modules\sqlps\sqlps.psm1:26 char:13
+ $item = Get-ItemProperty $sqlpsreg
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (HKLM:\SOFTWARE...owerShell.sqlps:String) [Get-ItemProperty], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemPropertyCommand
Run Code Online (Sandbox Code Playgroud)
在 x64 窗口中:
PS H:\> import-module sqlps
Get-ItemProperty : Cannot find path 'HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps' because it does …Run Code Online (Sandbox Code Playgroud)