Как оптимизировать SQL-запрос сделать его быстрее - PullRequest
1 голос
/ 09 ноября 2010

У меня очень простая небольшая база данных, 2 таблицы:

Узел (Node_ID, Node_name, Node_Date): Node_ID - первичный ключ
Цитирование (Origin_Id, Target_Id): PRIMARY KEY (Origin_Id, Target_Id) каждый является FK в узле

Теперь я пишу запрос, который сначала находит все цитаты, что их Origin_Id имеет конкретную дату, а затем я хочу узнать, каковы целевые даты этих записей.

Я использую sqlite в python, таблица Node имеет 3000 записей, Citation содержит 9000 записей, и мой запрос выглядит так:

def cited_years_list(self, date):
    c=self.cur
    try:
    c.execute("""select n.Node_Date,count(*) from Node n INNER JOIN 
              (select c.Origin_Id AS Origin_Id, c.Target_Id AS Target_Id, n.Node_Date AS 
               Date from CITATION c INNER JOIN NODE n ON c.Origin_Id=n.Node_Id where
               CAST(n.Node_Date as INT)={0}) VW ON VW.Target_Id=n.Node_Id 
               GROUP BY n.Node_Date;""".format(date))
    cited_years=c.fetchall()
    self.conn.commit()
    print('Cited Years are : \n ',str(cited_years))
    except Exception as e:
       print('Cited Years retrival failed ',e)
   return cited_years

Затем я вызываю эту функциюв течение определенных лет, но это сумасшедшая медлительность. wwwwwwwww :( (около 1 минуты в течение определенного года). Хотя мой запрос работает нормально, он медленный. Не могли бы вы дать мне предложение ускорить его?этот запрос:)

Я также должен упомянуть, что у меня есть индексы Origin_Id и Target_Id, поэтому внутреннее соединение должно быть довольно быстрым, но это не так!

Ответы [ 2 ]

1 голос
/ 23 декабря 2010

Вместо COUNT (*) используйте MAX (n.Node_Date)

SQLite не хранит счетчик количества таблиц, как это делает mysql, но вместо этого он сканирует все ваши строки каждый раз, когда вы вызываете COUNT, что означает очень медленно ... но вы можете использовать MAX () для решения этой проблемы.

1 голос
/ 10 ноября 2010

Если этот скрипт выполняется в течение определенного периода времени, вы можете рассмотреть возможность загрузки базы данных в память.Поскольку кажется, что вы пишете код на python, есть функция соединения connection.backup, которая может сделать резервную копию всей базы данных в памяти.Так как память намного быстрее диска, это должно увеличить скорость.Конечно, это ничего не делает для оптимизации самого оператора, так как у меня недостаточно кода, чтобы оценить, что вы делаете с кодом.

...