Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / select count(*) from execute sp_name / 7 сообщений из 7, страница 1 из 1
14.06.2006, 16:27
    #33790771
VDAT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select count(*) from execute sp_name
подскажите как выйти с такой ситуации:
есть с десяток ХП, каждая возвращает рекордсет, иногда довольно большой :(
решил сделать предварительный подсчет записей, чтоб знать стоит ли выполнять саму ХП, или поменять параметры ХП.
Конструкция типа select count(*)from execute sp_name по понятным причинам не выполнится. 3апихнуть Select COUNT(*) в отдельную ХП (в ней же вызвать execute sp_name) тоже к добру не приведет, быстродействие системы пострадает значительно (кому нужны временные курсоры). Менять все ХП тоже не хочется.
Как быть в такой ситуации? Если есть выход - подскажите.

Respect заранее.
...
Рейтинг: 0 / 0
14.06.2006, 16:35
    #33790808
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select count(*) from execute sp_name
...
Рейтинг: 0 / 0
14.06.2006, 17:10
    #33790953
VDAT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select count(*) from execute sp_name
приношу свои извинения:
Сервер: Sybase ASE-12.5
ОСь: w2k/SP4
Железо:Celeron 2.5/256DDR
...
Рейтинг: 0 / 0
14.06.2006, 17:34
    #33791049
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select count(*) from execute sp_name
SELECT * FROM SP() в ASE нет, так что этот вариант отпадает сразу. Заполнять времянки и возвращать данные или кол-во с учетом большого кол-ва данных - просядет производительность. Мое IMHO, как человека наслышанного, но не знающего ASE, но представляющего себе MSSQL, с точки зрения борьбы за производительность без слишком больших трудозатрат и сохранения конечной функциональности процедур для клиентских приложений:

Вариант 1: сделать дублирующие процедуры путем копирования существующих процедур и там вместо полей возвращать Count(). Плюсы - не страдает производительность, не нужно переписывать существующие процедуры. Минусы - сопровождать придется вдвое больше процедур.

Вариант 2: вынести фильтрующую логику в отдельные процедуры, которые заполняют созданные в вызвавших их процедурах времянки, но только на уровне уникальных полей (PK). Тогда с любой процедуры можно вызвать фильтрующую процедуру, которая заполнит времянку на уровне ключей и далее или посчитать их кол-во или же вернуть нужный набор данных, что то типа того:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
CREATE PROCEDURE sp_proc1_pre (@field1 int)
AS
BEGIN
  INSERT INTO #t (id)
    SELECT id
    FROM Table1
    WHERE field1 = @field1
END

CREATE PROCEDURE sp_proc1_data (@field1 int)
AS
BEGIN
  CREATE TABLE #t (id NOT NULL PRIMARY KEY)

  CALL sp_proc1_pre (@field1)

  SELECT *
  FROM Table1
  WHERE id IN (SELECT id FROM #t)
END

CREATE PROCEDURE sp_proc1_count (@field1 int)
AS
BEGIN
  CREATE TABLE #t (id NOT NULL PRIMARY KEY)

  CALL sp_proc1_pre (@field1)

  SELECT Count(*)
  FROM #t
END
Плюсы такого подхода - не особо теряется производительность, централизуется логика, где на "pre" процедуры могут существовать множество процедур, далее обрабатывающих результаты фильтрации. Минусы - необходимо переписать и модернизировать существующие процедуры.

Если работа разовая, то вполне достаточно варианта 1, если нет, что мне больше по душе второй вариант, во всяком случае у меня на нем реализована фильтрация каталога интернет-магазина с тысячами наименований товаров по десяткам различных разрезов, где все работает шустро и "pre" процедурой пользуются множество процедур для дальнейшей обработки (тут правда стоит сделать оговорку, что сделано это на ASA у которой дюже умный оптимизатор запросов и внутри такой процедуры используется динамический SQL, который в ASA не имеет проблем с производительностью, правами доступа, учетом статистики и другими вещами, которые иногда дают множество ограничений на использование динамического SQL в других РСУБД).

--
www.rusug.ru - портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
14.06.2006, 18:11
    #33791202
VDAT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select count(*) from execute sp_name
спасибо за исчерпывающий ответ
2-й вариант мне тоже по душе
...
Рейтинг: 0 / 0
14.06.2006, 19:06
    #33791361
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select count(*) from execute sp_name
А я делаю что-то подобное второму варианту, только в одной общей ХП. Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE PROCEDURE sp_proc1 (in @rep_part int, in @field1 int)
BEGIN

  CREATE TABLE #t (id NOT NULL PRIMARY KEY);

  INSERT INTO #t (id)
    SELECT id
    FROM Table1
    WHERE field1 = @field1;

  if @rep_part =  0  then
     select count(*) from #t;
  else
     select * from #t;
  end if;
END;
То есть сначала в процедуре делается какая-то общая часть, а потом выдается один или другой резалтсет.
Минусы подхода - клиент должен знать кода резалтсетов которые он дает в @rep_part. И уметь работать с вариантными резатсетами из процедур.
Плюсы - вся логика в одном месте.

---
http://www.rusug.ru] Портал рускоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
19.06.2006, 18:24
    #33800839
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select count(*) from execute sp_name
Я бы заметил общую бредовость РАДИ ПОВЫШЕНИЯ ПРОИЗВОДИТЕЛЬНОСТИ или ЧТОБЫ НЕ ВЫПОЛНЯТЬ ПРОЦЕДУРУ вычислять кол-во строк, которое будет возвращать хранимая процедура. Потому что вы просто БУДЕТЕ ВЫПОЛНЯТЬ ЭТИ СЛОЖНЫЕ ЗАПРОСЫ ДВА РАЗА (минимум - один, для вычисления кол-ва строк). Поэтому я бы рекомендовал изобрести другие, более простые запросы, которые могли бы дать общую ощенку сложности тех данных, что будут получены при выполнении основных процедур. При этом эти запросы ДОЛЖНЫ БЫТЬ существенно проще основных, чтобы стоимость их выполнения была бы много ниже.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / select count(*) from execute sp_name / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]