统计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) 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 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
我使用查询来找出数据库文件的大小。我正在使用系统视图和 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(因为它显示的是原始数据库中的文件的属性,而不是快照文件。所以-文档中有错误吗?)。
我有 2 个模式,比如说sch1和sch2。每个拥有不同的用户。
我确实想将sch2.MyTable(但只是这个对象)的SELECT权限授予sch1过程/视图,并允许在sch1外键约束中引用sch2.MyTable。
我不想做sch2.MyTable直接访问这些,谁使用SCH2程序/意见,但要允许间接访问。
基本上 sch2 更重要。sch2 的所有者也可以控制 sch1,但反之则不然。另一方面,sch1 有一些依赖于 sch2 的数据,他们应该能够看到它们并且不允许从 sch2 中删除数据,而 sch1 仍然对它们有一些依赖。
这可能吗(也许通过同义词)?
不,似乎-不,不可能。除非去掉关于“视图和约束”或“不同模式所有者”的部分。
什么时候用好SELECT DISTINCT ..,什么时候不好用?
基本上,每当我看到DISTINCT关键字时,我就会开始变得谨慎,因为大多数情况下最终会发现实际查询存在一些问题(选择性不够、连接不良、逻辑不正确等)。
你有类似的经历还是只是我?