2013-02-12 5 views
10

Chciałbym dowiedzieć się, które z następujących kwerend będzie najbardziej wydajne dla uzyskania liczby wierszy na stole, więc próbuję wydrukować oświadczenia select. Wiem, że możesz dodać .selectStatement do Queryable, ale nie wiem, czy to powie mi całą prawdę, ponieważ będę musiał usunąć kod generujący wynik, np. .list.length i zastąp go numerem .selectStatement. Slick prawdopodobnie podnosi, że szukasz długości i optymalizuje dalej, więc chcę zobaczyć select dla całego zapytania, w tym SQL, który zostanie wygenerowany powodu .list.length lub .count).firstW jaki sposób drukuje się instrukcje select dla następujących zapytań Slick?

Query(MyTable).list.length 

(for{mt <- MyTable} yield mt).list.length 

(for{mt <- MyTable} yield mt.count).first 
+0

Jeśli jesteś na * nix "tail -f /path/to/query.log" powinien załatwić sprawę, nie? – virtualeyes

+0

Dzięki, używam H2 w arkuszu, ale będę z nim grać. – Jack

+1

@virtualeyes, które wydaje się być najlepszym (i jedynym) rozwiązaniem. W przypadku arkuszy roboczych i H2 należy zmienić poziom śledzenia w adresie URL bazy danych, np. niejawna wartość val session = Database.forURL ("jdbc: h2: mem: test1; TRACE_LEVEL_FILE = 4", driver = "org.h2.Driver"). createSession(). Proszę podać swoją sugestię (proszę wymienić arkusze robocze) jako odpowiedź. – Jack

Odpowiedz

3

I "nie mogłem wydrukować instrukcji select za pomocą Slick, ale Virtualeyes zrobiło dobrą sugestię: spójrz na logi bazy danych!

Cóż, testuję swój Zręczny kod w Arkuszach Scala, i tak właśnie go konfigurujesz - W przypadku arkuszy kalkulacyjnych i H2 musisz zmienić poziom śledzenia w adresie URL bazy danych, np.

implicit val session = Database.forURL(
"jdbc:h2:mem:test1;TRACE_LEVEL_FILE=4", 
driver = "org.h2.Driver") 
.createSession() 

Dzięki temu H2 będzie logować się praktycznie o wszystkim. Pamiętaj jednak, że będziesz musiał zwiększyć "maksymalną liczbę lub linie do wydrukowania" w preferencjach -> Arkusz roboczy.

Okazuje się również, że ustawienie Zręcznego na odpowiednim poziomie rejestrowania będzie służyć temu samemu celowi.

Dzięki virtualeyes ostrzegania mi słonia w pokoju :-)

4

Jeśli masz ramy rejestrowanie konfiguracji można ustawić scala.slick.session=DEBUG do logowania zdarzeń puli połączeń i zapytań.

(Uwaga: Ustawienie scala.slick=DEBUG utonie Ci informacje z kompilatora zapytań)

16

W play-2.2.1 ze śliskiego 2.0.0, w application.conf mają:

logger.scala.slick.jdbc.JdbcBackend.statement=DEBUG 
5

W Slick 3.0 można teraz bezpośrednio dostać SQL do wykonania bezpośrednio

val q = coffees.filter(_.supID === 15) 
val action = q.delete 
val affectedRowsCount: Future[Int] = db.run(action) 
val sql = action.statements.head 

Zobacz http://slick.typesafe.com/doc/3.0.0/queries.html#querying

+4

, które wydaje się działać tylko dla 'FixedSqlAction' chociaż? Nie działa z ogólnym 'DBIO', np. połączenie – Ixx

7

W Playframework 2.4.x z Slick 3.0+ użytku następujący wpis:

<logger name="slick.jdbc" level="DEBUG"/>

6

W Slick 3.1.0 (i przypuszczam, że w wersji 3.0) można zrobić bardzo fajny sql debug:

[DEBUG] - slick.jdbc.JdbcBackend.statement - Preparing statement: select "id", "email", "name", "password" from "users" where ("email" = '[email protected]') and ("password" = ext.crypt('123456',"password")) 
[DEBUG] - slick.jdbc.JdbcBackend.benchmark - Execution of prepared statement took 56ms 
[DEBUG] - slick.jdbc.StatementInvoker.result - /----------------------+---------------+-------+----------------------\ 
[DEBUG] - slick.jdbc.StatementInvoker.result - | 1     | 2    | 3  | 4     | 
[DEBUG] - slick.jdbc.StatementInvoker.result - | id     | email   | name | password    | 
[DEBUG] - slick.jdbc.StatementInvoker.result - |----------------------+---------------+-------+----------------------| 
[DEBUG] - slick.jdbc.StatementInvoker.result - | 4fe6e5c3-af74-40f... | [email protected] | petya | $2a$10$WyOrBy7p48... | 
[DEBUG] - slick.jdbc.StatementInvoker.result - \----------------------+---------------+-------+----------------------/ 

używam tylko logback Konfiguracja do logowania, więc bardzo łatwo włączyć:

<logger name="slick" level="INFO" /> 
<logger name="slick.jdbc" level="DEBUG" />