Как получить количество отдельных строк из каждой таблицы в соединении с T-SQL, не зная, какие поля являются уникальными в каждой таблице? - PullRequest
0 голосов
/ 23 мая 2019

Я унаследовал сотни хранимых процедур.Каждая хранимая процедура включает в себя более десятка соединенных таблиц и TVF.Эта задача, одна из многих, состоит в том, чтобы понять производительность хранимых процедур, посмотрев, сколько строк каждая таблица вносит в окончательный оператор, с непростительной трудностью, заключающейся в том, что мы не знаем, какие значения столбцов уникальны в каждой таблице.

Я использую T-SQL с SQL Server 2014 и привык к Oracle.В Oracle я использовал что-то вроде rowid из каждой таблицы и делал подсчет различных значений в конечном соединенном запросе, как часть аналитического запроса, но я не знаю ни одного подобного поля в T-SQL и всехспособы, по которым я искал ответ, ничего не дали

CREATE TABLE    #CUSTOMER       
(           
    C_ID    INTEGER ,
    NAME    NVARCHAR(10)    
)   ;       

INSERT INTO #CUSTOMER   VALUES( 1   ,   'AL'    );
INSERT INTO #CUSTOMER   VALUES( 2   ,   'BOB'   );
INSERT INTO #CUSTOMER   VALUES( 2   ,   'JOE'   );
INSERT INTO #CUSTOMER   VALUES( 3   ,   'SAM'   );

CREATE TABLE    #ORDER      
(           
    O_ID    INTEGER ,
    C_ID    INTEGER ,
    I_ID    INTEGER ,
    Quantity    INTEGER 
)   ;       

INSERT INTO #ORDER VALUES(10,1,20,4);
INSERT INTO #ORDER VALUES(11,2,20,6);
INSERT INTO #ORDER VALUES(12,2,21,6);
INSERT INTO #ORDER VALUES(13,2,21,6);

CREATE TABLE    #ITEM       
(           
    I_ID    INTEGER ,
    NAME    NVARCHAR(10)    
);          


INSERT INTO #ITEM VALUES(20,'FORK');
INSERT INTO #ITEM VALUES(21,'KNIFE');
INSERT INTO #ITEM VALUES(22,'SPOON');


select 
    count(distinct c.rowId), count(distinct i.row_Id), count(distinct o.rowId) 
from #CUSTOMER c
join #ORDER o ON
    c.C_ID = o.C_ID
join #ITEM i ON 
    o.i_ID = i.i_ID;

Ожидаемый результат:

cust_count |item_count |order_count

3 |4 |2

К сожалению, приведенное выше утверждение не работает, так как rowid не имеет смысла в SQL Server.

Я не могу сделать четкий подсчет C_ID, I_ID или O_ID, потому что, как указано, я не знаю, уникальны ли они (чего нет в этом сфабрикованном случае и, следовательно, дают неправильный результат).

Я не могу сделать подсчет для всех отдельных таблиц, так как не все строки в таблицах появляются в объединениях.

Я не могу использовать оконную функцию, поскольку это означало бы переписывание операторов соединения для сотен хранимых процедур, что уже огромно в любом случае.

В конечном счете, то, что ястремление к достижению - это понимание того, что для конкретного объединения 1 миллиард строк взят из одной таблицы, но только 10 - из другой - как крайний пример.

1 Ответ

0 голосов
/ 23 мая 2019

Я понимаю ваш вопрос, но понятия не имею, какое отношение к нему имеет пример кода.Итак, это объяснит, как получить эквивалентную функциональность для count(distinct).

. Вы можете сделать count(distinct) в SQL Server, используя два уровня оконных функций.

Если у вас есть

select count(distinct x) over (partition by y)
from a

Тогда вы можете сделать:

select a.*,
       max(dr) over (partition by y) as count_distinct
from (select a.*, dense_rank() over (partition by y order by x) as dr
      from a
     ) a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...