Liczba wieszy zwrócona przez zapytanie select (MSSQL Server 2008R2)

0

Cześć.
Mam następujący problem: dostaję od użytkownika jakieś zapytanie select i chcę się dowiedzieć jak najmniejszym kosztem, ile wierszy zwróci to zapytanie. Przez jak najmniejszy koszt rozumiem brak konieczności parsowania otrzymanego zapytania i jego modyfikacji, a także brak konieczności wykonania go na bazie i ręcznego zliczania wierszy bądź wykonywania po wszystkim @@ROWCOUNT.
Próbowałem wykorzystać do tego count()* w następujący sposób: dla przykładowego zapytania

select * from tabelka

chciałem zrobić coś takiego:

select count(*) from (select * from tabelka) as tempTable

ale ta metoda nie zadziała, jeżeli oryginalne zapytanie zawiera iloczyn kartezjański. Przykładowo dla takiego orgyinalnego zapytania

select * from tabelka a, tabelka b

po przeróbce otrzymam błąd, że jakaś kolumna została wyspecyfikowana dwukrotnie.
Próbowałem też podmienić wszystko od select do from i wstawić tam count()*, ale to zepsuje mi się dla funkcji agregujących, bo na przykład z takiego zapytania:

select max(ID) from tabelka

otrzymam:

select count(*) from tabelka

co oczywiście daje zły wynik. Używam MS SQL Server 2008R2.
Będę wdzięczny za jakieś wskazówki.
Pozdrawiam,
Afish

0

U mnie bez problemu działa:

SELECT COUNT(1) FROM (SELECT t1.id AS 'id1', t2.id AS 'id2' FROM dbo.tabela AS t1, dbo.tabela2 AS t2) AS t;
0

Działać działa, ale nie mogę przyjąć, że użytkownik będzie tak miły i nie poda mi zapytania

select * from tabelka a, tabelka b

A jak wspomniałem, chcę jak najmniej modyfikować oryginalne zapytanie (najlepiej wcale).

0

można również tak:

WITH TMP AS(
 /* 
Twoje przykładowe zapytanie:
*/
Select * from tab1, tab2

)
	
Select COUNT(1)  from TMP;
0
Afish napisał(a):

Działać działa, ale nie mogę przyjąć, że użytkownik będzie tak miły i nie poda mi zapytania

select * from tabelka a, tabelka b

A jak wspomniałem, chcę jak najmniej modyfikować oryginalne zapytanie (najlepiej wcale).

Ale chcesz się zabezpieczyć przed iloczynem kartezjańskim czy nieoptymalnymi zapytaniami?
Bo jeśli to drugie to bez odpalania planu zapytania i jego parsowania będzie ciężko...
Równie dobrze nieoptymalne może być nawet

select * from tabelka a

.

0

@vpiotr: Tak właściwie, to nie chcę się zabezpieczać przed niczym - potrzebuję znać tylko liczbę wierszy zwróconą przez zapytanie i szukam sposobu, aby wyciągnąć tę liczbę bez wykonywania zapytania na bazie (bo i bez hardego parsowania zapytania). Zdaję sobie sprawę, że nawet najprostszy select może zajechać bazę i dlatego nie chcę go wykonywać bez potrzeby.

0
Afish napisał(a):

potrzebuję znać tylko liczbę wierszy zwróconą przez zapytanie i szukam sposobu, aby wyciągnąć tę liczbę bez wykonywania zapytania na bazie

NIE DA SIĘ, pomijam zapytania, które nigdy nie zwrócą rekordu (warunek w stylu AND 1 = 2) czy takie, które zawsze zwracają jedno zapytanie (zwraca same agregacje bez grupowania)

0

Lol, jezeli nie chcesz wykonywac zapytania to nie sprawdzisz ilosci rekordow. Nawet jak dasz zapytanie w podzapytaniu i sprawdzisz tylko count to zapytanie wewnetrzne i tak sie wykona...

0

Ech, zdaję sobie z tego sprawę. Miałem na myśli, że nie chcę wykonać tylko tego zapytania i potem sprawdzać ROWCOUNT albo coś w ten deseń. Szukam sposobu, jeżeli się nie da, to trudno.

0

możesz zrobić przez niewielką zmianę zapytania, tzn. pomiędzy SELECT a FROM</code> w zapytaniu wstawiasz <code>1 AS Col, np.
dla:

SELECT * FROM tabelka a, tabelka b

robisz:

SELECT COUNT(1) FROM (SELECT 1 AS Col FROM tabelka a, tabelka b) zapytanie

itd.

0

To też nie jest rozwiązanie... Ogólne, bo na jego potrzeby wystarczy. 'Popsuje' się na zapytaniach typu: SELECT id, sklep FROM sklepy UNION SELECT id, magazyn FROM magazyny UNION SELECT id, biuro FROM biura, czy też na zapytanie bez FROM: SELECT 'ala'

0
Afish napisał(a):

Ech, zdaję sobie z tego sprawę. Miałem na myśli, że nie chcę wykonać tylko tego zapytania i potem sprawdzać ROWCOUNT albo coś w ten deseń. Szukam sposobu, jeżeli się nie da, to trudno.

Nie rozumiem dlaczego nie chcesz skorzystać z ROWCOUNT.

0

w Oracle ilość wierszy dla określonego użytkownika wypisuję następująca instrukcja :

 SELECT table_name, tablespace_name, num_rows
   FROM dba_tables WHERE owner='OLA' ORDER BY num_rows DESC;

jest to również zapytanie SQL, ale wykonane po widoku słownikowym.

a w Microsoft SQL Server 2008

EXEC sp_spaceused 'nazwa_tabeli'

1 użytkowników online, w tym zalogowanych: 0, gości: 1