AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-6040

Jānis's questions

Martin Hope
Jānis
Asked: 2015-07-29 23:09:08 +0800 CST

SET STATISTICS IO-工作表/工作文件

  • 31

我正在执行查询,它产生计划: 在此处输入图像描述

统计 IO:

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 128, logical reads 5952, physical reads 576, read-ahead reads 6080, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Table1'. Scan count 9, logical reads 90450, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

所以,一些问题

1. 为什么 Statistics IO 显示比 Profiler 更高的读取?.

至于KB314648,如果 Profiler 报告的数字高于 Statistics IO,则可以。但是 Profiler 92283在描述的查询中显示读取,相同的执行。这是否意味着 Profiler 不计算工作文件/工作表读取?

2.“工作表”和“工作文件”有什么区别

我发现:

  • 工作文件可用于存储散列连接和散列聚合的临时结果。
  • 工作表可用于存储查询假脱机、lob 变量、XML 变量和游标的临时结果。

它们之间有一些物理差异吗?

3.为什么在这种特殊情况下会有“工作台”?

如果有 0 个逻辑读取,为什么我还有工作台?它包含在统计 IO 中只是因为可能需要它(以防估计错误)?

在technet上找到的描述似乎含糊不清..

4. Workfile 上的“Physical reads”是什么意思?

这是否意味着没有足够的内存可供查询,因此必须在查询执行时将数据写入磁盘(哈希匹配出现黄色警告)?我是否可以假设每当我在 Statistics IO 中看到具有物理读取的工作表/工作文件时,没有足够的内存用于查询,并且查询的一些中间结果必须写入 tempdb 磁盘?每当我只看到逻辑读取时,就会使用 RAM?

5. 一个“工作文件”是指一个用于一个目的的表吗?

如果有多个工作文件/工作表,那么我不知道它用于什么操作?

sql-server sql-server-2012
  • 1 个回答
  • 13520 Views
Martin Hope
Jānis
Asked: 2015-07-04 00:30:40 +0800 CST

SARG 基数估计,为什么不全扫描?

  • 11

为什么没有全扫描(在 SQL 2008 R2 和 2012 上)?

测试数据:

DROP TABLE dbo.TestTable
GO  
CREATE TABLE dbo.TestTable
(
   TestTableID INT IDENTITY PRIMARY KEY,
   VeryRandomText VarChar(50),
   VeryRandomText2 VarChar(50)
)
Go
Set NoCount ON
Declare @i int
Set @i = 0
While @i < 10000
Begin
   Insert Into dbo.TestTable(VeryRandomText, VeryRandomText2)
      Values(Cast(Rand()*10000000 as VarChar(50)), Cast(Rand()*10000000 as VarChar(50)));
   Set @i = @i + 1;
End
Go
CREATE Index IX_VeryRandomText On dbo.TestTable
(
    VeryRandomText
)
Go

执行查询时:

Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad

收到警告(正如预期的那样,因为将 nchar 数据与 varchar 列进行比较):

<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />

但后来我看到了执行计划,我可以看到,它没有像我预期的那样使用全扫描,而是使用索引搜索。

在此处输入图像描述

当然,这有点好,因为在这种特殊情况下,执行速度比完全扫描要快得多。

但我不明白 SQL Server 是如何决定制定这个计划的。

此外,如果服务器排序规则是服务器级别的 Windows 排序规则和 SQL Server 排序规则数据库级别,那么它会导致对同一查询进行全面扫描。

sql-server sql-server-2008-r2
  • 2 个回答
  • 514 Views
Martin Hope
Jānis
Asked: 2015-03-03 00:13:03 +0800 CST

更改跟踪清理

  • 0

有没有办法知道何时清理更改跟踪表?如何检查清理过程的最后一次发生?

背景:

我对数据库进行了更改跟踪,保留时间设置为 1 分钟:

ALTER DATABASE [test] SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 1 MINUTES)

我在我的测试表中进行了一些更新,然后等待比保留期更长的时间(比如说 3 分钟)。由于清理过程是异步的,我明白不能保证更改跟踪表会在 1 分钟后被清理。它可以在> 1 分钟的任何时间发生。

我发现这个过程可以手动调用清理过程:

EXEC sp_flush_commit_table_on_demand 100000

但它没有按预期工作..(更改跟踪行在保留期后仍然存在)

sql-server sql-server-2012
  • 2 个回答
  • 6164 Views
Martin Hope
Jānis
Asked: 2013-02-21 01:07:29 +0800 CST

SQL Server 中的“No Join Predicate”到底是什么意思?

  • 24

MSDN“缺少连接谓词事件类”说它“表示正在执行一个没有连接谓词的查询”。

但不幸的是,这似乎并不那么容易。

比如很简单的情况:

create table #temp1(i int);
create table #temp2(i int);
Select * from #temp1, #temp2 option (recompile);

表中没有数据,也没有警告,尽管它显然没有连接谓词。

如果我看一下 SQL Server 2005 的文档(相同的链接,只是其他服务器版本),有一个额外的句子:“只有当连接的双方返回多行时才会产生这个事件。 ”这将使在以前的情况下完美的感觉。没有数据,所以双方都返回0行并且没有警告。插入行,得到警告。嗯不错。

但是对于下一个令人困惑的情况,我在两个表中插入了相同的值:

Insert into #temp1 (i) values (1)
Insert into #temp1 (i) values (1)
Insert into #temp2 (i) values (1)
Insert into #temp2 (i) values (1)

我得到:

-- no warning:
Select * from #temp1 t1 
    inner join #temp2 t2 on t1.i = t2.i 
option (recompile)
-- has warning:
Select * from #temp1 t1 
    inner join (select 1 i union all select 1) t2 on t1.i = t2.i 
option (recompile)

为什么会这样?

注意:我用来在我的服务器上检测这些错误查询的一些脚本。

  1. 当然,程序的执行计划
  2. 使用默认服务器跟踪来查找警告

    Declare @trace nvarchar(500);
    Select @trace = cast(value as nvarchar(500))
    From sys.fn_trace_getinfo(Null)
    Where traceid = 1 and property = 2;
    
    Select t.StartTime, te.name, *
    From sys.fn_trace_gettable(@trace, 1) t
        Inner join sys.trace_events te on t.EventClass = te.trace_event_id
        where EventClass = 80
    order by t.StartTime desc
    
  3. 执行计划缓存,找到那些带有警告的计划(比如这个)

    WITH XMLNAMESPACES (default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
    SELECT
        Cast('<?SQL ' + st.text + ' ?>' as xml) sql_text,
        pl.query_plan,
        ps.execution_count,
        ps.last_execution_time,
        ps.last_elapsed_time,
        ps.last_logical_reads,
        ps.last_logical_writes
    FROM sys.dm_exec_query_stats ps with (NOLOCK)
        Cross Apply sys.dm_exec_sql_text(ps.sql_handle) st
        Cross Apply sys.dm_exec_query_plan(ps.plan_handle) pl
    WHERE pl.query_plan.value('(//Warnings/@NoJoinPredicate)[1]', 'bit') = 1
    Order By last_execution_time desc
    OPTION (RECOMPILE);
    
sql-server-2008 sql-server-2005
  • 1 个回答
  • 34582 Views
Martin Hope
Jānis
Asked: 2012-10-31 06:51:08 +0800 CST

有多少连接读取队列

  • 0

有没有办法知道有多少外部任务(控制台应用程序)正在读取队列?

我正在使用 Service Broker 外部激活器。

我想要的是类似于我从sys.dm_broker_activated_tasks获得的信息,仅供外部队列读取器使用。

sql-server sql-server-2008-r2
  • 1 个回答
  • 104 Views
Martin Hope
Jānis
Asked: 2012-06-28 04:45:22 +0800 CST

架构和用户权限

  • 5

我有 2 个模式,可以说sch1和sch2。每个都由不同的用户拥有。

我确实想将sch2.MyTable(但只是这个对象)的SELECT权限授予sch1过程/视图,并允许在sch1外键约束中引用sch2.MyTable 。

我不想让那些使用 sch2 过程/视图但希望允许间接访问的人直接访问sch2.MyTable 。

基本上 sch2 更重要。sch2 的所有者也可以控制 sch1,但反之则不然。另一方面,sch1 有一些依赖于 sch2 的数据,他们应该能够看到它们并且不应允许从 sch2 删除数据,而 sch1 仍然对它们有一些依赖性。

这可能吗(也许通过同义词)?

因为不,它似乎——不,不可能。除非取消有关“视图和约束”或“不同模式所有者”的部分。

sql-server sql-server-2008
  • 3 个回答
  • 432 Views
Martin Hope
Jānis
Asked: 2012-06-21 04:40:32 +0800 CST

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

  • 7

我使用查询来找出数据库文件的大小。我正在使用系统视图和 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)

我很困惑-将两个值都转换为“字节”,然后进行比较。但在所有情况下,我检查了 - temdb 文件大小(来自 sys.master_files)小于磁盘上的文件大小(来自 sys.dm_io_virtual_file_stats)。

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

造成这种差异的原因是什么?

更新:当我查询时

Select is_sparse, * From sys.database_files 

在 SQL Server 2005 数据库快照上,列 is_sparse = 0 (因为它显示的是来自原始数据库的文件的属性,而不是快照文件。那么文档中是否存在错误?)。

sql-server-2008 sql-server-2005
  • 1 个回答
  • 6250 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve