Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/ashowflat.php?Number=11013436&src=&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 01:21:21 2016
Кодировка: Windows-1251
Где в интернете можно обсудить dynamic sql automatic checking? - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 0 | 20 | 40 | 60 | 80 | 100 | показать все
DDD2
sir

Рег.: 23.11.2007
Сообщений: 1102
Рейтинг: 246
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: DarkGray]
      12.07.2012 18:42
2

В ответ на:

получение колонок id, foo, bar, baz не может быть выполнено только из индекса testi, т.к. там хранятся только колонки id, bar. Обязательно еще должен быть запрос к кластерному индексу для получения колонок foo, baz.
Либо testi является кластерным индексом, но тогда понятно почему план запросов всегда делается через него.



См. в первой строке плана heap scan. Heap это и есть сама таблица. Постгрес сначала лезет в индекс, чтобы найти строки, которые подпадают под критерий, заданный в where, затем лезет в таблицу, чтобы достать столбцы, которых нет в индексе.

Mike
Ызарг

Рег.: 02.11.2002
Сообщений: 8098
Рейтинг: 2147
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: DarkGray]
      12.07.2012 18:46
 

Quote:

Обязательно еще должен быть запрос к кластерному индексу для получения колонок foo, baz.



 

DarkGrayМодератор
Carpal Tunnel

Рег.: 30.09.2002
Сообщений: 31408
Рейтинг: 8951
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: DDD2]
      12.07.2012 18:47
 

Quote:

в первой строке плана heap scan. Heap это и есть сама таблица.




так понятнее, спасибо.

DarkGrayМодератор
Carpal Tunnel

Рег.: 30.09.2002
Сообщений: 31408
Рейтинг: 8951
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: Mike]
      12.07.2012 18:52
 

можешь дальше продолжать верить в магию.

Mike
Ызарг

Рег.: 02.11.2002
Сообщений: 8098
Рейтинг: 2147
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: DarkGray]
      12.07.2012 18:53
 

Quote:

можешь дальше продолжать верить в магию.



Можешь дальше не лечиться от Microsoft-а головного мозга.

vond

Рег.: 08.04.2004
Сообщений: 6076
Из: Москва
Рейтинг: 1202
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: Shurik]
      12.07.2012 19:05
1

да, я облажался
на примере DDD2 посмотрел планы 3 запросов (Oracle 11.2):

1) select * from test where (:id is null or id = :id) and (:bar is null or bar = :bar);
2) select * from test where (id = :id) and (:bar is null or bar = :bar);
3) select * from test where (id = :id) and (bar = :bar);

1 - table access full
2 и 3 - range scan по индексу

Rad
delinquent guy

Рег.: 06.09.2005
Сообщений: 17290
Из: here and there
Рейтинг: 2232
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: vond]
      13.07.2012 07:06
 

В ответ на:

1) select * from test where (:id is null or id = :id) and (:bar is null or bar = :bar);


ну так null-ы в индекс не запихнешь, плюс - нелюбовь оракла к or'ам.

попробуй заменить :_param is null or column = :_param на nvl(:_param, column) = column



Shurik

Рег.: 27.09.2003
Сообщений: 13644
Рейтинг: 787
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: blykynqp]
      15.07.2012 13:32
 

Если набор колонок варьируется, то вот так
Query.New(
    p => {
        var q = new Q("select a.*");

        IQuery<IRecord> result;
        if (p.b)
        {
            q._(", b.id as id_b");
            result = q.Query<IBRecord>();
        }
        else
            result = q.Query<IARecord>();

        q._(" from ");

        if (p.c)
            q._("c as a");
        else
            q._("a");

        if (p.b)
            q._(" inner join b on b.id = a.id ");

        q._(" where 1 = 1");

        if (p.d)
            q._(" and a.type_id = 1");
        return result;
    },
    new {b, c, d}
    ).Execute();

interface IRecord
{
    T Match<T>(Func<IARecord, T> a, Func<IBRecord, T> b);
}

private interface IARecord : IRecord
{
    int id { get; }
    int type_id { get; }
}

private interface IBRecord : IARecord
{
    int id_b { get; }
}




not fluffing up the experience with features that will ultimately cause you a headache
Burjui
Pooh-Bah

Рег.: 26.11.2005
Сообщений: 2416
Рейтинг: 3784
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: DDD2]
      15.07.2012 14:35
2

В ответ на:

Сегодня я проверил это на постгресе:




Долго думал как может работать эта черная магия.

Оказалось все просто:

 
В ответ на:

This is another situation where EXECUTE can be used to force a new plan to be generated for each execution.




Shurik

Рег.: 27.09.2003
Сообщений: 13644
Рейтинг: 787
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: Burjui]
      15.07.2012 15:09
-1

Quote:

Долго думал как может работать эта черная магия.



т.е. магия не работает. Школота разочарована. Поставил плюс.



not fluffing up the experience with features that will ultimately cause you a headache
DDD2
sir

Рег.: 23.11.2007
Сообщений: 1102
Рейтинг: 246
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: Shurik]
      16.07.2012 17:11
 


 
В ответ на:


This is another situation where EXECUTE can be used to force a new plan to be generated for each execution.
  



Там, откуда ты взял эту цитату, речь идет о plpgsql execute, который не имеет никакого отношения к SQL execute, кроме названия.

Shurik

Рег.: 27.09.2003
Сообщений: 13644
Рейтинг: 787
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: DDD2]
      16.07.2012 19:52
 

вбей фразу в гугл



not fluffing up the experience with features that will ultimately cause you a headache
Shurik

Рег.: 27.09.2003
Сообщений: 13644
Рейтинг: 787
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: DDD2]
      29.08.2012 23:30
 

вот случайно натолкнулся, специально для вас все расписали, как раз PostgreSQL http://thoughts.j-davis.com/2011/07/09/building-sql-strings-...



not fluffing up the experience with features that will ultimately cause you a headache
DDD2
sir

Рег.: 23.11.2007
Сообщений: 1102
Рейтинг: 246
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: Shurik]
      30.08.2012 10:32
 

В ответ на:

специально для вас все расписали, как раз PostgreSQL



Это старая статья. Мой пример работает начиная с версии 9.2.
 
В ответ на:



Allow the planner to generate custom plans for specific parameter values even when using prepared statements (Tom Lane)

In the past, a prepared statement always had a single "generic" plan that was used for all parameter values, which was frequently much inferior to the plans used for non-prepared statements containing explicit constant values. Now, the planner attempts to generate custom plans for specific parameter values. A generic plan will only be used after custom plans have repeatedly proven to provide no benefit. This change should eliminate the performance penalties formerly seen from use of prepared statements (including non-dynamic statements in PL/pgSQL).
  




Shurik

Рег.: 27.09.2003
Сообщений: 13644
Рейтинг: 787
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: DDD2]
      30.08.2012 11:05
 

Quote:

Это старая статья. Мой пример работает начиная с версии 9.2.



Во-первых. Старая статья? Ты про 9.2, который еще не зарелизен?
Во-вторых, например, MS SQL Server вот такое "Now, the planner attempts to generate custom plans for specific parameter values" делает уже давно (и есть хинт для отключения этого). Но это проблему не решает. По моей ссылке объясняется, что проблема не разрешима в принципе. Там логическая цепочка из трех шагов, если ты ее не в состоянии понять, то донести до тебя эту информацию не предоставляется возможным.





not fluffing up the experience with features that will ultimately cause you a headache
Shurik

Рег.: 27.09.2003
Сообщений: 13644
Рейтинг: 787
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: Shurik]
      30.08.2012 11:54
 

Quote:

проблема не разрешима в принципе



наверное, можно делать ключи кеша с учетом значений параметров, выделяя специальные значения такие как NULL, но это усложнение, и пока ни одна СУБД так не делает.



not fluffing up the experience with features that will ultimately cause you a headache
Shurik

Рег.: 27.09.2003
Сообщений: 13644
Рейтинг: 787
  Re: Где в интернете можно обсудить dynamic sql automatic checking? [re: DDD2]
      30.08.2012 11:59
 

Quote:

explain execute testq(1234456);



надо смотреть не так, а прям вытащить план из кеша (в MS SQL Server такое можно, думаю и в посгресе тоже).



not fluffing up the experience with features that will ultimately cause you a headache
Страницы: 0 | 20 | 40 | 60 | 80 | 100 | показать все

Technical >> Development (Archive)

Дополнительная информация
2 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в