Я унаследовал сотни хранимых процедур.Каждая хранимая процедура включает в себя более десятка соединенных таблиц и 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 - из другой - как крайний пример.