This commit is contained in:
2018-10-03 00:39:36 +00:00
parent 6c272662ed
commit 896521fbed
7 changed files with 245 additions and 80 deletions

View File

@@ -405,7 +405,7 @@ namespace AyaNova
if (TESTING_REFRESH_DB)
{
AyaNova.Core.License.Fetch(apiServerState, dbContext, _log);
Util.Seeder.SeedDatabase(Util.Seeder.SeedLevel.SmallOneManShopTrialDataSet);
Util.Seeder.SeedDatabase(Util.Seeder.SeedLevel.HugeForLoadTest);
}
//TESTING
#endif

View File

@@ -34,13 +34,35 @@ namespace AyaNova.Biz
switch (aytype)
{
case AyaType.User:
return ct.User.Where(m => m.Id == id).Select(m => m.Name).FirstOrDefault();
return ct.User.AsNoTracking().Where(m => m.Id == id).Select(m => m.Name).FirstOrDefault();
case AyaType.Widget:
return ct.Widget.Where(m => m.Id == id).Select(m => m.Name).FirstOrDefault();
{
using (var command = ct.Database.GetDbConnection().CreateCommand())
{
command.CommandText = $"SELECT m.name FROM awidget AS m WHERE m.id = {id} LIMIT 1";
ct.Database.OpenConnection();
using (var dr = command.ExecuteReader())
{
// do something with result
return dr.Read() ? dr.GetString(0) : "UNKNOWN";
}
}
// var ret = ct.Widget
// .FromSql($"SELECT m.name FROM awidget AS m WHERE m.id = {id} LIMIT 1")
// .FirstOrDefault();
// return ret.Name;
// return ct.Widget.AsNoTracking().Where(m => m.Id == id).Select(m => m.Name).FirstOrDefault();
}
case AyaType.Tag:
return ct.Tag.Where(m => m.Id == id).Select(m => m.Name).FirstOrDefault();
return ct.Tag.AsNoTracking().Where(m => m.Id == id).Select(m => m.Name).FirstOrDefault();
case AyaType.TagGroup:
return ct.TagGroup.Where(m => m.Id == id).Select(m => m.Name).FirstOrDefault();
return ct.TagGroup.AsNoTracking().Where(m => m.Id == id).Select(m => m.Name).FirstOrDefault();
default:
throw new System.NotSupportedException($"AyaNova.BLL.BizObjectNameFetcher::Name type {aytype.ToString()} is not supported");

View File

@@ -0,0 +1,76 @@
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.JsonPatch;
using EnumsNET;
using AyaNova.Util;
using AyaNova.Api.ControllerHelpers;
using AyaNova.Biz;
using AyaNova.Models;
namespace AyaNova.Biz
{
/*
using (var command = ct.Database.GetDbConnection().CreateCommand())
{
command.CommandText = $"SELECT m.name FROM awidget AS m WHERE m.id = {id} LIMIT 1";
ct.Database.OpenConnection();
using (var dr = command.ExecuteReader())
{
// do something with result
return dr.Read() ? dr.GetString(0) : "UNKNOWN";
}
}
*/
//Turn a type and ID into a displayable name
internal static class BizObjectNameFetcherDirect
{
internal static string Name(AyaTypeId tid, System.Data.Common.DbCommand cmd)
{
return Name(tid.ObjectType, tid.ObjectId, cmd);
}
//Returns existance status of object type and id specified in database
internal static string Name(AyaType aytype, long id, System.Data.Common.DbCommand cmd)
{
string TABLE = string.Empty;
switch (aytype)
{
case AyaType.User:
TABLE = "auser";
break;
case AyaType.Widget:
TABLE = "awidget";
break;
case AyaType.Tag:
TABLE = "atag";
break;
case AyaType.TagGroup:
TABLE = "ataggroup";
break;
default:
throw new System.NotSupportedException($"AyaNova.BLL.BizObjectNameFetcher::Name type {aytype.ToString()} is not supported");
}
cmd.CommandText = $"SELECT m.name FROM {TABLE} AS m WHERE m.id = {id} LIMIT 1";
using (var dr = cmd.ExecuteReader())
return dr.Read() ? dr.GetString(0) : "UNKNOWN";
}
/////////////////////////////////////////////////////////////////////
}//eoc
}//eons

View File

@@ -340,18 +340,38 @@ namespace AyaNova.Biz
watch.Start();//###################### PROFILING
watch.Start();//###################### PROFILING
//Build the return list from the remaining matching objects list
//BUGBUG: THIS is what is taking all the time in the search FFS!
foreach (AyaTypeId i in OrderedMatchingObjects)
//EF CORE METHOD
// //Build the return list from the remaining matching objects list
// foreach (AyaTypeId i in OrderedMatchingObjects)
// {
// SearchResult SR = new SearchResult();
// SR.Name = BizObjectNameFetcher.Name(i, ct);//THIS IS CAUSING ALL THE SLOWNESS IN RETURNING SEARCH RESULTS
// SR.Id = i.ObjectId;
// SR.Type = i.ObjectType;
// ResultList.Add(SR);
// }
//TEST DIRECT METHOD ##############
using (var command = ct.Database.GetDbConnection().CreateCommand())
{
SearchResult SR = new SearchResult();
//SR.Name = "BLAH";
SR.Name = BizObjectNameFetcher.Name(i, ct);//THIS IS PROBABLY CAUSING ALL THE SLOWNESS
SR.Id = i.ObjectId;
SR.Type = i.ObjectType;
ResultList.Add(SR);
ct.Database.OpenConnection();
//Build the return list from the remaining matching objects list
foreach (AyaTypeId i in OrderedMatchingObjects)
{
SearchResult SR = new SearchResult();
SR.Name = BizObjectNameFetcherDirect.Name(i, command);//THIS IS CAUSING ALL THE SLOWNESS IN RETURNING SEARCH RESULTS
SR.Id = i.ObjectId;
SR.Type = i.ObjectType;
ResultList.Add(SR);
}
}
watch.Stop();//###################### PROFILING
var TimeToBuildSearchResultReturnList = watch.ElapsedMilliseconds;//###################### PROFILING
@@ -365,9 +385,6 @@ WHERE m.id = 12989
LIMIT 1
"Limit (cost=0.29..8.30 rows=1 width=27) (actual time=0.079..0.080 rows=1 loops=1)"
" -> Index Scan using awidget_pkey on awidget m (cost=0.29..8.30 rows=1 width=27) (actual time=0.077..0.077 rows=1 loops=1)"
" Index Cond: (id = 12989)"
@@ -379,49 +396,8 @@ LIMIT 1
select * from pg_stat_user_indexes
SELECT indexrelname,cast(idx_tup_read AS numeric) / idx_scan AS avg_tuples,idx_scan,idx_tup_read FROM pg_stat_user_indexes WHERE idx_scan > 0;
SELECT
t.tablename,
indexname,
c.reltuples AS num_rows,
pg_size_pretty(pg_relation_size(quote_ident(t.tablename)::text)) AS table_size,
pg_size_pretty(pg_relation_size(quote_ident(indexrelname)::text)) AS index_size,
CASE WHEN indisunique THEN 'Y'
ELSE 'N'
END AS UNIQUE,
idx_scan AS number_of_scans,
idx_tup_read AS tuples_read,
idx_tup_fetch AS tuples_fetched
FROM pg_tables t
LEFT OUTER JOIN pg_class c ON t.tablename=c.relname
LEFT OUTER JOIN
( SELECT c.relname AS ctablename, ipg.relname AS indexname, x.indnatts AS number_of_columns, idx_scan, idx_tup_read, idx_tup_fetch, indexrelname, indisunique FROM pg_index x
JOIN pg_class c ON c.oid = x.indrelid
JOIN pg_class ipg ON ipg.oid = x.indexrelid
JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid )
AS foo
ON t.tablename = foo.ctablename
WHERE t.schemaname='public'
ORDER BY 7,1,2;
Unused indexes?
SELECT
relid::regclass AS table,
indexrelid::regclass AS index,
pg_size_pretty(pg_relation_size(indexrelid::regclass)) AS index_size,
idx_tup_read,
idx_tup_fetch,
idx_scan
FROM
pg_stat_user_indexes
JOIN pg_index USING (indexrelid)
WHERE
idx_scan > 0
AND indisunique IS FALSE
*/
@@ -916,7 +892,7 @@ WHERE
{
//Filter out short words if we are breaking for indexing
//but keep them if they are part of a wildcard search phrase
if (s.Length > MINWORDLENGTH || (KeepWildCards && s.Contains('%')))
if (s.Length >= MINWORDLENGTH || (KeepWildCards && s.Contains('%')))
{
//Add only non stopwords
if (!LocaleSearchData.StopWords.Contains(s))

View File

@@ -23,7 +23,7 @@ namespace AyaNova.Util
private const int DESIRED_SCHEMA_LEVEL = 9;
internal const long EXPECTED_COLUMN_COUNT = 99;
internal const long EXPECTED_INDEX_COUNT = 24;
internal const long EXPECTED_INDEX_COUNT = 22;
//!!!!WARNING: BE SURE TO UPDATE THE DbUtil::PrepareDatabaseForSeeding WHEN NEW TABLES ADDED!!!!
/////////////////////////////////////////////////////////////////
@@ -192,9 +192,9 @@ namespace AyaNova.Util
exec("CREATE TABLE awidget (id BIGSERIAL PRIMARY KEY, ownerid bigint not null, name varchar(255) not null, " +
"startdate timestamp, enddate timestamp, dollaramount decimal(19,5), active bool, roles int4, notes text)");
//TESTING INDEXES ONLY ############################
exec("CREATE INDEX widget_idx_test_name_id2 ON public.awidget USING btree (name COLLATE pg_catalog.\"default\", id) TABLESPACE pg_default;");
exec("CREATE UNIQUE INDEX widget_idx_name_id ON public.awidget USING btree (id, name COLLATE pg_catalog.\"default\") TABLESPACE pg_default;");
//PERF TESTING INDEX ############################
//Weirdly, it's always slower when it uses the index?? memory issue maybe?
exec("CREATE UNIQUE INDEX widget_idx_name_id ON public.awidget USING btree (id, name COLLATE pg_catalog.\"default\") TABLESPACE pg_default;");
setSchemaLevel(++currentSchema);
}