小编Jān*_*nis的帖子

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

我正在执行查询,生成计划: 在此处输入图片说明

统计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. …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan sql-server-2012

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

SQL Server 中的“No Join Predicate”究竟是什么意思?

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

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

例如,非常简单的情况:

create table #temp1(i int);
create table #temp2(i int);
Select * from #temp1, #temp2 option (recompile);
Run Code Online (Sandbox Code Playgroud)

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

如果我查看 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)
Run Code Online (Sandbox Code Playgroud)

我得到:

-- no warning:
Select * from #temp1 t1 
    inner join #temp2 t2 on t1.i = t2.i 
option (recompile)
-- has warning:
Select * from …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server-2008 t-sql

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

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

为什么没有全扫描(在 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
Run Code Online (Sandbox Code Playgroud)

执行查询时:

Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2008-r2 sql-server-2012 query-performance

11
推荐指数
1
解决办法
494
查看次数

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
查看次数

架构和用户权限

我有 2 个模式,比如说sch1sch2。每个拥有不同的用户。

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

我不想做sch2.MyTable直接访问这些,谁使用SCH2程序/意见,但要允许间接访问。

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

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

不,似乎-不,不可能。除非去掉关于“视图和约束”或“不同模式所有者”的部分。

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

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

何时使用 DISTINCT

什么时候用好SELECT DISTINCT ..,什么时候不好用?

基本上,每当我看到DISTINCT关键字时,我就会开始变得谨慎,因为大多数情况下最终会发现实际查询存在一些问题(选择性不够、连接不良、逻辑不正确等)。

你有类似的经历还是只是我?

sql-server

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