Attempt to reduce the number of calls to execute and fetchone.

Profiling has shown that there are many calls to sqlite3.execute and
fetchone which takes a signicant amount of time. A simple way of
reducing these is to swap the 2-stage init of table row data into a
unified add.

Applying this to add_set and add_country yielded these results:

Before changes
```
281784    7.054    0.000    7.054    0.000 {method 'execute' of 'sqlite3.Cursor' objects}
127443    1.114    0.000    1.114    0.000 {method 'fetchone' of 'sqlite3.Cursor' objects}
```

After changes
```
281714    7.492    0.000    7.492    0.000 {method 'execute' of 'sqlite3.Cursor' objects}
127373    1.217    0.000    1.217    0.000 {method 'fetchone' of 'sqlite3.Cursor' objects}
```

Note: The total time of fetchone has actually increased. I am hoping
this was an abnormality on my machine and the actual reduction in the
number of calls will permantly reduce this total time.
This commit is contained in:
Chuddah 2020-02-23 18:00:38 +00:00
parent 0e4458fa75
commit 0a69894320
2 changed files with 8 additions and 32 deletions

View file

@ -37,16 +37,6 @@ class Movies(Kodi):
return self.cursor.fetchone()[0] + 1 return self.cursor.fetchone()[0] + 1
def create_entry_set(self):
self.cursor.execute(QU.create_set)
return self.cursor.fetchone()[0] + 1
def create_entry_country(self):
self.cursor.execute(QU.create_country)
return self.cursor.fetchone()[0] + 1
def get(self, *args): def get(self, *args):
try: try:
@ -114,11 +104,8 @@ class Movies(Kodi):
self.cursor.execute(QU.update_country, (self.get_country(country),) + args) self.cursor.execute(QU.update_country, (self.get_country(country),) + args)
def add_country(self, *args): def add_country(self, *args):
self.cursor.execute(QU.add_country, args)
country_id = self.create_entry_country() return self.cursor.lastrowid
self.cursor.execute(QU.add_country, (country_id,) + args)
return country_id
def get_country(self, *args): def get_country(self, *args):
@ -130,11 +117,8 @@ class Movies(Kodi):
return self.add_country(*args) return self.add_country(*args)
def add_boxset(self, *args): def add_boxset(self, *args):
self.cursor.execute(QU.add_set, args)
set_id = self.create_entry_set() return self.cursor.lastrowid
self.cursor.execute(QU.add_set, (set_id,) + args)
return set_id
def update_boxset(self, *args): def update_boxset(self, *args):
self.cursor.execute(QU.update_set, args) self.cursor.execute(QU.update_set, args)

View file

@ -44,14 +44,6 @@ create_movie = """
SELECT coalesce(max(idMovie), 0) SELECT coalesce(max(idMovie), 0)
FROM movie FROM movie
""" """
create_set = """
SELECT coalesce(max(idSet), 0)
FROM sets
"""
create_country = """
SELECT coalesce(max(country_id), 0)
FROM country
"""
create_musicvideo = """ create_musicvideo = """
SELECT coalesce(max(idMVideo), 0) SELECT coalesce(max(idMVideo), 0)
FROM musicvideo FROM musicvideo
@ -319,12 +311,12 @@ add_unique_id_movie_obj = ["{Unique}", "{MovieId}", "movie", "{UniqueId}", "{Pro
add_unique_id_tvshow_obj = ["{Unique}", "{ShowId}", "tvshow", "{UniqueId}", "{ProviderName}"] add_unique_id_tvshow_obj = ["{Unique}", "{ShowId}", "tvshow", "{UniqueId}", "{ProviderName}"]
add_unique_id_episode_obj = ["{Unique}", "{EpisodeId}", "episode", "{UniqueId}", "{ProviderName}"] add_unique_id_episode_obj = ["{Unique}", "{EpisodeId}", "episode", "{UniqueId}", "{ProviderName}"]
add_country = """ add_country = """
INSERT INTO country(country_id, name) INSERT INTO country(name)
VALUES (?, ?) VALUES (?)
""" """
add_set = """ add_set = """
INSERT INTO sets(idSet, strSet, strOverview) INSERT INTO sets(strSet, strOverview)
VALUES (?, ?, ?) VALUES (?, ?)
""" """
add_set_obj = ["{Title}", "{Overview}"] add_set_obj = ["{Title}", "{Overview}"]
add_musicvideo = """ add_musicvideo = """