General rules for simplifying SQL statements

前端 未结 8 1544
心在旅途
心在旅途 2020-12-22 17:15

I\'m looking for some \"inference rules\" (similar to set operation rules or logic rules) which I can use to reduce a SQL query in complexity or size. Does there exist some

8条回答
  •  感动是毒
    2020-12-22 17:36

    Here's a few from working with Oracle 8 & 9 (of course, sometimes doing the opposite might make the query simpler or faster):

    Parentheses can be removed if they are not used to override operator precedence. A simple example is when all the boolean operators in your where clause are the same: where ((a or b) or c) is equivalent to where a or b or c.

    A sub-query can often (if not always) be merged with the main query to simplify it. In my experience, this often improves performance considerably:

    select foo.a,
           bar.a
      from foomatic  foo,
           bartastic bar
     where foo.id = bar.id and
           bar.id = (
             select ban.id
               from bantabulous ban
              where ban.bandana = 42
           )
    ;
    

    is equivalent to

    select foo.a,
           bar.a
      from foomatic    foo,
           bartastic   bar,
           bantabulous ban
     where foo.id = bar.id and
           bar.id = ban.id and
           ban.bandana = 42
    ;
    

    Using ANSI joins separates a lot of "code monkey" logic from the really interesting parts of the where clause: The previous query is equivalent to

    select foo.a,
           bar.a
      from foomatic    foo
      join bartastic   bar on bar.id = foo.id
      join bantabulous ban on ban.id = bar.id
     where ban.bandana = 42
    ;
    

    If you want to check for the existence of a row, don't use count(*), instead use either rownum = 1 or put the query in a where exists clause to fetch only one row instead of all.

提交回复
热议问题