Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/ashowflat.php?Number=11013237&src=&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 01:21:19 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 | показать все | след. страница
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 :smirk:



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
1

Quote:

в очередной раз сделал для себя вывод - держаться подальше от MSSQL



в очередной раз не разобравшись в проблеме. Проблема общая и об этом везде пишут.



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 включен

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

Переход в