Shurik
|
|
|
|
|
Рег.: 27.09.2003
|
Сообщений: 13644
|
|
Рейтинг: 787
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: Mike]
11.07.2012 18:00
|
|
|
Quote:
Допустим, заебало меня делать всякие q_Q, и я написал вместо одного: q._(" where 1 = 1"); if (d) q._(" and a.type_id = 1");
другое: q._(" where 1 = 1" + (d ? " and a.type_id = 1" : ""));
Подходят оба варианта. Вообще, класс Q это обертка над StringBuilder c одной целью - автоматически вызывать IParam.ToSql(). По желанию можешь отказаться от автоматического вызова и переложить эту ответственность на code review.
public class Q
{
public readonly StringBuilder Builder;
public Q(string value)
{
Builder = new StringBuilder(value);
}
public Q _(string value)
{
Builder.Append(value);
return this;
}
public Q _<T>(IParam<T> param)
{
return _(param.ToSql());
}
}
|
not fluffing up the experience with features that will ultimately cause you a headache |
|
Mike
|
Ызарг
|
|
|
|
Рег.: 02.11.2002
|
Сообщений: 8098
|
|
Рейтинг: 2147
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: Shurik]
11.07.2012 18:10
|
|
|
Quote:
Подходят оба варианта.
Нет, в нашем примере второй вариант не подходит.
|
|
Shurik
|
|
|
|
|
Рег.: 27.09.2003
|
Сообщений: 13644
|
|
Рейтинг: 787
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: Mike]
11.07.2012 18:17
|
|
|
Quote:
Нет, в нашем примере второй вариант не подходит.
почему?
|
not fluffing up the experience with features that will ultimately cause you a headache |
|
blykynqp
|
sir
|
|
|
|
Рег.: 13.11.2004
|
Сообщений: 1042
|
|
Рейтинг: 724
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: Shurik]
11.07.2012 19:27
|
|
|
Вот когда ты оплатишь, тогда тебе и будет решение твоей задачи. Пока же я отвечал тебе на другой вопрос, как выглядит мой код. Если тебе до сих пор принципиально узнать, как неспециалист разбирает cmd.ExecuteReader(), я таки попрошу оплаты - как будто мне делать больше нечего, чем перед идиотом распинаться "сделай то, сделай се", когда все уже написано (я на дотнете не пишу обычно, код очень близок к мсдн)
|
|
Shurik
|
|
|
|
|
Рег.: 27.09.2003
|
Сообщений: 13644
|
|
Рейтинг: 787
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: blykynqp]
11.07.2012 23:05
|
|
|
Quote:
Вот когда ты оплатишь, тогда тебе и будет решение твоей задачи.
Давай, называй цену.
|
not fluffing up the experience with features that will ultimately cause you a headache |
|
blykynqp
|
sir
|
|
|
|
Рег.: 13.11.2004
|
Сообщений: 1042
|
|
Рейтинг: 724
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: Shurik]
11.07.2012 23:59
|
|
|
и чо, правда заплатишь? Про оплату сказал только потому что ты сказал, что "заказчик оплатил". Давай серьезно - ты привел в пример поделку, я тоже. но ты рекламируешь свой продукт, я просто спрашиваю, нахрена он мне нужен. Я готов делиться кодом бесплатно, если считаю его общественно полезным Кстати, примерно из той же области - про поддержку кода web-страница
|
|
DDD2
|
sir
|
|
|
|
Рег.: 23.11.2007
|
Сообщений: 1102
|
|
Рейтинг: 246
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: blykynqp]
12.07.2012 17:15
|
|
|
Шурик, я в прошлом твоем треде предлагал такое решение . Ты возразил, что там всегда будет фулскан. Сегодня я проверил это на постгресе:
code:
postgres=# create table test as select id from generate_series(1,1000000) t(id);
SELECT 1000000
postgres=# create index testi on test(id);
CREATE INDEX
postgres=# prepare testq(integer) as select * from test where ($1 is null or id = $1);
PREPARE
postgres=# explain execute testq(1234456);
QUERY PLAN
------------------------------------------------------------------------
Bitmap Heap Scan on test (cost=96.10..4793.98 rows=5000 width=4)
Recheck Cond: (id = 1234456)
-> Bitmap Index Scan on testi (cost=0.00..94.85 rows=5000 width=0)
Index Cond: (id = 1234456)
(4 rows)
postgres=# explain execute testq(null);
QUERY PLAN
--------------------------------------------------------------
Seq Scan on test (cost=0.00..14425.00 rows=1000000 width=4)
(1 row)
Как видим, в не самом продвинутом постгресе все хорошо с планами такого рода препаренных запросов. Ты уверен что в SQL сервере есть такие проблемы? Я бы сам проверил, но лень возиться с установкой.
|
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31408
|
|
Рейтинг: 8951
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: DDD2]
12.07.2012 17:24
|
|
|
Quote:
Как видим, в не самом продвинутом постгресе все хорошо с планами такого рода препаренных запросов.
раз на раз обычно не приходится. Чуть запрос усложнишь и хороший план летит к черту.
|
|
DDD2
|
sir
|
|
|
|
Рег.: 23.11.2007
|
Сообщений: 1102
|
|
Рейтинг: 246
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: DarkGray]
12.07.2012 17:33
|
|
|
В ответ на:
Чуть запрос усложнишь и хороший план летит к черту.
Можно пример такого, что шуриковский план не летит к черту, а предложенный мной летит? Шурика волновало, что СУБД не делает constant folding для препаренных запросов. Из моего примера видно, что делает. Что еще надо?
|
|
Shurik
|
|
|
|
|
Рег.: 27.09.2003
|
Сообщений: 13644
|
|
Рейтинг: 787
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: DDD2]
12.07.2012 17:57
|
|
|
Quote:
Шурика волновало, что СУБД не делает constant folding для препаренных запросов.
То, о чем ты говоришь, известная проблема. Почитай форумы и статьи. Суть там в использовании кеша планов запросов. Для подстановки констант серверу требуется разбор запроса, а он старается использовать уже готовый план из кеша. Есть специальный хинт на запрос для перекомпиляции каждый раз.
|
not fluffing up the experience with features that will ultimately cause you a headache |
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31408
|
|
Рейтинг: 8951
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: DDD2]
12.07.2012 17:58
|
|
|
Quote:
create table test as select id from generate_series(1,1000000) t(id);
сделай нормальную таблицу с большим кол-вом колонок. таблица с колонкой из одного ключа особая, т.к. индекс имеет данные по всему ряду, что не бывает для нормальных таблиц
|
|
Shurik
|
|
|
|
|
Рег.: 27.09.2003
|
Сообщений: 13644
|
|
Рейтинг: 787
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: Shurik]
12.07.2012 17:59
|
|
|
Кстати, разработчики BLToolkit говорили, что подставляют константы при генерации SQL из LINQ. Но BLToolkit это BLToolkit
|
not fluffing up the experience with features that will ultimately cause you a headache |
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31408
|
|
Рейтинг: 8951
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: DDD2]
12.07.2012 18:00
|
|
|
у меня вот уже такой запрос хочет table scan
code:
declare @rank int
set @Rank =12
select id, rank, data
from temp
where @rank is null or Rank = @Rank
а такой
code:
declare @rank int
set @Rank =12
select id, rank, data
from temp
where Rank = @Rank
делает index_seek, при условии что все колонки included
|
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31408
|
|
Рейтинг: 8951
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: Shurik]
12.07.2012 18:02
|
|
|
Quote:
Кстати, разработчики BLToolkit говорили, что подставляют константы при генерации SQL из LINQ
это вроде палка о двух концах. если подставлять константы, то каждый запрос становится уникальный, и у sql bd не получается использовать авто-кэширование планов запросов.
|
|
Shurik
|
|
|
|
|
Рег.: 27.09.2003
|
Сообщений: 13644
|
|
Рейтинг: 787
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: DarkGray]
12.07.2012 18:16
|
|
|
Quote:
это вроде палка о двух концах. если подставлять константы, то каждый запрос становится уникальный, и у sql bd не получается использовать авто-кэширование планов запросов.
они вроде там хитро делаю, вычисляют определенный класс выражений типа "@p IS NULL", а основную массу параметров отправляют на сервер как параметры. Это приводит к достаточно конечному множеству запросов.
|
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: DarkGray]
12.07.2012 18:19
|
|
|
code:
postgres=# drop table test;
DROP TABLE
postgres=# create table test as
postgres-# select
postgres-# id,
postgres-# md5(id||'foo') as foo,
postgres-# md5(id||'bar') as bar,
postgres-# lpad('',100,md5(id||'baz')) as baz
postgres-# from generate_series(1,1000000) t(id);
SELECT 1000000
postgres=# create index testi on test(id,bar);
CREATE INDEX
postgres=# prepare testq(integer,text) as select * from test where ($1 is null or id = $1) and ($2 is null or bar = $2);
ERROR: prepared statement "testq" already exists
postgres=# deallocate testq;
DEALLOCATE
postgres=# prepare testq(integer,text) as select * from test where ($1 is null or id = $1) and ($2 is null or bar = $2);
PREPARE
postgres=# explain execute testq(100500,'qq');
QUERY PLAN
---------------------------------------------------------------------
Bitmap Heap Scan on test (cost=7.39..105.39 rows=25 width=100)
Recheck Cond: ((id = 100500) AND (bar = 'qq'::text))
-> Bitmap Index Scan on testi (cost=0.00..7.38 rows=25 width=0)
Index Cond: ((id = 100500) AND (bar = 'qq'::text))
(4 rows)
|
|
DDD2
|
sir
|
|
|
|
Рег.: 23.11.2007
|
Сообщений: 1102
|
|
Рейтинг: 246
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: DarkGray]
12.07.2012 18:25
|
|
|
В ответ на:
у меня вот уже такой запрос хочет table scan
Значит, для SQL сервера это не работает. По-видимому, это не является принципиальным ограничением (постгрес как-то это делает). Следовательно, всех устраивает конкатенация строк.
|
|
vond
|
|
|
|
|
Рег.: 08.04.2004
|
Сообщений: 6076
|
Из: Москва
|
Рейтинг: 1202
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: DDD2]
12.07.2012 18:29
|
|
|
В ответ на:
постгрес как-то это делает
оракл тоже
в очередной раз сделал для себя вывод - держаться подальше от MSSQL
|
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31408
|
|
Рейтинг: 8951
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: DDD2]
12.07.2012 18:32
|
|
|
где-то присутствует жульничество. получение колонок id, foo, bar, baz не может быть выполнено только из индекса testi, т.к. там хранятся только колонки id, bar. Обязательно еще должен быть запрос к кластерному индексу для получения колонок foo, baz. Либо testi является кластерным индексом, но тогда понятно почему план запросов всегда делается через него.
ps добавь еще индекс по bar и покажи, что происходит если последовательно спрашивать через testq: id != null, bar == null id != null, bar != null id == null, bar != null id == null, bar == null
тоже самое желательно еще проделать с тремя колонками id, foo, bar, используя восемь запросов и имея индексы: кластерный id, foo, bar некластерный foo, bar некластерный id, bar некластерный bar
|
|
Shurik
|
|
|
|
|
Рег.: 27.09.2003
|
Сообщений: 13644
|
|
Рейтинг: 787
|
|
Re: Где в интернете можно обсудить dynamic sql automatic checking?
[re: vond]
12.07.2012 18:36
|
|
|
Quote:
в очередной раз сделал для себя вывод - держаться подальше от MSSQL
в очередной раз не разобравшись в проблеме. Проблема общая и об этом везде пишут.
|
not fluffing up the experience with features that will ultimately cause you a headache |
|