다양한 Stored Procedure 의 성능에 대해서 아시는 바 있나요?

winner의 이미지

DB를 하면 언제나 잘 된 설계, 그러니까 딱 적합한 정도로 조율된 정규화가 가장 큰 성능요소로 알고 있습니다.
그리고 중요한 것이 아마 적절한 index 일텐데요.

다음으로 고려하는 것은 stored procedure 인가요?

하여간 지금 stored procedure를 고려하고 있습니다. 통상 stored procedure는 구문분석, 수행계획을 미리 평가하기 때문에 성능이 좋은 것으로 아는데요.

그런데 SELECT는 INTO 절과 cursor, 그리고 반복문을 사용하더군요. 이렇게 해서 성능이 좋을런지 궁금합니다.
혹시 관련문헌을 아신다면 link 부탁드립니다. 저는 검색을 못해서인지 잘 안 나오네요.

또 한가지 궁금한 것은 dynamic query를 stored procedure 내에서 만들어서 EXECUTE를 하더군요. 이렇게까지 해서 stored procedure를 만들어야 하는 것인지 좀 의문이 들었습니다.

정리하자면 제가 궁금한 점은 'stored procedure와 성능에 대한 사실과 오해'? ^_^!

drinkme의 이미지

Stored Procedure가 index 다음으로 중요한지는 잘 모르겠지만,
어쨋건 중요하고, 잘만 사용하면 성능에 극단적인 영향을 준다고 생각합니다.

일반적으로 RDB에서 커서를 사용한 반복문 보다는
join 등의 연산을 사용하여 query를 작성하시는 것이 정석으로 알려져 있고
DB engine도 이러한 방법에 최적화 되어 있기 때문에
커서를 꼭 필요한 경우에만 사용하시는 것이 좋습니다.

그리고, 저도 예전에 일하면서 보니까,
Stored procedure로 작성하면 좋다(뭐가???)는 주장을 하면서
내에서 dynamic query만들어서 하시는 분들 있던데...
무슨 visual basic 하십니까?
Stored Procedure를 쓰는 중요이유 몇가지를 버리는 행위이고
구문분석과 디버깅을 어렵게 합니다.
꼭 필요한 경우가 아니면, 이런 방법은 쓰지 마세요.

서지원의 이미지

http://en.wikipedia.org/wiki/Stored_procedure

Quote:

Furthermore, some modern DBMS systems (notably from MS SQL Server 2000 onwards) don't offer any performance benefits of using stored procedures: they are compiled and cached in the same manner as dynamic SQL.

oldbell의 이미지

인생의 무게를 느껴라. 아는 만큼 보이는게다.

academic의 이미지

1.

stored procedure에서 dynamic query를 하는 것도 잘만 쓰면 아주 강력할 수 있습니다.

다만, 전 잘 쓸 자신이 없어 피합니다.

2.

stored procedure의 오해 중 하나는 수행계획을 미리 평가한다라는 것 아닌가 합니다.

stored procedure 내에서 분기를 하는 경우, 기존 수행 계획을 재사용하는 것이 아니라 실행할 때마다 다시 수립하는 경우가 많습니다.

따라서 stored procedure에서 dynamic query를 하는 것과 별로 달라지는 것이 없는 경우도 많지요.

3.

stored procedure와 관련된 오해에도 불구하고 가능한한 stored procedure로 만드는 게 좋다고 생각합니다.

cursor를 불필요하게 stored procedure에 쓰는 사람이 stored procedure를 사용하지 않으면 cursor를 안 쓴다는 보장이 있는 것도 아니고,

dynamic query를 stored procedure에 쓰는 것이 그냥 일반적인 SQL문으로 쓰는 것보다는 sql injection 우려도 눈꼽만큼이라도 덜 수 있을 겁니다.

그외에도 다른 여러가지 장점들이 있으니... 같은 조건이면 stored procedure를 쓰는게 정답이라 봅니다.

--
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

winner의 이미지

검색을 해봐도 정량적 수치자료가 거의 없어서 아쉽더군요.
간단한 실험이 이루어졌습니다만 제가 한 것은 아닌데다가 결과가 이해가 안가게 나와서 신뢰하기 어렵더군요.

예전에 저는 stored procedure를 특별한 일 없으면 안 쓰는게 좋다고 생각했습니다. Stored procedure는 DBMS 마다 호환이 안 이루어지기 때문에요.

하지만 조사를 하는 도중 Stored procedure들이 유사한 점도 많기도 해서 DBMS 호환이 그렇게 어려운 것 같지는 않고, 나름의 여러 장점이 있다는 것을 알게 되었습니다. 특히 DBMS를 교체한다면 stored procedure를 아끼는게 맞겠지만 보니까 거꾸로 DBMS가 그대로고 program들이 교체되는 경우가 더 많은 것 같더군요. DB를 옮긴다던가 교체한다는게 자주 있는 일이 아니겠죠.

phonon의 이미지

예전의 DBMS에서는 stored procedure가 조금은 나은 성능을 보여 주었습니다. 그래서, DB관련서적에서도 필수에 가까운 권장을 했었지요.
그러나, 최적화의 향상과 웹과의 연동에 많아지 지금에는 대동소이한 성능을 보여주며, 경우에 따라서는 dynamic query가 더 나은 루틴으로 동작하는 경우도 많습니다.
동일한 자료 형태를 여러 번 요구하는 경우에는 stored procedure가 아주 조금 유리합니다만, 웹서버와 같은 다양한 형태의 자료를 요구하는 경우에는 dynamic query가 더 좋은 성능을 보여 주고 있습니다.
DBMS 개발사들이 웹에 적당한 최적화를 한 결과로 인한 것으로, 예전부터 이론적으론 stored procedure가 보다 나은 개념이라고 봅니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.