none
改变条件顺序 RRS feed

  • 问题

  • select * from tBookType
    outer apply
    (
    	select * from tBook
    	where
    	tBookType.BookType!='SQL Server' and tBook.BookType_Id=tBookType.BookTypeId
    )book
    有没有办法改变条件顺序,从分析器看出先tBook.BookType_Id=tBookType.BookTypeId索引扫描tBook表,但我想先tBookType.BookType!='SQL Server'后tBook.BookType_Id=tBookType.BookTypeId,因为不符合tBookType.BookType!='SQL Server'就不用扫描tBook表了。
    2009年12月7日 3:43

答案

全部回复

  • Have index on booktype column?
    2009年12月7日 3:47
  • booktype没有索引

    2009年12月7日 4:01
  • Then optimizer will not filter data by that column.
    2009年12月7日 4:04
  • if exists(select * FROM sys.objects where object_id = object_id(N'[dbo].tBook') and type in (N'U'))
    drop table tBook
    if exists(select * FROM sys.objects where object_id = object_id(N'[dbo].tBookType') and type in (N'U'))
    drop table tBookType
    
    create table tBookType
    (
    	BookTypeId int identity(1,1) constraint BookType_PK primary key,
    	BookType nvarchar(50),
    )
    create table tBook
    (
    	BookId int identity(1,1) constraint Book_PK primary key,
    	BookType_Id int constraint Book_BookType_FK references tBookType(BookTypeId),
    	BookName nvarchar(50)
    )
    
    insert tBookType values('asp.net')
    insert tBookType values('SQL Server')
    
    insert tBook values(1,'asp.net入门')
    insert tBook values(1,'精通asp.net')
    insert tBook values(2,'SQL Server入门')
    insert tBook values(2,'精通SQL Server')
    
    set statistics profile on
    set statistics io on
    set statistics time on
    
    select * from tBookType
    outer apply
    (
    	select * from tBook
    	where
    	tBookType.BookType!='SQL Server' and tBook.BookType_Id=tBookType.BookTypeId
    )book
    
    set statistics profile off
    set statistics io off
    set statistics time off
    2009年12月7日 4:17
  • 从执行的结果来分析需求, 这个直接用 left join 做查询就好了嘛
    select * from tBookType
    	left join tBook
    		on tBookType.BookType!='SQL Server' and tBook.BookType_Id=tBookType.BookTypeId
    
    2009年12月7日 4:28
  • left join是可以,但我想用outer apply,因为有时是这样的,

    select * from tBookType
    outer apply
    (
    select top 3* from tBook
    where
    tBookType.BookType!='SQL Server' and tBook.BookType_Id=tBookType.BookTypeId
    order by tBook.Sort
    )book

    这时,left join不能代替outer apply吧?总有不能代替outer apply的时候吧?
    2009年12月7日 4:36
  • 我搞错了,好似本身已经是先tBookType.BookType!='SQL Server' 后tBook.BookType_Id=tBookType.BookTypeId

    • 已标记为答案 SQL STUDIO 2009年12月7日 4:58
    2009年12月7日 4:58