Czy istnieje jakakolwiek różnica między grupą a odrębną

Pewnego dnia nauczyłem się czegoś prostego o SQL:

SELECT c FROM myTbl GROUP BY C

Ma taki sam wynik jak:

SELECT DISTINCT C FROM myTbl

Co mnie ciekawi, czy jest coś innego w sposobie, w jaki silnik SQL przetwarza polecenie, czy naprawdę są one takie same?

Osobiście wolę odrębną składnię, ale jestem pewien, że jest to bardziej z przyzwyczajenia niż cokolwiek innego.

EDIT: to nie jest pytanie o Agregaty. Użycie GROUP BY Z FUNKCJAMI zbiorczymi jest zrozumiałe.

Author: Brettski, 2008-10-03

24 answers

MusiGenesis ' odpowiedź jest funkcjonalnie poprawna w odniesieniu do twojego pytania, jak stwierdzono; serwer SQL jest wystarczająco inteligentny, aby zdać sobie sprawę, że jeśli używasz "Group By", a nie używasz żadnych funkcji agregujących, to to, co masz na myśli, jest "odrębne" - i dlatego generuje plan wykonania tak, jakbyś po prostu użył "Distinct"."

Jednak myślę,że warto zwrócić uwagę na odpowiedź Hanka - traktowanie "grupowo" i "odrębnie" może prowadzić do jeśli nie będziesz ostrożna, to jakaś zgubna sprawa. Nie do końca poprawne jest stwierdzenie, że to "nie jest pytanie o Agregaty", ponieważ pytasz o funkcjonalną różnicę między dwoma słowami kluczowymi zapytania SQL, z których jeden jest przeznaczony do użycia z agregatami , a jeden z nich nie jest.

Młotek może czasem zadziałać, żeby wkręcić śrubę, ale jeśli masz pod ręką śrubokręt, po co się trudzić?

(... dla celów tej analogii, Hammer : Screwdriver :: GroupBy : Distinct i screw => get list of unique values in a table column)

 185
Author: Skeolan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-14 20:04:23

GROUP BY umożliwia korzystanie z funkcji agregujących, takich jak AVG, MAX, MIN, SUM, i COUNT. Druga ręka DISTINCT po prostu usuwa duplikaty.

Na przykład, jeśli masz kilka rekordów zakupu i chcesz wiedzieć, ile wydało każdy dział, możesz zrobić coś takiego:

SELECT department, SUM(amount) FROM purchases GROUP BY department

To da ci jeden wiersz na Dział, zawierający nazwę działu i sumę wszystkich wartości amount we wszystkich wierszach dla tego działu.

 118
Author: Andru Luvisi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-31 11:25:43

Nie ma różnicy (przynajmniej w SQL serverze). Oba zapytania używają tego samego planu wykonania.

Http://sqlmag.com/database-performance-tuning/distinct-vs-group

Może istnieje jest różnica, jeśli istnieją zapytania podrzędne:

Http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/

Nie ma różnicy "Oracle-style"): {]}

Http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212

 38
Author: MusiGenesis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-05 00:28:33

Użyj DISTINCT, jeśli chcesz tylko usunąć duplikaty. Użyj GROUPY BY, jeśli chcesz zastosować operatory agregujące (MAX, SUM, GROUP_CONCAT, ..., lub HAVING klauzula).

 29
Author: jkramer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-05 05:09:47

Jaka jest różnica z punktu widzenia zwykłej funkcji usuwania duplikatów

Poza tym, że w przeciwieństwie do DISTINCT, GROUP BY pozwala na agregację danych na Grupę (o czym wspominało wiele innych odpowiedzi), najważniejszą różnicą jest moim zdaniem fakt, że obie operacje "dzieją się" na dwóch bardzo różnych etapach w logicznej kolejności operacji, które są wykonywane w SELECT} instrukcji.

Oto najważniejsze operacje:

  • FROM (w tym JOIN, APPLY, itd.)
  • WHERE
  • GROUP BY (może usuwać duplikaty)
  • agregacje
  • HAVING
  • funkcje okna
  • SELECT
  • DISTINCT (może usuwać duplikaty)
  • UNION, INTERSECT, EXCEPT (może usuwać duplikaty)
  • ORDER BY
  • OFFSET
  • LIMIT

Jak widać, logiczny porządek każdej operacji wpływa na to, co można z nim zrobić i jak wpływa na kolejne operacje. W szczególności fakt, że operacja GROUP BY "dzieje się przed" operacja SELECT (projekcja) oznacza, że:

    To nie zależy od projekcji (co może być zaletą)]} Nie można użyć żadnych wartości z projekcji (co może być wadą)

1. To nie zależy od projekcji

Przykład, w którym nie zależy od projekcja jest przydatna, jeśli chcesz obliczyć funkcje okna na różnych wartościach:

SELECT rating, row_number() OVER (ORDER BY rating) AS rn
FROM film
GROUP BY rating

Po uruchomieniu z bazy danych Sakila , daje to:

rating   rn
-----------
G        1
NC-17    2
PG       3
PG-13    4
R        5

To samo nie da się osiągnąć z DISTINCT łatwo:

SELECT DISTINCT rating, row_number() OVER (ORDER BY rating) AS rn
FROM film

To zapytanie jest " złe " i daje coś w stylu:

rating   rn
------------
G        1
G        2
G        3
...
G        178
NC-17    179
NC-17    180
...
Nie tego chcieliśmy. DISTINCT operacja "dzieje się po" projekcji, więc nie możemy już usuwać DISTINCT ocen, ponieważ funkcja okna była już obliczone i zaplanowane. Aby użyć DISTINCT, musimy zagnieżdżać tę część zapytania:
SELECT rating, row_number() OVER (ORDER BY rating) AS rn
FROM (
  SELECT DISTINCT rating FROM film
) f

Uwaga: w tym konkretnym przypadku możemy również użyć DENSE_RANK()

SELECT DISTINCT rating, dense_rank() OVER (ORDER BY rating) AS rn
FROM film

2. Nie może używać żadnych wartości z projekcji

Jedną z wad SQL jest jego zwięzłość czasami. Z tego samego powodu, co widzieliśmy wcześniej (mianowicie logiczny porządek operacji), nie możemy "łatwo" grupować według czegoś, co projektujemy.

To jest niepoprawne SQL:

SELECT first_name || ' ' || last_name AS name
FROM customer
GROUP BY name

To jest poprawne (powtarzanie wyrażenia)

SELECT first_name || ' ' || last_name AS name
FROM customer
GROUP BY first_name || ' ' || last_name

To również jest poprawne (zagnieżdżanie wyrażenia)

SELECT name
FROM (
  SELECT first_name || ' ' || last_name AS name
  FROM customer
) c
GROUP BY name

Pisałem na ten temat bardziej szczegółowo w poście na blogu

 20
Author: Lukas Eder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-23 07:43:13

Spodziewam się, że istnieje możliwość subtelnych różnic w ich wykonaniu. Sprawdziłem plany wykonania dwóch równoważnych funkcjonalnie zapytań w Oracle 10g:

core> select sta from zip group by sta;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH GROUP BY     |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

core> select distinct sta from zip;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH UNIQUE       |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

Operacja Środkowa jest nieco inna: "HASH GROUP BY" vs. "hash UNIQUE", ale szacowane koszty itp. są identyczne. Następnie wykonałem je z włączonym śledzeniem i rzeczywiste liczniki operacji były takie same dla obu (z tym, że drugi nie musiał wykonywać żadnych fizycznych odczytów z powodu buforowanie).

Ale myślę, że ponieważ nazwy operacji są różne, wykonanie będzie podążać nieco innymi ścieżkami kodu, co otwiera możliwość bardziej znaczących różnic.

Myślę, że powinieneś preferować odrębną składnię do tego celu. To nie tylko nawyk, to wyraźniej wskazuje cel zapytania.

 19
Author: Dave Costa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 20:51:01

Dla zapytania, które napisałeś, są identyczne. Ale dla innych zapytań, które mogą nie być prawdziwe.

Na przykład, to nie to samo co:

SELECT C FROM myTbl GROUP BY C, D
 14
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 20:11:37

Mają inną semantykę, nawet jeśli mają równoważne wyniki na konkretnych danych.

 11
Author: Hank Gay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 20:10:10

Jeśli użyjesz funkcji DISTINCT z wieloma kolumnami, zestaw wyników nie będzie pogrupowany tak, jak z funkcją GROUP BY i nie możesz używać funkcji agregujących z funkcją DISTINCT.

 11
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 20:12:00

Przeczytałem wszystkie powyższe komentarze, ale nie widziałem, żeby ktoś wskazywał na główną różnicę między Group By a Distinct oprócz bitu agregacji.

Distinct zwraca wszystkie wiersze, a następnie je de-duplikuje, podczas gdy grupowanie przez de-deduplikację wierszy, gdy są odczytywane przez algorytm jeden po drugim.

Oznacza to, że mogą one przynieść różne rezultaty!

Na przykład poniższe kody generują różne wyniki:

SELECT distinct ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable

 SELECT ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable
GROUP BY Name

Jeśli w tabeli jest 10 nazw, z których 1 jest duplikatem innego wtedy pierwsze zapytanie zwraca 10 wierszy podczas gdy drugie zapytanie zwraca 9 wierszy.

Powodem jest to, co powiedziałem powyżej, aby mogli zachowywać się inaczej!

 11
Author: The Light,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-17 16:04:57

Grupa BY ma bardzo specyficzne znaczenie, które jest odrębne (heh) od funkcji odrębnej.

Grupowanie przez powoduje pogrupowanie wyników kwerendy za pomocą wybranego wyrażenia, następnie można zastosować funkcje agregujące, które będą działać na każdej grupie, a nie na całym zestawie wyników.

Oto przykład, który może pomóc:

Podano tabelę, która wygląda tak:

name
------
barry
dave
bill
dave
dave
barry
john

To zapytanie:

SELECT name, count(*) AS count FROM table GROUP BY name;

Będzie produkować wyjście w ten sposób:

name    count
-------------
barry   2
dave    3
bill    1
john    1

Który jest oczywiście bardzo różni się od używania DISTINCT. Jeśli chcesz pogrupować wyniki, użyj grupy według, jeśli chcesz tylko unikalną listę określonej kolumny, użyj DISTINCT. Pozwoli to twojej bazie danych zoptymalizować zapytanie do Twoich potrzeb.

 5
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 20:20:31

Jeśli używasz grupy by bez żadnej funkcji agregującej, wewnętrznie będzie ona traktowana jako odrębna, więc w tym przypadku nie ma różnicy między grupą BY a odrębną.

Ale kiedy otrzymujesz oddzielną klauzulę, lepiej użyj jej do znalezienia unikalnych rekordów, ponieważ celem GROUP BY jest osiągnięcie agregacji.

 5
Author: Vikram Mahapatra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-25 14:29:54

Group by jest używany w operacjach agregacyjnych-na przykład, gdy chcesz uzyskać liczbę Bs podzieloną przez kolumnę C

select C, count(B) from myTbl group by C

Distinct to brzmi jak -- dostajesz unikalne wiersze.

W sql server 2005 wygląda na to, że optymalizator zapytań jest w stanie zoptymalizować różnicę w uproszczonych przykładach, które uruchomiłem. Nie wiem, czy możesz na to liczyć w każdej sytuacji.

 4
Author: Danimal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 20:15:29

Proszę nie używać GROUP BY, gdy masz na myśli różne, nawet jeśli działają tak samo. Zakładam, że próbujesz zaoszczędzić milisekundy od zapytań i muszę zauważyć, że czas programisty jest o rząd wielkości droższy niż czas komputera.

 4
Author: Andy Lester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 20:57:40

W tym konkretnym zapytaniu nie ma różnicy. Ale, oczywiście, jeśli dodasz dowolne zagregowane kolumny, będziesz musiał użyć group by.

 3
Author: Jeffrey L Whitledge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 20:12:44

Z perspektywy "języka SQL" te dwie konstrukcje są równoważne, a który z nich wybierzesz jest jednym z tych "stylów życia" wyborów, których wszyscy musimy dokonać. Myślę, że jest dobry powód, aby odrębny był bardziej wyraźny (i dlatego jest bardziej rozważny dla osoby, która odziedziczy Twój kod itp.), ale to nie znaczy, że grupa przez construct jest nieprawidłowym wyborem.

Myślę, że to 'grupa Przez jest dla agregatów' jest niewłaściwym akcentem. Folk powinien mieć świadomość, że funkcja set (MAX, MIN, COUNT, etc) można pominąć, aby zrozumieć intencje kodera, gdy tak jest.

Optymalizator idealny rozpozna równoważne konstrukcje SQL i zawsze wybierze odpowiednio idealny plan. Dla Twojego prawdziwego silnika SQL z wyboru, musisz przetestować:)

PS uwaga pozycja słowa kluczowego DISTINCT w klauzuli select może dawać różne wyniki np. contrast:

SELECT COUNT(DISTINCT C) FROM myTbl;

SELECT DISTINCT COUNT(C) FROM myTbl;
 2
Author: onedaywhen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 10:09:12

W perspektywie Teradata :

Z punktu widzenia zbioru wyników, nie ma znaczenia, czy używasz DISTINCT czy GROUP BY w Teradata. Zestaw odpowiedzi będzie taki sam.

Z punktu widzenia wydajności, to nie to samo.

Aby zrozumieć, co wpływa na wydajność, musisz wiedzieć, co dzieje się na Teradata podczas wykonywania instrukcji z DISTINCT lub GROUP BY.

W przypadku distinctive, wiersze są redystrybuowane natychmiast, bez żadnego preaggregacji podczas gdy w przypadku GROUP BY, w pierwszym kroku dokonywana jest preagregacja i dopiero wtedy następuje rozdzielenie unikalnych wartości między Wzmacniacze.

Nie myśl teraz, że grupa BY jest zawsze lepsza z punktu widzenia wydajności. Gdy masz wiele różnych wartości, etap wstępnego podziału grupy przez nie jest zbyt wydajny. Teradata musi sortować dane w celu usunięcia duplikatów. W tym przypadku może być lepiej najpierw redystrybucja, tzn. użyć odrębnego oświadczenia. Tylko wtedy, gdy istnieje wiele zduplikowanych wartości, polecenie GROUP BY jest prawdopodobnie lepszym wyborem, ponieważ dopiero po wykonaniu kroku deduplikacji, po redystrybucji.

W skrócie, odrębna vs. Grupa Przez w Teradata oznacza:

Grupuj według - > dla wielu duplikatów DISTINCT - > brak lub tylko kilka duplikatów . Czasami, gdy używasz DISTINCT, brakuje miejsca na szpulę wzmacniacza. Powodem jest to, że redystrybucja odbywa się natychmiast, a przekrzywienie może spowodować, że Amperom zabraknie miejsca.

Jeśli tak się stanie, prawdopodobnie masz większą szansę z GROUP BY, ponieważ duplikaty są już usuwane w pierwszym kroku, a mniej danych jest przenoszonych przez Ampery.

 2
Author: Ram Ghadiyaram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-23 03:24:07

Zauważasz to tylko dlatego, że wybierasz jedną kolumnę.

Spróbuj wybrać dwa pola i zobacz, co się stanie.

Grupa By jest przeznaczona do użycia w następujący sposób:

SELECT name, SUM(transaction) FROM myTbl GROUP BY name

Który pokazuje sumę wszystkich transakcji dla każdej osoby.

 1
Author: Chris Cudmore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 20:16:27

Wiem, że to stary post. Ale zdarza się, że miałem zapytanie, które używało group by Tylko do zwracania odrębnych wartości podczas korzystania z tego zapytania w raportach toad i oracle wszystko działało dobrze, mam na myśli dobry czas odpowiedzi. Po migracji z Oracle 9i do 11g czas reakcji w Toad był doskonały, ale w reporte Ukończenie raportu zajęło około 35 minut, gdy używaliśmy poprzedniej wersji zajęło około 5 minut.

Rozwiązaniem była zmiana grupy przez i użycie distinctive, a teraz raport trwa około 30 sekund.

Mam nadzieję, że jest to przydatne dla kogoś z taką samą sytuacją.

 1
Author: Gabriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-29 16:06:26

Zawsze rozumiałem, że używanie distinct jest takie samo jak grupowanie po każdym wybranym polu w kolejności, w jakiej je wybrałeś.

I. E:

select distinct a, b, c from table;

Jest tym samym co:

select a, b, c from table group by a, b, c
 0
Author: Zenshai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 21:05:41

Miałem to pytanie wcześniej, muszę dodać trzy kolumny z mojej tabeli 4 milionów wierszy (trzy kolumny w jedną nową kolumnę nowej tabeli), ale tylko różne.

Uruchomiłem więc moją procedurę składowaną zawierającą to zapytanie metodą 'group by' i trwało to 32 minuty. Potem uruchomiłem go ponownie, ale metodą "odrębną" i zajęło to 25 minut.

To ten sam wynik, ale przy drugiej metodzie było trochę szybciej

 0
Author: Pedro Ivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-19 11:31:12

Efektywność działania jest zupełnie inna. Jeśli chcesz wybrać tylko "return value" z wyjątkiem duplicate one, use distinct jest lepsze niż group by. Ponieważ" group by " include ( sortowanie + usuwanie ) , "distinct" include (Usuwanie)

 0
Author: Jun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-09 04:40:49

W Hive (HQL), group by może być znacznie szybsza niż distinct, ponieważ pierwsza nie wymaga porównywania wszystkich pól w tabeli. Zobacz też https://sqlperformance.com/2017/01/t-sql-queries/surprises-assumptions-group-by-distinct.

 0
Author: John Jiang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-01 19:08:26

Nie ma znaczącej różnicy między klauzulą group by i distinct, z wyjątkiem użycia funkcji agregowanych. Oba mogą być użyte do rozróżnienia wartości, ale jeśli w performance point of view group by jest lepsza. Gdy używane jest słowo kluczowe distinct , wewnętrznie używana jest operacja sortowania, która może być wyświetlana w planie wykonania.

Wypróbuj prosty przykład

Declare @ tmpresult table ( Id tinyint )

Insert into @tmpresult Wybierz 5 Unia wszystkie Wybierz 2 Unia wszystkie Wybierz 3 Unia wszystkie Select 4

Select distinct Id From @ tmpresult

 -1
Author: Vinod Narwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-10 16:56:21