我有一个非常简单的查询,它在活动监视器和其他统计信息中显示为在我的整个数据库服务器上具有最多的逻辑读取。
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 嗅探器,在那里我可以实时观察对我的数据库运行的 SQL 命令?
如果它是免费的,那就太好了。
在 Sql Server (2008) 中,是否可以PRIMARY KEY在一组列上有一个而没有同一组列上的任何一个CLUSTERED或NONCLUSTERED索引?
我知道PRIMARY KEY和CLUSTERED 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在没有CLUSTERED或NONCLUSTERED索引的表上创建。
我有一个 SQL Server 实例RPT1(2008 R2),它是为“高级用户”设置的,可以运行他们自己的查询。此服务器链接到我们的生产报告服务器PRD1(SQL Server 2008 实例),具有直接RPT1查询链接服务器 ( PRD1) 的视图 (on ) 。
已使用需要在服务器上进行 CRUD 的帐户创建链接服务器(用于报告审核等)。
随着用户的成熟,他们也会请求更大的权限(例如创建自己的视图)。我想确保他们不会在链接的服务器上执行任何 CRUD 操作,但链接的帐户具有这些权限。
我看到的第一个解析路径是创建一个不同的用户,权限较低,然后重新链接服务器。
我的第二条路径是查看是否有办法DENY在PRD1服务器上为来自链接服务器的连接显式CRUD 。
是否可以仅从链接中明确拒绝 CRUD?或者我应该简单地将服务器与不同的帐户重新链接?我忽略了另一个明显的解决方案吗?
sql-server-2008 sql-server permissions sql-server-2008-r2 linked-server
我有两台机器,每台机器都安装了 SQL Server 2008 的默认实例;每个都表现出不同的行为。
sqlcmd -Lc,当 SQL 浏览器服务未运行时,我在本地网络上的 SQL 服务器列表中看不到 PC1。当我启动 SQL 浏览器服务时,PC1 出现在列表中。sqlcmd -Lc,无论 SQL Browser 服务是否正在运行,我都会在列表中看到 PC2。如果 SQL Browser 服务正在运行,我还会看到 PC2\SQLEXPRESS。为什么 PC1 的默认 SQL 实例没有显示在 SQL Server 列表中?
我们有一个 SQL Server R2 网络版数据库,它基于 Windows Server 2008 R2,具有强大的 CPU 和 32GB RAM DDR3。
我们的数据库工作非常努力(我们在 1 分钟内运行了大约 600,000 个查询)并且它的 CPU 变得疯狂(25% 到 90%)。
我正在处理缓慢的查询,找到了一些,修复了它们,其他一些我只是取消以检查它是否有帮助,但它没有,CPU 仍然很高。
我想知道还能是什么?我不是 DBA,但我和一个非常有经验的人一起工作,他创建了所有索引并重新配置了 DB,但是 CPU 仍然很高,而且这个 DBA(有 20 多年的经验)有点像绝望,真的不知道如何找到问题。
我想知道,这可能是缓存问题吗?像这样的查询没有缓存?
有谁知道它可以是什么?我们能做什么?我们如何调查?
也许它只是大量的查询?
我很想得到你能提供的每一个小信息!
我们都知道每个表只能有一个集群视图,很酷。但显然,即使使用聚集索引,叶上也没有计算列的值,并且每次都会计算它们。
所以,我的第一个问题是,我刚才所说的是否正确?
另外,如果你创建一个聚集索引,好吧,让我引用......
“如果你在一个计算列上创建一个聚集索引,列的值将物理存在于相应的表行中,因为聚集索引的叶页包含数据行。”
是的,好的,但为什么只在计算列上创建聚集索引?我想如果你在任何列上创建一个聚集索引,那么叶上存在数据吗?
那么,我的问题 2 是如果我们仅在该特定列上创建聚集索引,计算列的值是否会存在(持久)在表中?(问题 2 继续)如果确实如此,如果我们有多个计算列怎么办?当然,我们不能创建多个聚集索引,那么我们如何使它们的值持久化?
现在继续,覆盖指数怎么样?首先,我们在创建聚集索引时并不真的需要覆盖(或者我们不能真正创建)覆盖索引,因为所有数据都已经在叶子上,对吗?那么,包括任何其他列没有意义吗?
那么,第三,我想问一下,我刚才在之前的发言中所说的是否正确?
现在,如果我们正在创建一个覆盖索引(非聚集,对吗?)并且我们包含计算列,那么我们会保留它们吗?它们会被“物理存储”还是再次计算?(顺便说一下,这是我的第四个问题。)
最后,(第 5 个问题)如果我们可以通过所有这些方式(或其中一些方式,我真的不知道是哪一种,这就是我首先提出这个问题的原因!)那么,最好的方法是什么,为什么?
ps:如果我只问了一次 5 个问题,我很抱歉,但它们都非常相关,我不想在 5 个不同的问题中一遍又一遍地问同样的问题。我希望你明白!:)
编辑:很好地回应评论,现在我正在使用 SQL Server 2008,但是如果您能提供如果使用其他任何东西(我的 sql 或其他任何东西),情况会如何不同,这不仅对我而且对社区都有好处. :)
有没有办法阻止开发人员创建使用游标的新用户定义函数?可以读取UDF代码的数据库触发器可以吗?
我有 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)
移动列被添加到表的末尾。
有没有办法在不删除表并将数据移动到新表的情况下实现这一目标?
我使用查询来找出数据库文件的大小。我正在使用系统视图和 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-2008 ×10
sql-server ×6
index ×2
alter-table ×1
ddl ×1
functions ×1
performance ×1
permissions ×1
sqlcmd ×1
t-sql ×1