我最初只是写了一个查询来查找每个客户的年度总订单数大于1.在1.query中,我过滤了结果集并将其与另一个找到客户名称的结果集连接起来.奇怪的是,我认为过滤器首先会产生更好的性能,因为加入需要的结果更少.所以我写了第二个查询,先加入,然后过滤,看起来比第一个查询更整洁.由于结果中的所有时间都较低,因此结果与我预期的相同.但我不确定哪个时间最重要?或者这个案子只是巧合?如何考虑表现?
use [AdventureWorks2012]
set statistics time on;
--1.filter first,join second
select tempC.*,tempP.FirstName,tempP.LastName
from
(select Year(OrderDate) As OrderYear,CustomerID,count(CustomerID) As CustomerOrderAmt
from Sales.SalesOrderHeader
group by Year(OrderDate),CustomerID
having count(CustomerID) >1
) as tempC
join(
select p.FirstName,p.LastName,c.CustomerID
from Person.Person as p join Sales.Customer as c on c.PersonID=p.BusinessEntityID
) as tempP
on tempC.CustomerID=tempP.CustomerID
order by tempC.OrderYear,tempC.CustomerID
GO
--2.join first,filter second
select Year(so.OrderDate) As Orderdate,so.CustomerID,count(so.CustomerID) As CustomerOrderAmt,p.FirstName,p.LastName
from Sales.SalesOrderHeader as so
join Sales.Customer as C on so.CustomerID=c.CustomerID
join Person.Person as p on c.PersonID=p.BusinessEntityID
group by Year(so.OrderDate),so.CustomerID,p.FirstName,p.LastName …Run Code Online (Sandbox Code Playgroud) 这没有任何问题:
select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE
from [AdventureWorks2012].INFORMATION_SCHEMA.COLUMNS WHERE table_name='employee';
Run Code Online (Sandbox Code Playgroud)
但是,当它转移到动态语句时,它总是失败:
begin
DECLARE @sqlstatement VARCHAR(MAX);
DECLARE @TableName varchar(max)='employee';
set @sqlstatement='select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE
from [AdventureWorks2012].INFORMATION_SCHEMA.COLUMNS WHERE table_name='+@TableName;
print (@sqlstatement);
EXECUTE(@sqlstatement);
end
Run Code Online (Sandbox Code Playgroud)
错误说:无效的列名称'employee'
我看到(xlock,rowlock,holdlock)的组合用于表.参考在线书籍,holdlock是保持共享锁(用于读取,例如选择),直到事务完成,xlock是用于数据修改的独占锁(写锁),例如更新,插入或删除.我们怎样才能同时使用读写表?我想知道组合是否生效.混乱...