Reply to Re: Paging records on SQL server using derived tables : more question

Your name:

Reply:


Posted by rbg on 01/26/07 13:59

PLEASE NOTE the variable was not WokStart but WORKTYPE.

So the query that takes very long looks like this:

Select * from ( Select Top 600 * from
( Select Top 2000 * from
( Select Top 2000 PermitNumber, HouseNumber, OnStreetName,
FromStreetName, ToStreetName, WorkStartDate as "WorkStart",
tbl_Permittee.Permittee_name as PermitteeName, PermitteeNumber,
PermitType_ID as "Type",
InspectionDistrict,
PermitStatus,
IssueDate
>From PermitMain inner join tbl_Permittee
on PermitMain.PermitteeNumber = tbl_Permittee.Permittee_Number
and (tbl_Permittee.Permittee_name_flag = 'd' or
tbl_Permittee.Permittee_name_flag = 'p')
where
(PermitType_ID like @WorkType ) and worktypeid is null
and ((IssueDate between @IssueDateFrom and @IssueDateTo) or
(EmergIssueDate between @IssueDateFrom and @IssueDateTo))

and PermitteeNumber = @PermitteeNumber

and PermitMain.Boroughcode = @Boro

order by WorkStart DESC

) as T2 order by WorkStart ASC

) as T3

) as T4 order by WorkStart DESC
===================================================================
On Jan 26, 8:49 am, "rbg" <rbg....@gmail.com> wrote:
> You are right, I did not include the exact query since it has a whole
> of joins and many where clauses in it.
> I did not want to make the post very hard to read, hence I simplified
> it.
>
> In the Stored proc I am using a String variable @SQLString
> varchar(2000) to hold the entire select statement, and then executing
> that SQL using EXEC (@SQLString).
>
> Thus for debugging, I used Query Analyzer, and within the Analyzer I am
> using the Select statement.
> So in my test I do not use any stored proc.
>
> so one select statement says:
>
> Select * from ( Select Top 600 * from
> ( Select Top 2000 * from
> ( Select Top 2000 PermitNumber, HouseNumber, OnStreetName,
> FromStreetName, ToStreetName, WorkStartDate as "WorkStart",
> tbl_Permittee.Permittee_name as PermitteeName, PermitteeNumber,
> PermitType_ID as "Type",
> InspectionDistrict,
> PermitStatus,
> IssueDate>From PermitMain inner join tbl_Permitteeon PermitMain.PermitteeNumber = tbl_Permittee.Permittee_Number
> and (tbl_Permittee.Permittee_name_flag = 'd' or
> tbl_Permittee.Permittee_name_flag = 'p')
> where
> (PermitType_ID like '01%' ) and worktypeid is null
> and ((IssueDate between @IssueDateFrom and @IssueDateTo) or
> (EmergIssueDate between @IssueDateFrom and @IssueDateTo))
> and PermitteeNumber = @PermitteeNumber
> and PermitMain.Boroughcode = @Boro
> order by WorkStart DESC
> ) as T2 order by WorkStart ASC
>
> ) as T3
>
> ) as T4 order by WorkStart DESC
>
> THIS ONE RUNS FAST and RETURNS RESULTS.
>
> The Other Select statement:
>
> Select * from ( Select Top 600 * from
> ( Select Top 2000 * from
> ( Select Top 2000 PermitNumber, HouseNumber, OnStreetName,
> FromStreetName, ToStreetName, WorkStartDate as "WorkStart",
> tbl_Permittee.Permittee_name as PermitteeName, PermitteeNumber,
> PermitType_ID as "Type",
> InspectionDistrict,
> PermitStatus,
> IssueDate>From PermitMain inner join tbl_Permitteeon PermitMain.PermitteeNumber = tbl_Permittee.Permittee_Number
> and (tbl_Permittee.Permittee_name_flag = 'd' or
> tbl_Permittee.Permittee_name_flag = 'p')
> where
> (PermitType_ID like @WokStart ) and worktypeid is null
> and ((IssueDate between @IssueDateFrom and @IssueDateTo) or
> (EmergIssueDate between @IssueDateFrom and @IssueDateTo))
>
> and PermitteeNumber = @PermitteeNumber
>
> and PermitMain.Boroughcode = @Boro
>
> order by WorkStart DESC
>
> ) as T2 order by WorkStart ASC
>
> ) as T3
>
> ) as T4 order by WorkStart DESC
>
> TAKES FOREVER to COMPLETE.
>
> However IF I INCREASE the PAGESIZE from 600 to 800, BOTH QUERIES RETURN
> RESULTS EQUALLY FAST.
>
> Thanks for your help
> On Jan 25, 5:49 pm, Erland Sommarskog <esq...@sommarskog.se> wrote:
>
> > rbg (rbg....@gmail.com) writes:
> > > I have a question on this, if someone can help me with that it will be
> > > great.
> > > In my SQL query that selects data from table, I have a where clause
> > > which states :
>
> > > where PermitID like @WorkType
> > > order by WorkStart DESC
>
> > > @WorkType is a input parameter to the Stored proc and its value is
> > > '01%'
>
> > > When I use the above where clause, all the Sorts in the ESTIMATED Query
> > > Execution plan show me a COST of 28%.
>
> > > However if I change the query manually to say:
>
> > > where PermitID like '01%'
> > > order by WorkStart DESC
>
> > > The COST of the Sort (in ESTIMATED Query Execution plan) reduces to 2%
> > > and at the beginning of the PLAN, there is a Bookmark Lookup which
> > > includes the above where clause.
> > > Whereas with the FIRST example , the BookMark Lookup in the beginning
> > > doesn't show that where condition.
>
> > > Can anyone help me better understand this anomaly?That WHERE clause was not in your original post. Nor does the column
> > name seem entirely familiar. I gather that what you posted yesterday
> > was a sample from an MSDN article, but it can be tricky to give accurate
> > answers, ir you don't post your actual code.
>
> > But some optimizer bascis: when SQL Server builds the query plan
> > for a stored procedure, it builds the plan for the procedure as a
> > whole. This means that it does not know what values that variables
> > will have at time for execution. The same applies to parameters, but
> > in this case it does at least know the input value, and uses this
> > value as guidance. (This is known as parameter sbiffing.)
>
> > But SQL Server does not build a query plan every time a procedure
> > is executed. Instead the plan is put in cache, and the cached plan
> > will be reused - even if the procedure is called with input values
> > for which the cached plan is no good.
>
> > In your case, assume the the procedure was first called with
> > WorkType '%01'. For this input value any index on PermitID is not
> > very useful, so most likely you will get a table scan instead.
>
> > On the other hand, when you hardcode a value. SQL Server have full
> > information, and the odds for a good plan are much better.
>
> > To test this theory, you can say:
>
> > EXEC your_sp @WorkTyoe WITH RECOMPILE
>
> > if you get a berrer plan, the problem was that you had a plan created
> > for a differnt value in the cache.
>
> > --
> > Erland Sommarskog, SQL Server MVP, esq...@sommarskog.se
>
> > Books Online for SQL Server 2005 athttp://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books...
> > Books Online for SQL Server 2000 athttp://www.microsoft.com/sql/prodinfo/previousversions/books.mspx

[Back to original message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация