SQL Server developers consider Cursors a bad practise , except under some circumstances. They believe that Cursors do not use the SQL engine optimally since it is a procedural construct and defeats the Set based concept of RDBMS.
However, Oracle developers do not seem to recommend against Cursors. Oracle's DML statements themselves are implicit cursors.
Why this difference in approach ? Is it because of the way these 2 products are made , or does this advise apply to both products?
From MSDN:Cursor Implementations
I'm not an Oracle DBA, so I can't really speak to how the implementations are different. However, from a programming standpoint, set based operations are almost always faster than processing results in a cursor.
I have always been told that cursors where evil, but always by MS SQL Server gurus, because of it's bad performance. Regarding Oracle's PL/SQL I found this saying when to use cursors:
As cursors are implicitly created on every operation, it doesn't seem so performance-punishing to use them when needed :)
Remember that Oracle's implementation is closer to Postgres than to Sybase (Genesis of MS SQL Server), so performance will be different for each on different tasks.If you can, avoid the hustle of tweak for performance on systems that can swap able back-ends, go for least common denominator if you need to work with both. /tangential_topic
What's wrong with cursors is that they are often abused, both in
Oracle
and inMS SQL
.Cursor are for keeping a stable resultset which you can retrieve row-by-row. They are implicitly created when your query is run, and closed when it's finished.
Of course keeping such a resultset requires some resources:
locks
,latches
,memory
, evendisk space
.The faster these resources are freed, the better.
Keeping a cursor open is like keeping a fridge door open
You don't do it for hours without necessity, but it does not mean you should never open your fridge.
That means that:
SQL
'sSUM
instead.rownum <= 10
condition to your query, etc.
As for
Oracle
, processing your cursors inside a procedure requires infamousSQL/PLSQL context switch
which happens every time you get a result of anSQL
query out of the cursor.It involves passing large amounts of data between threads and synchronizing the threads.
This is one of the most irritating things in
Oracle
.One of the less evident consequences of that behaviour is that triggers in Oracle should be avoided if possible.
Creating a trigger and calling a
DML
function is equal to opening the cursor selecting the updated rows and calling the trigger code for each row of this cursor.Mere existence of the trigger (even the empty trigger) may slow down a
DML
operation10 times
or more.A test script on
10g
:1.47
seconds without a trigger,17.57
seconds with an empty trigger doing nothing.why-do-people-hate-sql-cursors-so-much
why-is-it-considered-bad-practice-to-use-cursors-in-sql-server
and a very good article here...
I'm sure someone can explain in more detail, but it basically comes down to cursors in SQL server are SLOW.
The other answers correctly point out the performance issues with cursors, but they don't mention that SQL and relational databases are best at set-based operations and cursors are fundamentally for iterative operations. There are some operations (in the broader sense) that are easier to perform using cursors, but when working with SQL you should always be thinking about working with sets of data. Cursors are often misused because the coder didn't grasp how to perform the task using set-based operations.