标签: sql-server-2008

为什么有这么多逻辑读?

我有一个非常简单的查询,它在活动监视器和其他统计信息中显示为在我的整个数据库服务器上具有最多的逻辑读取。

SELECT MAX(RESULT_DATE) FROM TABLEX mm WITH (NOLOCK) 
JOIN TABLEX_RESULTS mr WITH (NOLOCK) on mr.ID = mm.ID 
WHERE DAYS IS NOT NULL AND mm.ORDER_ID = 12345
Run Code Online (Sandbox Code Playgroud)

TABLEX 大约有 2800 万行

TABLEX_RESULTS 大约有 600 万行

我可以在这里做什么来减少此查询的逻辑读取次数?我对如此简单的查询如何拥有如此大量的逻辑读取感到困惑。

谢谢

索引定义(来自评论)

tableX 
IndexName                    PK     Type    Key1            Key2
IDX_MP_MEDS                  0      B AA    ORDER_ID        MEDPASS_DATE
IDX_MP_MEDS_ID_AND_ORDER_ID  0      B A     MEDPASS_DATE    
IX_MP_MEDS_ROOT_ORDER_ID     0      B DA    ROOT_ORDER_ID   MEDPASS_DATE
PK_MP_MED PK                 1      C A     MEDPASS_MEDS_ID 

tablex_resulsts
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

一个好的 SQL 嗅探器

谁能告诉我一个好的 SQL 嗅探器,在那里我可以实时观察对我的数据库运行的 SQL 命令?

如果它是免费的,那就太好了。

sql-server-2008 sql-server

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

在 SQL Server 中,是否可以在同一个键上没有 CLUSTERED 或 NONCLUSTERED 索引的表上有一个 PRIMARY KEY?

在 Sql Server (2008) 中,是否可以PRIMARY KEY在一组列上有一个而没有同一组列上的任何一个CLUSTEREDNONCLUSTERED索引?

我知道PRIMARY KEYCLUSTERED INDEXkey 是不同的概念,我们可以在PRIMARY KEY没有CLUSTERED INDEX它的情况下创建(见下文)。

ALTER TABLE dbo.Sample 
ADD CONSTRAINT PK_Sample_SeqGUID_Col1 PRIMARY KEY NONCLUSTERED (SeqGUID_Col1)
Run Code Online (Sandbox Code Playgroud)

但我的问题是看看是否可以PRIMARY KEY在没有CLUSTEREDNONCLUSTERED索引的表上创建。

index sql-server-2008 clustered-index clustered-primary-key

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

有没有办法拒绝对来自链接服务器的连接进行 CRUD 操作?

我有一个 SQL Server 实例RPT1(2008 R2),它是为“高级用户”设置的,可以运行他们自己的查询。此服务器链接到我们的生产报告服务器PRD1(SQL Server 2008 实例),具有直接RPT1查询链接服务器 ( PRD1) 的视图 (on ) 。

已使用需要在服务器上进行 CRUD 的帐户创建链接服务器(用于报告审核等)。

随着用户的成熟,他们也会请求更大的权限(例如创建自己的视图)。我想确保他们不会在链接的服务器上执行任何 CRUD 操作,但链接的帐户具有这些权限。

我看到的第一个解析路径是创建一个不同的用户,权限较低,然后重新链接服务器。

我的第二条路径是查看是否有办法DENYPRD1服务器上为来自链接服务器的连接显式CRUD 。

是否可以仅从链接中明确拒绝 CRUD?或者我应该简单地将服务器与不同的帐户重新链接?我忽略了另一个明显的解决方案吗?

sql-server-2008 sql-server permissions sql-server-2008-r2 linked-server

7
推荐指数
1
解决办法
757
查看次数

为什么 sqlcmd -Lc 不显示本地实例?

我有两台机器,每台机器都安装了 SQL Server 2008 的默认实例;每个都表现出不同的行为。

  • 在 PC1 上,当我运行 时sqlcmd -Lc,当 SQL 浏览器服务未运行时,我在本地网络上的 SQL 服务器列表中看不到 PC1。当我启动 SQL 浏览器服务时,PC1 出现在列表中。
  • 在 PC2 上,当我运行时sqlcmd -Lc,无论 SQL Browser 服务是否正在运行,我都会在列表中看到 PC2。如果 SQL Browser 服务正在运行,我还会看到 PC2\SQLEXPRESS。

为什么 PC1 的默认 SQL 实例没有显示在 SQL Server 列表中?

sql-server-2008 sql-server sqlcmd

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

SQL Server 2008 R2 高 CPU

我们有一个 SQL Server R2 网络版数据库,它基于 Windows Server 2008 R2,具有强大的 CPU 和 32GB RAM DDR3。

我们的数据库工作非常努力(我们在 1 分钟内运行了大约 600,000 个查询)并且它的 CPU 变得疯狂(25% 到 90%)。

我正在处理缓慢的查询,找到了一些,修复了它们,其他一些我只是取消以检查它是否有帮助,但它没有,CPU 仍然很高。

我想知道还能是什么?我不是 DBA,但我和一个非常有经验的人一起工作,他创建了所有索引并重新配置了 DB,但是 CPU 仍然很高,而且这个 DBA(有 20 多年的经验)有点像绝望,真的不知道如何找到问题。

我想知道,这可能是缓存问题吗?像这样的查询没有缓存?

有谁知道它可以是什么?我们能做什么?我们如何调查?

也许它只是大量的查询?

我很想得到你能提供的每一个小信息!

performance sql-server-2008 sql-server

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

计算列、索引、聚集索引和覆盖索引?

我们都知道每个表只能有一个集群视图,很酷。但显然,即使使用聚集索引,叶上也没有计算列的值,并且每次都会计算它们。
所以,我的第一个问题是,我刚才所说的是否正确?

另外,如果你创建一个聚集索引,好吧,让我引用......
“如果你在一个计算列上创建一个聚集索引,列的值将物理存在于相应的表行中,因为聚集索引的叶页包含数据行。”
是的,好的,但为什么只在计算列上创建聚集索引?我想如果你在任何列上创建一个聚集索引,那么叶上存在数据吗?
那么,我的问题 2 是如果我们仅在该特定列上创建聚集索引,计算列的值是否会存在(持久)在表中?(问题 2 继续)如果确实如此,如果我们有多个计算列怎么办?当然,我们不能创建多个聚集索引,那么我们如何使它们的值持久化?

现在继续,覆盖指数怎么样?首先,我们在创建聚集索引时并不真的需要覆盖(或者我们不能真正创建)覆盖索引,因为所有数据都已经在叶子上,对吗?那么,包括任何其他列没有意义吗?
那么,第三,我想问一下,我刚才在之前的发言中所说的是否正确?

现在,如果我们正在创建一个覆盖索引(非聚集,对吗?)并且我们包含计算列,那么我们会保留它们吗?它们会被“物理存储”还是再次计算?(顺便说一下,这是我的第四个问题。)

最后,(第 5 个问题)如果我们可以通过所有这些方式(或其中一些方式,我真的不知道是哪一种,这就是我首先提出这个问题的原因!)那么,最好的方法是什么,为什么?

ps:如果我只问了一次 5 个问题,我很抱歉,但它们都非常相关,我不想在 5 个不同的问题中一遍又一遍地问同样的问题。我希望你明白!:)

编辑:很好地回应评论,现在我正在使用 SQL Server 2008,但是如果您能提供如果使用其他任何东西(我的 sql 或其他任何东西),情况会如何不同,这不仅对我而且对社区都有好处. :)

index sql-server-2008

7
推荐指数
1
解决办法
1379
查看次数

禁止包含游标的新 UDF

有没有办法阻止开发人员创建使用游标的新用户定义函数?可以读取UDF代码的数据库触发器可以吗?

sql-server-2008 sql-server ddl functions

7
推荐指数
1
解决办法
223
查看次数

添加一个新列并定义其在表格中的位置

我有 5 列的表 A:

TableA
--
Name
Tel
Email
Address
Run Code Online (Sandbox Code Playgroud)

我想在电话和电子邮件之间添加一个新列(移动):

TableA
--
Name
Tel
Mobile
Email
Address
Run Code Online (Sandbox Code Playgroud)

如果我使用

ALTER TABLE TableA
ADD COLUMN Mobile INT NOT NULL
Run Code Online (Sandbox Code Playgroud)

移动列被添加到表的末尾。

有没有办法在不删除表并将数据移动到新表的情况下实现这一目标?

sql-server-2008 database-design t-sql alter-table

7
推荐指数
1
解决办法
5万
查看次数

sys.master_files 和 sys.dm_io_virtual_file_stats 中的数据库文件大小不同

我使用查询来找出数据库文件的大小。我正在使用系统视图和 DMV,因为我确实想找出实际文件大小和理论(在稀疏文件的情况下)文件大小。

Select 
    DB_NAME(mf.database_id) AS [Database Name], 
    mf.Name,  
    mf.physical_name PhysicalName,
    cast(mf.size as bigint) * 8192 mfSize_bytes, 
    fs.size_on_disk_bytes fsSize_bytes
From sys.master_files mf
    Left Join sys.dm_io_virtual_file_stats(DEFAULT, DEFAULT) fs 
        On mf.database_id = fs.database_id and mf.file_id = fs.file_id
Order By DB_NAME(mf.database_id)
Run Code Online (Sandbox Code Playgroud)

我很困惑 - 将两个值都转换为“字节”,然后比较它们。但是在我检查的所有实例中,temdb 文件大小(来自 sys.master_files)都小于磁盘上的文件大小(来自 sys.dm_io_virtual_file_stats)。

在所有其他情况下,如果存在差异,那么这是正确的(磁盘上的大小实际上小于文件大小 - 因为它们是稀疏文件)。

这种差异的原因是什么?

更新:当我查询时

Select is_sparse, * From sys.database_files 
Run Code Online (Sandbox Code Playgroud)

在 SQL Server 2005 数据库快照上,则列 is_sparse = 0(因为它显示的是原始数据库中的文件的属性,而不是快照文件。所以-文档中有错误吗?)。

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

7
推荐指数
1
解决办法
6091
查看次数