You are here: Re: Execution Plan Hinting « MsSQL Server « IT news, forums, messages
Re: Execution Plan Hinting

Posted by Dan Guzman on 03/09/06 15:47

> BEGIN TRANSACTION
> DELETE * FROM Whatever
> BULK INSERT INTO Whatever...(etc)
> COMMIT TRANSACTION

These statements run consecutively and not in parallel. You shouldn't get a
PK violation unless the file contains duplicate data so it looks to me like
you found a bug. I can repro this under SQL 2000 but no problem under SQL
2005.

There seem to be couple of work-arounds. One is to use TRUNCATE:

BEGIN TRANSACTION
TRUNCATE TABLE Whatever
BULK INSERT INTO Whatever...(etc)
COMMIT TRANSACTION

Another is to avoid the explicit transaction so that each statement is in an
individual transaction:

DELETE FROM Whatever
BULK INSERT INTO Whatever...(etc)

--
Hope this helps.

Dan Guzman
SQL Server MVP

"Ryan" <ryanofford@hotmail.com> wrote in message
news:1141905599.836545.225980@i39g2000cwa.googlegroups.com...
> We've got as slightly unusual scenario happening whereby a statement is
> passed to SQL which consists of two parts.
>
> BEGIN TRANSACTION
> DELETE * FROM Whatever
> BULK INSERT INTO Whatever...(etc)
> COMMIT TRANSACTION
>
> The first is a deletion of the data and the second is the bulk insert
> of replacement data into that table. The error that we see is a
> violation of the primary key (composite).
>
> The violation only happens if we run both processes together. If we run
> one, then the other, it works fine. If we set a line by line insert, it
> works fine.
>
> My suspicion is that the execution plan that is being run is most
> likely working the two parts in parallel and that the records still
> exist at the point that the insert is happening. Truncate is not an
> option. The bulk insert was added for performance reasons. There is an
> option of trying the bulk insert, and if that fails, do the line by
> line insert, but it's far from ideal.
>
> I think we can probably wrap this into two individual transactions
> within the one statement as follows :
>
> BEGIN TRANSACTION
> DELETE * FROM Whatever
> COMMIT TRANSACTION
>
> BEGIN TRANSACTION
> BULK INSERT INTO Whatever...(etc)
> COMMIT TRANSACTION
>
> Will this give sufficient hint to SQL about the order it processes it
> so that it completes as we intend and not as it sees being the most
> efficient method ?
>
> Or, is there a better approach to this ?
>
> I've seen that some hints can be passed to SQL for optimizing, but my
> understanding was that it was always better to trust the optimiser and
> re-work the query as needed.
>
> With the server having two processors, is it feasible that one is doing
> one part and the other processor the other part in parallel ? Will
> telling it to use a single processor be worthwhile looking at ? MAXDOP
> 1 ?
>
> Finally, I'd imagine that the insert is quicker to process than the
> deletion. Is this correct ?
>
> Thanks
>
> Ryan
>

 

Navigation:

[Reply to this 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

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