DDD2
|
sir
|
|
|
|
Рег.: 23.11.2007
|
Сообщений: 1102
|
|
Рейтинг: 246
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: DarkGray]
12.07.2012 18:42
|
|
|
В ответ на:
получение колонок 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
|
|
|
да, я облажался на примере 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
|
|
|
В ответ на:
Сегодня я проверил это на постгресе:
Долго думал как может работать эта черная магия.
Оказалось все просто:
В ответ на:
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
|
|
|
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
|
|
|
|
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 |
|