Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Performance] GetManyByKeys - Am I missing something? It´s fast! #29676

Closed
mkalinski93 opened this issue Nov 25, 2022 · 23 comments
Closed

[Performance] GetManyByKeys - Am I missing something? It´s fast! #29676

mkalinski93 opened this issue Nov 25, 2022 · 23 comments
Labels
closed-no-further-action The issue is closed and no further action is planned. customer-reported

Comments

@mkalinski93
Copy link

Hey,

I´ve recently posted some question here and there in the efcore repo.
After some testing/benchmarking and refactoring... I came to the conclusion that the performance is huge!

We took our current ORM to a comparison. Same Keys, same data, same structure and so on.
We generated 100.000 Product objects with no navigation properties or whatsoever.

Also we took AsNoTracking and Tracking into account which wasn´t such of a big deal.

*WithTracking - 25.000 objects - no Includes
image

As you can see, the first two rows represents a custom implementation of GetByKeys in efcore. In this scenario, we´ve took 25.000 keys! (I did it with 50.000 and 100.000 items, too)

It´s literally 3 times faster than our current ORM!
Holy smoke!

Now, I came to the conclusion that if a price is too good to be true, then there might be something off. That´s why I am here to ask you, if my implementation cries to be refactored asap.

This is the code

    public virtual async ValueTask<ICollection<TEntity>> GetObjectsByKeysAsync<TEntity>(ICollection keys, bool asNoTracking, CancellationToken cancellationToken = default) where TEntity : BaseEntity, new() {
        
        //Check for local entries first and exclude them from the query
        LocalView<TEntity> localSet = _context.Set<TEntity>().Local;
        List<TEntity> localEntities = localSet.Where(x => keys.OfType<object>().Any(y => x.KeyValue.Equals(y))).ToList();
        List<object> missingKeys = keys.OfType<object>().Where(x => !localEntities.Any(y => y.KeyValue.Equals(x))).ToList();
        if (!missingKeys.Any())
            return localEntities;

        //some keys are still missing
        string primaryKeyName = _sessionConfigurationProvider.MetadataStore.GetKeyName<TEntity>();
        List<TEntity> retrievedValues = new List<TEntity>();
        
        //this chunk is irrelevant to the query, because it seems that efcore generates multiple queries when reaching a certain amount of objects
        //I´ve kept it, because otherwise at around 100.000 objects, the dbcommand runs into a timeout
        IEnumerable<object[]> keyChunk = missingKeys.Chunk(50000);
        foreach (object[] objects in keyChunk) {
            Expression<Func<TEntity, bool>> expression = ExpressionTreeResolver.GenerateWhereInExpression<TEntity>(objects,primaryKeyName);
            retrievedValues.AddRange(await _context.Set<TEntity>().AsNoTracking(asNoTracking).Where(expression).ToListAsync(cancellationToken));    
        }

        return retrievedValues;
    }

This is the ExpressionTree

    public static Expression<Func<TEntity, bool>> GenerateWhereInExpression<TEntity>(ICollection objects, string propertyName) where TEntity : BaseEntity {
        List<object> keyCollection = objects.OfType<object>().ToList();
        ParameterExpression parameterExpression = Expression.Parameter(typeof(TEntity), "entity");
        ConstantExpression keysParameter = Expression.Constant(keyCollection, typeof(List<object>));
        MemberExpression memberExpression = Expression.Property(parameterExpression, propertyName);
        Expression convertExpression = Expression.Convert(memberExpression, typeof(object));
        MethodCallExpression containsExpression = Expression.Call(keysParameter, "Contains", new Type[] { }, convertExpression);
        
        return Expression.Lambda<Func<TEntity, bool>>(containsExpression, parameterExpression);
    }

It just works. But I´m literally scared to use it :D
I would really like to get to know if that thing smells or could actually be used.

@ajcvickers
Copy link
Contributor

@mkalinski93 Can you put the code in the a small, runnable application so we can dee exactly how it is used?

@mkalinski93
Copy link
Author

mkalinski93 commented Nov 28, 2022

@mkalinski93 Can you put the code in the a small, runnable application so we can dee exactly how it is used?

Here you are.
In this sample, you´ll find a benchmark project with instructions inside.
You just need to setup a local database (MSSQL, MySql, Sqlite) and execute the code once with Run or Debug.
After that, you should be able to do all the benchmarks.

TestSample.zip

@ajcvickers
Copy link
Contributor

@mkalinski93 Thanks; I'm quite surprised this is fast. I will discuss with the team and get back to you.

@ajcvickers
Copy link
Contributor

Note for triage: SQL generated is:

info: 12/5/2022 20:47:13.396 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
      Executed DbCommand (2,321ms) [Parameters=[], CommandType='Text', CommandTimeout='50000']
      SELECT [p].[Key], [p].[AddedDate], [p].[Manufacturer], [p].[Model], [p].[Price], [p].[Type], [p].[Vin]
      FROM [Products] AS [p]
      WHERE [p].[Key] IN ('3a61ed6c-c446-4928-a73a-00004d71f384', '23019c01-37ad-4b05-ae5e-00007c7b4c1a', '3275b8e3-a9cf-4b54-8fa8-0001c9d113b0', '2f253f34-5af2-490c-968e-00027f05fbda', 'ebe98431-0623-4127-962c-0002c007c9e1', 'b56e9077-b388-4618-ad5d-0002e43f9060', '466c769b-8130-481c-acb6-0002ff11c38d', 

...and so on for thousands more values.

@ErikEJ
Copy link
Contributor

ErikEJ commented Dec 6, 2022

Procedure cache pollution

@mkalinski93
Copy link
Author

I have noticed the generated query, too. It´s definitely a large number and it increases its size by the amount of keys you´re querying for.
Although the cache pollution is a bad thing, I think that the impact is not that noticeable.
We are working in an intern environment and don´t have to deal with millions of requests / millisecond.
Querying this amount of data is an uncommon scenario and definitely not the best approach.
We have some super rare situations were this situation can happen, but we´re also playing with the idea using sqlBulkCopy for that. Actually, the sqlBulkCopy was the backup function if you query a specific amount of keys. We´ve also tested it and well,... the contains approach still outperforms the sqlBulkCopy + TempTable select twice!
Also, the contra is that you would lose the abillity to track entities and include navigations right away. You have to deal with that later on.

And if it can´t be more difficult as it is,... I have to deal with several database providers, too.
We want to use MySql, MsSql and SqLite. Unfortunately mssql-only solution won´t help.

Since we are generating that huge amount of sql statements, I can try rewrite the query that it actually is parameterized and chunk it down to the sql parameter limit. That way we would avoid cache pollution and still keep the benefits - but may lose performance. Benchmarks will tell.

@mkalinski93
Copy link
Author

mkalinski93 commented Dec 7, 2022

I´ve tried it in a really simple (maybe stupid manner) to see how parametrized queries would impact on the performance.

image

IEnumerable<object[]> keyChunk = missingKeys.Chunk(2000);
        foreach (object[] objects in keyChunk) {
            string query = $"SELECT * FROM {tableName} WHERE [{primaryKeyName}] IN ({string.Join(", ", objects.Select((t, i) => $"@P{i}"))})";
            retrievedValues.AddRange(await _context.Set<TEntity>().FromSqlRaw(query, objects).AsNoTracking(asNoTracking).ToListAsync(cancellationToken: cancellationToken));
            
            //Expression<Func<TEntity, bool>> expression = ExpressionTreeResolver.GenerateWhereInExpression<TEntity>(objects,primaryKeyName);
            //retrievedValues.AddRange(await _context.Set<TEntity>().AsNoTracking(asNoTracking).Where(expression).ToListAsync(cancellationToken));    
}

Generated Query for a single batch (I don´t know why it is limited to 1000 - even though I have a chunk size of 2000)

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (66ms) [Parameters=[p0='d75bea43-ebc0-4d73-8d09-3d718b7c08ff', p1='70aeea1c-c883-4bd0-8d14-3d71deb8e3b3', p2='8ed8af40-2728-4e4f-91b0-3d71ea9d1378', p3='8c1df2a0-acd7-4f65-9c10-3d72b943ab83', p4='e1ea3597-ccec-4a79-8beb-3d755c497744', p5='81333303-555b-4136-a4fc-3d7561c1c066', p6='46273a37-412e-47db-9527-3d760c2ff75f', p7='7a5eb248-5f48-4cc7-93b0-3d7666bb776f', p8='22af1d20-0d27-4c3e-a4eb-3d76e3fb3220', p9='91bac857-af83-4c2b-8f38-3d78101400a5', p10='e0c9911f-6a54-4eca-83f8-3d7845b1b183', p11='bb821db2-4730-49e6-a0dc-3d7852409635', p12='36489352-5b19-4f3a-b956-3d788e8ccace', p13='b1a97e44-4637-4bfd-acd6-3d799aa3d0bd', p14='f6c2b8d4-65fc-4d48-929f-3d79e0fc923e', p15='63561682-705e-47fd-89fd-3d7bf4a55ef8', p16='89e2ed19-e476-4c40-ac53-3d7c6287c098', p17='ef87ae03-6689-4578-bc39-3d7c696e4f57', p18='96a054a5-901b-4b5b-b97b-3d7fc1436913', p19='3606e362-fd67-4384-a96f-3d8010c971a8', p20='5281c527-1bc6-4bc6-873d-3d8051683451', p21='2748fa5d-85e1-428c-a036-3d818fa232d1', p22='7038ec76-29ff-4ed7-a9fa-3d823759f0f8', p23='0a93484e-dce9-4a37-abaa-3d8249d1d92f', p24='d0ae63bc-09ec-453b-8eb3-3d829de28932', p25='9839ce8a-fb4f-46ad-b3b2-3d84a230febe', p26='52b4200a-63ea-4d1c-9415-3d86008151ad', p27='0c3143fd-5553-43b7-a0a0-3d86e43ba643', p28='5d1e3d83-5acd-4d08-8b07-3d875bac9c1c', p29='3657a770-532c-4f2d-87bc-3d87f0333ea4', p30='3294990f-6880-4c8c-9186-3d8833d74c59', p31='d23880c7-7c13-41f5-902f-3d88853f6bc6', p32='f81923e5-71b3-4138-9c8c-3d8a9a318a54', p33='1272de4c-ba28-4b22-b034-3d8c4e3537b1', p34='d489d67e-a8ac-4313-a77f-3d8c6bf99ec5', p35='282923ec-6cf0-4d19-adae-3d8ebe60ba15', p36='b5cf0aec-1060-46ca-b16b-3d8ef4d926e5', p37='54b047cf-0081-41a3-b1d0-3d8f4768760d', p38='2187fa0e-55a9-4349-ae7e-3d9005fcf413', p39='60327330-dc64-44f2-a36e-3d902810f878', p40='34bf8ab6-4f01-408a-9e5e-3d905406b315', p41='7ae84b16-ce1a-47ac-aab0-3d90b07f872c', p42='ce7b6b23-8c64-42a5-84f6-3d90f004a05e', p43='4adab226-a8c4-45de-bfc8-3d936d9c93d6', p44='9d133ddd-8676-4886-b859-3d94e0204903', p45='e46fe1dd-5be4-4ded-8723-3d95f1ff7c8d', p46='d1ba28f7-5601-4e54-925e-3d961d57c5f8', p47='c472aba4-e6ac-454b-9906-3d96743696b2', p48='7283c4b5-66f0-4236-8567-3d9678c0e189', p49='469a3057-bd31-4cd7-81db-3d97de0e31ef', p50='1c38c7d9-4d49-4b62-99b5-3d9a004221f9', p51='76d30477-e52b-4c34-a38a-3d9c407c481d', p52='c2becbbc-98fb-47b1-a429-3d9d1811d431', p53='0ff049a2-fae5-4fbd-835d-3d9f6d9a672d', p54='c048633d-9c6b-4442-819f-3d9f74197f99', p55='867b092e-56bc-4539-bdd9-3d9f8ebc52af', p56='159c1e11-6751-4f6d-b98e-3da02124d4b3', p57='a133ece1-d26c-4cb4-8fb1-3da06903a444', p58='67e579bf-438e-4119-a113-3da1d7f4a91a', p59='2331c488-a729-41a9-ade6-3da209902bc3', p60='8c03fca0-e063-4c6b-bd90-3da225d4b645', p61='a5597182-ef8a-422a-8858-3da2ac52b80f', p62='8b2b6c01-58fa-47ec-b80b-3da5a63f0c70', p63='a4eeae62-0d9f-4bd1-9923-3da609b05aec', p64='b9c27d42-d72d-4c8e-bdd2-3da64cd621e2', p65='5c74a160-e826-439a-b155-3da67cde5d4b', p66='ec90e47c-57ab-4e4b-a990-3da7e50a610e', p67='fe6d7091-258d-4012-b9c3-3da9b3a2bc3e', p68='868d016e-ecfc-4da0-bbe8-3daa7aa2601a', p69='9e5ba0e4-5668-43df-adaa-3daab28b9491', p70='4ba511ab-fc53-4d36-b613-3daacd2cb960', p71='f8fafd10-a806-4dc7-9d67-3daae31827d5', p72='70cd99e6-f7f7-4e3a-8819-3daafe0e622d', p73='c57a5ab2-1489-4b09-ba7b-3dab06a787db', p74='d8ab1164-b864-4633-b141-3dac21d937ad', p75='0b0f0d52-bd68-4183-ac67-3dac9ed767f8', p76='03872890-4eea-4838-9cac-3dad66b67ba5', p77='689f92dc-1a74-43dd-ad12-3dadb4b7cd92', p78='9f9333a0-4da3-418c-8cb3-3dae48f32fe2', p79='ebdbab55-5173-4d95-92e8-3dae98a68553', p80='ac58fd6a-d421-4733-9663-3db05a38a04d', p81='cf0f1daf-33f8-4357-930e-3db1a2b6ecb7', p82='ece8a406-9bea-4341-950c-3db25dcfa99c', p83='a3386f5e-8905-49b0-9c03-3db2be04243d', p84='6001601a-87fa-4968-aed1-3db31078a913', p85='c732db2b-4bf4-4c76-b87a-3db48bc1191e', p86='94579656-f764-4887-93d4-3db5a7dd5530', p87='5866bc90-3620-492a-9fc1-3db5a7e9fea0', p88='daefad0f-93d1-4bc3-b718-3db6aa385255', p89='238961e7-9993-4653-9292-3db6d927f2dd', p90='cebf4b60-72a4-49b6-b134-3db7070d19a6', p91='161f74fa-1575-49cb-ab8c-3db75e92385f', p92='ba523448-a09f-4d30-b0a3-3db7fc2407fa', p93='2d46ed58-a88d-4124-b5ed-3db8edeee6a3', p94='c4f115de-73ba-41d0-951a-3db9bfa8eb8e', p95='0f447320-ace5-4eeb-96ac-3dba989a6e7d', p96='5e8a2733-2866-4b45-8fa0-3dbaaaeed14d', p97='eeec8317-c899-46a3-ad74-3dbb18ab17d7', p98='3d75ffee-f78c-4759-b08b-3dbb862ba2c5', p99='b06f1844-dc98-48ea-a935-3dbbd0e8a2d3', p100='97e886a5-7f7c-4fe2-a179-3dbd273fbbb2', p101='c2b0ec79-6c15-417c-9846-3dbd362b9dc5', p102='7dee8d0a-5dce-4d52-9947-3dbe55d0ebc6', p103='50771520-f9e2-417a-babc-3dbe6273dfe4', p104='f0544563-0248-4968-af5f-3dbf02a58ee2', p105='c346d3ff-824f-46e6-b54d-3dbf134a0b6c', p106='6fcbafe6-1e8d-4293-aa57-3dbfcbe4d0f2', p107='9924ca7d-8672-4a73-a38c-3dc0048e7d68', p108='8b3d9215-1684-4e7b-9130-3dc02b7133c2', p109='d1605cc6-30fb-45e7-aaed-3dc15e46441f', p110='562276c9-74f8-4112-8139-3dc25b4a17f8', p111='c609cc94-1ded-49a6-9729-3dc4e297d8d1', p112='fb8176a3-416d-4305-a4ea-3dc4eded3dd1', p113='eed862c4-f631-4d07-a422-3dc522f3aaf6', p114='18b72ada-6fd6-494e-9be4-3dc5c3c57575', p115='df092b0c-6978-4bfb-80cc-3dc83f9994ce', p116='6c2b9944-53aa-40b2-aeeb-3dca36063c8f', p117='944b1687-6284-4faa-ad45-3dcb46fcf91d', p118='d46088df-957b-4a40-9aa4-3dcbbe5a67e3', p119='583497f6-635a-450e-8b86-3dccba3886bb', p120='a6c54695-97ad-4c25-8f82-3dcce9e8fd94', p121='021d3e1d-c76a-4e70-b40e-3dcd441c896b', p122='8a14b0b3-7401-4ef9-92bf-3dce3e41a36f', p123='90b7acb5-652a-4c47-aecb-3dce58fefe8f', p124='088957eb-9dbd-42b4-b86d-3dce9086ba27', p125='66795d27-8d98-4053-bacb-3dce9cc633c1', p126='00bbf99f-2e4c-4242-8bc1-3dceb794db74', p127='075b9cd4-07d7-4d87-b960-3dcff59db2da', p128='2eb6e294-c5e0-4830-b932-3dd03edea651', p129='d75bcaad-1567-475d-a14d-3dd0435a6710', p130='a05388ef-b3d4-4d9f-91ff-3dd07c1739e6', p131='47922d35-7147-4f26-be3b-3dd14f44d95c', p132='67944c62-9462-4bc6-b2f4-3dd277649351', p133='b21700f2-7c3a-406d-82b9-3dd3a09dcdce', p134='633bac80-a1de-4f4c-ad0f-3dd4bd078f92', p135='5c7dd2c7-aeae-43f5-905b-3dd4fb9448a8', p136='5f52ceb2-509e-430e-ab6c-3dd55e9354ce', p137='e1855741-168b-456f-87ad-3dd59918a592', p138='b1c9b32e-6d7b-4052-b024-3dd63d74ae63', p139='7dfed2a4-44f4-4eb8-8baf-3dd6e03cd6fd', p140='b3aefb71-b8d6-490c-9593-3dd6f2b6c8ea', p141='13638402-9e51-46bd-9a49-3dd72ddc2f71', p142='08752a1d-4023-4efa-bd79-3dd76f8d27fb', p143='b26e97cd-a228-4354-ba51-3dd8596e0568', p144='6955c624-1f57-477d-ba76-3dd9540d388c', p145='bf364751-fa7e-4707-8176-3dd95d5fbf88', p146='db0ed386-c7c2-4aee-9f04-3dd964cf7142', p147='aad940d0-8990-4b7c-b4b1-3ddad544d6d7', p148='5c94a729-d0cc-4b1b-b289-3ddbadd4a055', p149='d6c7e87b-8e2d-479f-a067-3ddbd52173ed', p150='8761dbcd-f230-4b94-9982-3ddd2c4e2c6b', p151='db4126ab-9684-4073-a75c-3ddd702ca65d', p152='6505f6dc-22b9-45b5-950d-3dde444168e0', p153='c6d932b9-9bd1-45ec-859a-3dde5c764d10', p154='a99d1e81-e43b-411a-9fd2-3dde8248c6ee', p155='77e8f04e-8b44-45f8-a389-3de00088c130', p156='416dd85a-a618-4ad4-bedc-3de000a9f908', p157='4c9aea9b-2e43-4de7-94b2-3de0090a2d44', p158='8743ec58-0fd7-444d-b5ea-3de1365aba81', p159='f6d2aa16-e610-44c6-8416-3de159d1743a', p160='c2aba2dc-ac69-442b-9937-3de170f61f59', p161='6ade70c5-0a80-41cb-8fc4-3de1990768c6', p162='cebf4ea4-477f-4276-8761-3de1a7aaf80f', p163='6d9c474d-b663-455c-a7be-3de1b5a1aaae', p164='9f5114c4-b2dd-4a77-902a-3de1db692936', p165='4792076e-0d89-4fb0-a659-3de286395013', p166='ada3d0f1-4ee4-48a5-9007-3de2c9ba44d7', p167='58ba7592-34e1-4a6b-bf41-3de304b7a581', p168='5912bc2b-9672-41f0-bdcf-3de351589a9a', p169='6ed99d70-4170-4c33-bba7-3de357bdbf36', p170='d7396d66-0cc3-4f38-a2f4-3de3a119637a', p171='2d5896d0-8477-45c3-bdd4-3de3b26e4e8b', p172='1118b85e-0d35-4449-8bf6-3de3d23d1690', p173='358c3abd-337a-457a-a760-3de41c3e7cb5', p174='6e193e06-390c-49ad-a91d-3de44b8a809d', p175='442dd5ca-6c14-4a17-a5e4-3de4652c89aa', p176='280b3337-d58e-464f-a858-3de4effc37f2', p177='bb7555f5-ae96-4384-af17-3de745092a82', p178='cf957786-7d24-4eeb-a6d2-3de76ed67e78', p179='1637694e-b386-4132-8293-3de7940238f9', p180='4e36b1a0-6d15-49d5-ab31-3de7a6ecb78c', p181='911a7761-6e8a-4309-8c4c-3de7e5e486d2', p182='432f3b84-9d19-4872-87c5-3de918b29df7', p183='8966fda9-7bab-4329-a905-3de921568a32', p184='96886fc0-1941-4ede-b937-3de94335cb76', p185='f414d6d3-913a-476b-aafa-3dea85b44427', p186='ca8db80b-f559-4826-a6f2-3debf2df8c9f', p187='86cb5c30-45b6-42f2-a156-3ded7a7c1cc0', p188='a9e60f87-668d-48ce-9747-3deded856979', p189='e6f108d8-f913-4f20-a4f5-3dee54479538', p190='1cb883a9-2407-4ff6-b7a6-3dee6673acfc', p191='f03c043e-eafd-4a3b-a39e-3dee931b8b65', p192='0734a671-6c07-4da5-b13f-3deed0f50d98', p193='99c25884-3ed3-4f25-8a2d-3def6df71e9a', p194='36894a2d-bcb4-4731-985b-3def7889b73d', p195='195bc155-2afc-4e03-b22b-3df010365b3c', p196='d486186e-bb2e-4111-b9ac-3df0e1da786f', p197='318789d6-1fd8-49d7-8f94-3df106aaf689', p198='74a95619-9176-491a-8f0f-3df158310d76', p199='f504950b-9236-410a-b7b1-3df282a193a7', p200='3e5f31a3-d02b-40ea-b9f3-3df290d23bde', p201='448407b5-de20-4c9c-9d51-3df56a27f9df', p202='15f2437f-ebad-4965-a181-3df6155ae258', p203='f7292996-6d47-49ab-89c2-3df6aaa9aa72', p204='fe15cb5f-e1e3-4d50-b7f2-3df7b2c698e5', p205='757204b3-35aa-440c-a7f2-3df885c968b0', p206='a8f9c511-3b72-47b4-a71b-3df92d732045', p207='22f77964-0f36-4e13-85b8-3df99e94500b', p208='294f270a-4ad5-461e-ac42-3dfa33c05fd6', p209='5c188fd0-cc31-4432-87a4-3dfae6ee7c18', p210='2ed6b3f6-f6ec-4886-8c61-3dfbd7838c52', p211='143254de-07cd-4f34-ab10-3dfd5833a13c', p212='54a26d25-1f67-430f-85e0-3dfdb79607b1', p213='a3f9e375-ad29-4094-9690-3dfdc45733b7', p214='11f4e4de-06c1-4e6a-8a7a-3dfe81934ce4', p215='56ac0719-8402-4d50-be7c-3e007229d9bb', p216='db42d668-7251-46e6-b295-3e01ad3a8c92', p217='2535445d-35df-4594-b043-3e02042a78e4', p218='55528d6b-8e27-479e-b12d-3e0211fb18a6', p219='771f69b5-c602-4d97-8709-3e03c2d1859e', p220='cc921f77-9f0c-4d14-8fe0-3e03fd17c749', p221='3b1c58ef-f72e-4faf-841f-3e06f27806da', p222='cd3fab73-21fa-4da4-ac66-3e075b2b6824', p223='138e4f95-3e55-4063-9e55-3e07a841d5a8', p224='e6065cd9-874c-4ab7-8a59-3e07fc86f196', p225='375f900f-aac5-4438-967e-3e085444b8a9', p226='818b43fd-d288-418a-addd-3e0965632b4d', p227='b523317f-9790-448d-b626-3e09fa714421', p228='e1e6d367-882b-43d9-9e97-3e0a332b2795', p229='10097318-5b0f-4777-b7a4-3e0acca91300', p230='6f0d77f6-93c4-490d-b0ac-3e0bd6574b3e', p231='63585aa9-116a-47cd-bef5-3e0c50918080', p232='8d0cf7ed-55a4-4ce1-a1ae-3e0d25659f1e', p233='a52d5005-217c-45dc-ae28-3e0d77622d06', p234='72a69326-9547-4327-afb1-3e0f822d7daa', p235='ceaf72c0-5732-4895-98e8-3e0f8852fd09', p236='ed73b9ec-fa03-4097-b9d7-3e107fbc4117', p237='574d1c95-ab8f-4501-a31e-3e10f0454dbb', p238='b45feb9c-1910-4030-a920-3e117a09ce28', p239='c2e4d72b-d6eb-43ff-8de2-3e11940d140f', p240='5e2b69e0-da02-42b1-9e78-3e126c0d41a0', p241='6f03dab8-f330-47cf-99b7-3e12720aba33', p242='8ae05118-3464-469b-8026-3e12c606111e', p243='fc91d495-0ebb-46e9-a54c-3e12de8a35e1', p244='79687c55-c792-4679-bfab-3e12f9f33b58', p245='dfee7c6c-b4b4-4e0f-8a61-3e13af3ad4f7', p246='03c2ba81-ea1e-477f-acee-3e14494d35c8', p247='54c5a001-dc11-45fe-9524-3e14d20716e2', p248='d61c3c7a-9eaf-4bcd-b331-3e150dc2f59c', p249='db3def1a-52c4-4a35-8fd7-3e157b42d6af', p250='8bee2ef6-4cab-452f-9a83-3e160a37aae0', p251='2043287b-39fe-4fc9-bb2c-3e172d4d07bb', p252='f791c2ba-d58d-4e3c-b737-3e1733c44240', p253='6f4fb17b-1dc5-4407-8543-3e176cb0b591', p254='b57ff42b-886b-4a67-97e4-3e188bde04f4', p255='807fb573-529f-41b8-9fb0-3e1921b50f6b', p256='85f97cb9-74ee-4418-b070-3e19d5a82785', p257='0f70ef65-e349-456d-a2f8-3e19f8aab0fc', p258='e3c09c54-2ffb-42f5-a828-3e1a7c46a0dc', p259='3e147b08-02d7-495c-9796-3e1a9017e40e', p260='1de7d3bc-df5b-4518-a28c-3e1b74968b5e', p261='1128b81e-ff65-451c-89d1-3e1cfd31be93', p262='6dee4094-a125-463c-88d8-3e1dd2303469', p263='2f63797c-6bd4-4444-a10d-3e1ddb0b761b', p264='ca3d9546-40c0-475d-b177-3e1e3439667b', p265='5586a378-f81f-4caa-99dd-3e1fc4e28607', p266='8489aab7-491f-4220-a9d4-3e1ff812e20f', p267='f9c3f955-17fd-4ae4-8437-3e2068bfe7ba', p268='38466b10-bf18-4dd7-a972-3e20de57d262', p269='9f8a30de-295b-4dbf-b0cc-3e219b9605e8', p270='e0f3ad3a-7e04-4954-a093-3e220c2d96dc', p271='03336a1b-a899-4e95-81c8-3e220ddb366b', p272='a53abef0-7b93-4106-b191-3e221e15d5cf', p273='de68dacb-5016-426a-a174-3e2246e2a3c2', p274='8feed11f-67f5-41a5-bf14-3e22f470fa87', p275='d1ed67f6-d0e7-471c-bb56-3e22fdd490c4', p276='a8d3b203-059c-40f7-861b-3e24cb059ab9', p277='1c9094e8-997c-4945-a7f3-3e25c85dcce1', p278='eceb4d1d-1144-4a87-8b5d-3e269e5a0652', p279='e4198882-8714-495a-b8e9-3e26e3921572', p280='dc3d6ee7-2a07-41ca-bc4b-3e26fa1bf6ce', p281='6e8bae8d-9dc4-4ab9-b50c-3e28895fe112', p282='9cfc25c3-c13e-4350-b16c-3e29d803cae1', p283='279a72ae-83a5-418e-9b38-3e2a52b9f8ab', p284='4130cd4a-663b-43cc-97d8-3e2a6fa5bddd', p285='27518633-4bd7-4da7-973a-3e2a87659543', p286='248dec78-0b58-423a-a649-3e2ab54e579b', p287='eac11147-98a0-4083-9eac-3e2af3ed4f39', p288='0684d303-fc27-4301-a43c-3e2d03c3a177', p289='ddcfbc2f-55d9-4dfc-a159-3e2d43f7deaa', p290='867c89be-c9ea-454d-974a-3e2ea8a8e62c', p291='a945d531-fc3e-4a94-be16-3e2f6fa01686', p292='15c23b4c-2966-406f-a80a-3e31193b3798', p293='514c5ee5-8611-4353-91b9-3e3131543029', p294='5cba45e6-e8a5-42a5-bf95-3e336ecd0dc1', p295='7f92ee1d-bace-4468-9fa6-3e342dc2905c', p296='87e81fb8-a1ca-4f5e-917f-3e3455c92c79', p297='00010859-66df-4576-83b0-3e34a11d5e2f', p298='c45c1d7f-8369-4615-ba9c-3e34e5e62f09', p299='05ff16ca-f059-4a0c-8fdd-3e3587817995', p300='399b1cda-7414-430a-86a9-3e3668adc626', p301='3beae2c4-2ae7-4d8c-89c1-3e377971498f', p302='e9ab2c83-705f-4671-b737-3e37af283cc4', p303='fe63b657-a453-4cea-8485-3e37f6eb6a7d', p304='10d2c450-3d6d-4dfa-afed-3e3828d5b581', p305='2dbaa8f9-8a13-4ceb-a41a-3e39ed7a684b', p306='63140039-4b11-4ccc-aa5d-3e3a41ce2226', p307='5569377b-16b6-402f-a141-3e3ab1dfecad', p308='fc4e6236-3a9d-4570-a10b-3e3ae9de7e4d', p309='cd19be93-47e3-403e-b25f-3e3c0a880928', p310='ee0a12a6-2890-44e0-b76d-3e3c7c9aab0c', p311='813e323f-7922-4cc5-bff4-3e3ce4cd186e', p312='8af24aad-48cb-485b-b70f-3e3d1e8dc5f3', p313='6084bdb9-20cf-4a7a-89e2-3e3e159228e9', p314='34542e6e-aa07-4494-880c-3e40a41e8fd4', p315='fbc28f56-13d7-4230-86d6-3e4125498ca5', p316='5c0a2262-32c3-49d1-a072-3e41901c97a0', p317='3fbf734b-46a7-4d3c-91f1-3e420b35c0f4', p318='7619483f-95b2-421f-a8cd-3e43e3e40641', p319='9a472106-34da-4907-b683-3e43fc994d0c', p320='52f6e4cd-5658-40bf-92a4-3e4424d8d94a', p321='b268ae9d-e992-4591-899c-3e4444d30c4a', p322='0710f23e-685f-40db-ae98-3e44c97c6450', p323='2381bef4-15a0-40cc-8b10-3e44d38e0f67', p324='7cdd0e8f-3857-40e0-b510-3e451d5e4605', p325='b8f6f904-c042-42e9-8d69-3e476a647ec9', p326='751b91a4-652b-400f-82c1-3e4873204ff8', p327='7a746fe1-afc8-468b-8856-3e492cad21ae', p328='8f5fed52-1169-4a8e-ba8a-3e4a3dcdba3a', p329='dd639484-2349-4a53-a8f8-3e4ae6aa78a5', p330='79456d81-d3e8-48ae-a3c1-3e4b01ff9193', p331='571e03db-8146-409b-b771-3e4bb8cb464b', p332='8de6cad8-fb68-4102-bd2e-3e4bf698a1a4', p333='4e1b3ec3-41aa-4a8d-b2ed-3e4bfbbaf9b1', p334='581c2a4d-c2b8-44bb-8510-3e4c3af82b66', p335='116832f2-197e-42a5-a3ea-3e4cfbb8a3a7', p336='1d019ffb-04f2-4579-8055-3e4dddd08c8d', p337='44511da3-4220-4100-bca8-3e4e185767cf', p338='c971b28c-d66c-47d0-ab87-3e4f6a6814e1', p339='e69ba50b-af3b-4a45-846e-3e4fe3ec236b', p340='d88554a5-9131-4d58-81b8-3e4ff4742e9a', p341='04103a33-2757-42e2-981a-3e50ccc6bc9f', p342='12d21885-f677-4991-9a2c-3e50fd204ab9', p343='0da9b6c0-e1b2-43f5-bd16-3e51535fe56b', p344='7de455ca-ec3d-4000-875e-3e517c1de028', p345='cff660ca-c6a3-4edb-9170-3e52d007a156', p346='8d0866c7-805a-4031-8a72-3e5386f4b5e5', p347='a33ef115-9706-47d1-b119-3e53bb2367d7', p348='4abfa463-4799-4eb8-8b94-3e5505b3ca40', p349='e2475d3f-9464-4511-8406-3e55e2f5e9c5', p350='77796586-7b07-4d36-bf52-3e5663edd61d', p351='0d6dc53a-ea56-405b-a7e1-3e5673967e25', p352='d42103b4-20ab-42e7-9ea2-3e573f20576e', p353='c061a7f5-b76a-4caa-9f80-3e587d83a4a9', p354='0a01292e-fc9a-4d63-9da0-3e5973c64a14', p355='831e5b1d-7c66-4496-9a7e-3e5b830b1104', p356='ddc62d46-33ba-4842-9a62-3e5c16e35b0d', p357='cf9c3335-a630-43ea-bf92-3e5da2608366', p358='0222d6b8-3850-4dba-ae96-3e5e71b21ac3', p359='c2732106-1253-4fcb-b6ad-3e5eb85a1ada', p360='521751bb-fbc8-4e0a-83c2-3e5ecc91b1fc', p361='5f4e835f-c5c7-46cc-a608-3e60b932b589', p362='e0196ca9-70e5-40a5-b904-3e60cd0a3ec2', p363='d678240d-464e-430d-837b-3e622e26b346', p364='f56960fe-620a-4ec6-a789-3e623f609915', p365='68b17758-e8fc-42af-aac3-3e646ecd490d', p366='d401f5f9-6493-4f3e-a493-3e64c7bf8d70', p367='f29f5a4e-f36f-425c-ab0c-3e666a796e02', p368='4443e50d-d79e-4342-afe2-3e6754a19608', p369='1b54f5f6-7746-40ac-8b19-3e67eda463c0', p370='eb1a8634-ecf4-4aca-8afc-3e680de489ed', p371='f2dca53d-6818-4f7a-a54f-3e69d8f8938a', p372='ebc7a283-1130-4714-be16-3e6a9c1794f6', p373='acd3f5bc-e703-445b-a76b-3e6bfb4aa0f0', p374='b22507d5-3762-4d36-b15f-3e6cd4b4717b', p375='60333106-c0e2-4c80-b15d-3e6e20440798', p376='c54b9440-4bbd-4d8d-b94d-3e6e4a3d467c', p377='a621c9bd-7d74-493a-b7ca-3e6ed6179c75', p378='7140dbcc-2439-4e21-a913-3e6f29e45322', p379='26b1a1d7-396e-4e17-a5d0-3e6f3f8b8b15', p380='d5c74a3e-bc31-416d-b639-3e6ff329f19a', p381='8f7d1508-12a6-4404-ad07-3e700295885c', p382='f3d1bee4-0fa3-40e7-929c-3e70508bb1ab', p383='25de3c7a-5c1f-4fbe-a5e9-3e70c649d101', p384='403a8c73-0975-4cd3-9c2b-3e718d9dfa04', p385='f06af449-0fac-4849-8972-3e71c1fc85ad', p386='e796676f-e020-47eb-8199-3e7417322ff4', p387='b7de5088-1177-413a-ac26-3e75ac75cd27', p388='1e4e3488-34c0-422e-a179-3e7876d85c2f', p389='a48ecae4-225e-4a9b-a856-3e787c277fc3', p390='ecdd0bdf-9194-4c3f-bfa1-3e7b27e8656e', p391='57887538-054c-48cb-b743-3e7b5f14473e', p392='26b24c06-6ec0-461b-b787-3e7bb23d04b9', p393='3b6ccfd7-d6f6-4906-b319-3e7bc3bacff4', p394='e6da3207-56c9-4e73-a566-3e7c78aa4f71', p395='466bbcbf-bdad-4b7b-8317-3e7daea167b9', p396='3b2a680f-7eac-426d-9dec-3e7e1a0d1e20', p397='1bfb346f-0a40-4f6b-99f5-3e7e2943cda2', p398='88f3e6cc-6ce2-40e9-9017-3e7e8287b3e5', p399='c07ba8da-8cc3-4641-82e1-3e7f773816d6', p400='d171cb86-8679-4b07-9b1f-3e7fc3185598', p401='36703bc5-8960-4b35-b9e0-3e80e9e42029', p402='28337f55-8b2d-4673-b017-3e80f7044c30', p403='48f4ae9d-39d7-47c5-999c-3e813cc8675a', p404='2b32c30b-2532-423e-aaba-3e8149be4385', p405='82538167-6a82-45ab-9e42-3e8153f5a95e', p406='d810d76d-62d2-4e74-b61a-3e819ea92afd', p407='0da064fc-6bd5-4413-9f26-3e820cdb7bc0', p408='d4fb8403-802d-474f-9d64-3e830ca41c38', p409='d61b81ac-3c4c-4145-a6d8-3e83376e6c8e', p410='1f376297-5349-45f4-8e94-3e83e3e6e9bc', p411='7ed97228-c884-42b6-92f6-3e87a7bcfbfe', p412='444ec45b-4f08-43f5-ba1e-3e87c1c91f57', p413='963440b3-1c95-411e-9fde-3e8c78875eff', p414='bf7ef7ab-219d-41db-b04b-3e8c8deb0a90', p415='66c0eb9d-f50f-48af-9014-3e8cc61da60e', p416='836b92af-1f13-4442-aa6f-3e8cf4f1c7ec', p417='37ba83cc-a967-4631-86de-3e8d5f319376', p418='ec41518f-6c4d-432d-bb85-3e8d91732b5f', p419='ae043874-c54b-4319-9cef-3e8dbfd95e64', p420='95b5024c-00f8-460b-bb39-3e9038a54bcb', p421='6e373bda-7ac5-4fe5-8313-3e904e1bee85', p422='0a48cac8-51b8-48e8-8f2b-3e90d1529569', p423='329ec409-62f8-4a18-bb89-3e911e1d3bb4', p424='e4c9e093-b189-42dd-ad41-3e933cd01d9e', p425='040f9b69-e79c-4af8-bfec-3e94c4ed975a', p426='0871026c-afbd-4ee9-a1db-3e95355ba772', p427='99a6dac2-ee51-42e5-a2de-3e953587e038', p428='4e248e19-06f8-4cd1-ac3b-3e95888f351a', p429='9a113fef-1c89-42c6-9863-3e99b17cf022', p430='485128f3-a018-4c86-83e0-3e99ea325507', p431='97caabce-1671-4c09-a461-3e9a26ea4c2e', p432='fdbb9542-9ca9-4ae0-889c-3e9a870ea956', p433='95981688-fd41-46a3-bca1-3e9af100126d', p434='f5e35aee-1873-4f54-b8b7-3e9b066efac7', p435='c9a5d257-8cfc-4b4b-845e-3e9dc84628ff', p436='8eb6088c-e65f-4421-aa8e-3e9f4bf5c90f', p437='19e56d0d-5487-45a8-b65f-3e9f53e4dd7d', p438='459cbe9c-49e1-4b88-90b7-3ea09c8bc70c', p439='d67c3ffb-2cd1-46d7-97c0-3ea41c83bf9c', p440='5bff7a1e-dde1-4545-808e-3ea43fc36601', p441='87e6bf7c-6d25-466b-bfba-3ea4b1fef90f', p442='14ee3eec-6a8f-4bbe-9b7e-3ea5202b3420', p443='5349feb7-8dbe-412c-adc5-3ea5e54bb180', p444='a184093a-69db-41de-9ead-3ea6a1e49834', p445='a0938b3d-227f-4943-9671-3ea7bcf9d09c', p446='365b60de-5fc3-4d20-80cb-3ea8e909ebf4', p447='d976deab-f75a-43b5-8ff2-3ea914341cce', p448='e5a1f7ca-13a4-4efb-817e-3eab499baae7', p449='611b04b4-a84b-4f8e-963e-3eab939658da', p450='680678af-acfd-45f6-a327-3eabcff8b15c', p451='299cf0cb-3589-4a21-bcd4-3ead30b081ba', p452='01e73895-16ac-4a5b-be10-3eade0773c9d', p453='4f780991-bd75-48f0-a55d-3eae19314ee2', p454='8974c3e0-c83c-40ea-a11d-3eaeddfb2461', p455='d0a1f6f7-b419-42b3-976c-3eafd113d072', p456='26518a00-64bd-4391-bd07-3eb1081033c0', p457='b05ba6ca-38cb-47a7-bd70-3eb16445fee5', p458='e23a3730-e29f-4ede-9b73-3eb19101c3a9', p459='39f82f03-b7c0-4f77-a957-3eb1c2481cbf', p460='cee59936-1d52-4d75-b7ae-3eb274328f91', p461='b990bb6a-f938-41b6-946c-3eb35e04d839', p462='b2ae6a94-e4b6-41ed-bbcd-3eb3d2398ef7', p463='62becf6f-0d70-4291-b31b-3eb41885e581', p464='48dbbd12-e46f-421d-b4f0-3eb450d24ee9', p465='a1adf0f6-55c6-4069-8447-3eb5b30c4d12', p466='604525d4-ed16-47e7-97e4-3eb78b9c208e', p467='e34f131f-b4db-4a42-b249-3eb81877626e', p468='7c018f3a-5223-41cf-a383-3eb9effed120', p469='3dc4b73c-d585-4940-98d2-3eba594c959b', p470='3c28954b-a83f-4e3c-b629-3eba7ec2a386', p471='6adb40f3-0f11-4041-b180-3ebb99fc1713', p472='0cffa546-56a1-4d44-bd7c-3ebca51ae5c5', p473='063b585a-9a7e-4be6-8daa-3ebd39d2ce0b', p474='636b4ec5-3025-4f82-8c51-3ebd3fafe23c', p475='309853d2-db52-4f6a-91a5-3ebd47357c6c', p476='0472c47a-37a1-476c-8fdd-3ebe69ae7e5b', p477='929ded86-d92d-4d7c-a10c-3ebe961fbc0c', p478='34e2c5c9-abbd-4952-8d84-3ebf309881aa', p479='38994624-301f-4894-8571-3ebf4680738c', p480='8ecd02b0-df55-4dd4-b21d-3ebf69ced3d9', p481='9410aded-d60c-42e1-878d-3ebfb50c8076', p482='268fdbc2-636e-4d03-a8a1-3ec0f5f955d1', p483='f29d21f8-6d20-40e4-97c4-3ec12b2c76b5', p484='a7d17549-536b-477b-ac7a-3ec13a89320f', p485='f90692af-ca28-41d7-94fd-3ec1c8759629', p486='45a9089e-e960-459c-ae0f-3ec2169fe2d6', p487='33779267-ccb4-4fba-9e41-3ec233ee115b', p488='211148f7-338b-464a-8e0b-3ec2543fa9c9', p489='6de6f77b-9a0e-44dd-847a-3ec257330ee8', p490='af7841d2-13d5-456f-81ea-3ec48283b14e', p491='8226b977-ffbe-491f-8ddf-3ec4f7fff11a', p492='acfe6b8a-7a08-40f7-b13b-3ec5af0ff098', p493='cccf548f-829d-4af0-908d-3ec664504924', p494='348248ad-b96d-4f66-805b-3ec6ba52badc', p495='8f514793-3695-4ee0-93c4-3ec6e921af51', p496='e99404e3-a396-4d9c-86f2-3ec81c07b389', p497='cc20bdc6-481c-42fa-a895-3ec857b3a530', p498='9d51f563-8604-4814-986f-3ec876e36c29', p499='ebfa7a06-ac4d-448c-a4f6-3ec905584a59', p500='d275755b-dba4-4119-b9e4-3ec9d0f90ac2', p501='f102ee13-c55f-44fe-bf0b-3eca84c8d83c', p502='3ac18106-6195-489d-a335-3ecaeb95b6c7', p503='73cad4d0-7b41-4729-9305-3ecbdf2e8d4b', p504='c88b1145-6634-4473-a09e-3ecdce2b97ec', p505='2556ea42-e37b-45e1-9aad-3ecdd7791e91', p506='b00ec983-c905-4d14-91c6-3ecdd9dfbad1', p507='11c3b812-afb5-494b-b994-3ecdddf55566', p508='6872dfa1-3fb7-441d-b6ed-3ece2225ef74', p509='348e56af-7ce6-4715-a23a-3ecf4ebea92e', p510='4fe50016-668c-4072-af92-3ecfe264765a', p511='5c6bcbc6-8edd-4638-9f5d-3ed18d827181', p512='ffe5d06c-729e-47bc-ae68-3ed1cf439d35', p513='33c52ca2-1ee8-4415-aeb4-3ed2908b927c', p514='8e77d42c-6829-447f-b220-3ed448e7b954', p515='a7efdfef-b048-47ca-a547-3ed5e9f88feb', p516='01568e38-7813-4b27-8079-3ed60f849f6b', p517='e2561b95-6d95-40f5-a8e4-3ed62e0c0054', p518='cdcd0cf1-066a-434c-abdc-3ed66530b3ab', p519='28cab290-0ea0-418b-aa79-3ed73c87fcea', p520='13b0909c-5dbd-4b55-9d14-3ed80847af58', p521='d85715b0-961d-4ef6-b07a-3ed864220664', p522='976129c3-804e-4ddc-aa4f-3ed94e842782', p523='6e3551df-5093-42a3-bbf8-3ed96725a299', p524='893731e2-1856-4104-9b55-3ed970af32f4', p525='e7d4e200-b03b-4847-8398-3ed9faabebe4', p526='16cccc0c-e2ca-4ec5-95fe-3edc696acc6e', p527='b3895773-7bb4-424b-a8f0-3edcfeb71a32', p528='00bf3acf-b752-4143-a655-3edd1e29b52a', p529='63e523f1-6128-4710-a207-3edd3edcec57', p530='5ebb1e80-8bdc-4ba4-b937-3edebe843af9', p531='a2efe4a3-367e-450d-84c6-3edf57c20cce', p532='e325bc5a-02ca-4dea-a129-3edfb9a4e2d8', p533='0b7ddfd3-ebea-4776-99e5-3ee0963712dd', p534='a16dffbf-7a0b-4e2c-bd5a-3ee0dec78e83', p535='3670e76b-4647-4718-b35d-3ee0fa02d077', p536='a23420b0-2a41-486a-a2fc-3ee11fc87de5', p537='63e618fa-7888-4ee3-baaa-3ee157ac7f17', p538='811bf3f2-0276-4430-b29a-3ee25451c6be', p539='b1614c8f-8dea-479a-ad1e-3ee4c23a271d', p540='d90cd1fb-5e37-46c1-bbbb-3ee5378c25b9', p541='bb79f79d-78a3-42b2-9efc-3ee53c12809f', p542='3b97896f-5c96-4f55-868d-3ee604a69574', p543='ef9c31f5-edee-4913-92cf-3ee73d422fc0', p544='ff7393ad-131b-47a7-b82e-3ee757d599e3', p545='a2e593e5-9fcb-4b81-8f5b-3ee81018f783', p546='430397c2-80e3-469d-bc24-3ee96be9389a', p547='b9ee108a-9d17-4fbe-91b4-3ee96f0fb292', p548='07828686-bb14-4167-83ea-3ee991b59835', p549='dba65935-6b95-41bb-9d71-3eea7fd23546', p550='0ff2eb8f-df10-4c23-af87-3eeb0d11503c', p551='ede3331e-34f0-4ba3-91d7-3eeb1074a8ae', p552='82eddebc-6d0c-463d-afbd-3eeb197709c5', p553='7db16e51-67dc-4630-b192-3eeb423f30f4', p554='3ebf583e-6e27-455b-8d24-3eec2b2113cd', p555='1715b1bb-7227-4b91-9c41-3eecbcb10772', p556='897a1430-e0b3-425e-9293-3eed14a449ec', p557='ab81b1ed-4dc1-419c-9db4-3eed2b5cd8ae', p558='f4862897-d128-42c3-9343-3eede16b5d5e', p559='b4d23c52-f0cc-47f8-8019-3eee46843e1b', p560='24c04ab4-859d-4d25-85fe-3ef03cdfa4b3', p561='b8730965-d9ad-4784-ae81-3ef0d475fb15', p562='986cbaf0-ec46-4d6f-9b27-3ef1ac1c9a43', p563='ce5a1807-79df-4339-93bb-3ef1adffc5de', p564='deff1689-8288-4079-84e5-3ef1f1b660a5', p565='b33375ae-46e7-4f41-8656-3ef23914517c', p566='9e6931e5-37fc-47ef-9feb-3ef25446e7a9', p567='1258cac5-68d8-4c77-8622-3ef3ce465071', p568='ed59fefc-60c1-48fd-85fd-3ef580ce5ac2', p569='e78be4ec-f46a-4833-ad23-3ef5f30b9f5c', p570='78e6a0d6-a602-4b45-a4ae-3ef6b4f7506c', p571='5e943d7b-9462-416d-bc74-3ef6f26fb249', p572='a25fe292-3602-4db7-b90d-3ef70ea37899', p573='cd2702f7-1cb2-4005-881d-3ef7667a6a89', p574='c3da9b31-bdfa-4530-a9f8-3ef78c446543', p575='2ac636ef-54fe-44d1-a37c-3ef7fe4ee2a6', p576='80e058d7-a298-4012-8389-3ef96ffe55b8', p577='28fea7f2-48ff-4131-849d-3ef9c6bb2813', p578='6be82b09-d926-416e-b5fc-3ef9cef2c7ba', p579='eb26ad41-b820-4aeb-a15c-3efa22123d40', p580='a67a5a0c-ec75-49fb-a2f1-3efa27f0e340', p581='fe74131c-cd58-4234-89b7-3efbc1c301ef', p582='7165c03b-83d3-4f9a-95e8-3efc93d966c9', p583='07cad050-6892-406b-aa8a-3efd0cdce806', p584='fdb347d8-0919-4e50-a95a-3efd5ffcbfd6', p585='ede153d4-38ad-4a71-9d4a-3efd64fdef7b', p586='b58d1360-bc4e-47a6-bffa-3efe0a117fce', p587='7350fb07-6dd6-4c33-9fcf-3efe4e0a6b26', p588='c2893f39-7db9-452b-83b0-3eff160e7583', p589='f30bd78d-0bdc-4976-b01e-3f0000d33527', p590='b7aef910-c470-4f0a-bc97-3f005dc3cb3e', p591='f7fdb4bc-86d2-4e6b-bc57-3f01f57fc02d', p592='310512c8-d54e-4282-98c6-3f02ae139c60', p593='0e648071-dda1-4320-914a-3f03150b2b59', p594='cad2d61b-8764-41ec-be0f-3f057667be5d', p595='457cf8e3-4f78-4899-8d34-3f06dae1dc5b', p596='6e6ea125-280f-470c-920a-3f07182a5f05', p597='46713317-7b37-4345-bfd7-3f082e47f8dd', p598='76b200f7-4e84-4cca-acb3-3f08ebe0c9b8', p599='1087f6b5-746a-499f-b426-3f091e3f6eaf', p600='8e3a022a-93b7-4dd0-a91a-3f096cbfff3c', p601='4f6106b2-8d13-4273-b6cc-3f09af778c31', p602='a378aa11-b5f1-41b9-9799-3f09bda997f0', p603='ca0bdc55-8796-413b-aabd-3f0a28f1b1b0', p604='2f0e5906-c6c6-46d3-b8df-3f0b213ff5e3', p605='7c9f6732-7220-44f5-a5d4-3f0c3bd1cfb6', p606='8416a4ed-0481-4e52-a805-3f0e4605ad63', p607='aa148adc-8b7c-4b6e-979a-3f0ebd1682aa', p608='c0cbb463-11f2-48d3-8883-3f0f3288f24e', p609='d02daedd-cc1b-4e22-a478-3f11e03143ad', p610='7e35fb07-57bd-48f8-b423-3f11f8434790', p611='94e5b2a7-88a6-4768-816a-3f1357dea08b', p612='be441572-ab74-4d68-bca3-3f14578adc70', p613='d9fdd9ec-a63b-4d8d-8fd2-3f1515780cba', p614='a1bf290c-cb0f-4d1e-a46a-3f1524454f90', p615='d650b014-77fe-47cc-9bab-3f15495132bf', p616='ceec4b86-94df-47d7-a250-3f1611c41cbe', p617='28cd409b-ea0f-4377-9ccf-3f1613fcb7d3', p618='6b04bb69-ff2c-4f02-a141-3f165c79c28d', p619='bba71700-4b05-487a-9344-3f173bbe3e7c', p620='22bc7f7a-cd6c-4afb-9832-3f1750addd8c', p621='50afab7b-2156-4d6f-800c-3f176d727293', p622='b9df7939-ce84-45ac-98e7-3f189f013718', p623='e2d4fc65-b46c-4efd-896a-3f193b0bb3ed', p624='2cd56942-36c1-418d-af90-3f1a2d3d629c', p625='0175338f-e105-469f-bd77-3f1a53c9b4b2', p626='7ff0b496-a9a0-4a2e-922c-3f1b75968735', p627='ae489783-e3f2-4066-8685-3f1c3d7c6559', p628='055d0a4c-777a-47d7-a903-3f1cef5eda90', p629='24bc7254-e971-436b-af50-3f1eaecdda77', p630='416e07ef-6e28-48ce-bb00-3f20113af6d3', p631='7ce43f36-5d32-4a95-9e91-3f2070f6c073', p632='1f3593a9-4b76-4736-beaf-3f20d8992c74', p633='1ba03790-7aa1-4d0b-bd8e-3f212bf097c0', p634='5301d917-af15-46e8-971b-3f215ba3c33b', p635='2035fbc5-1926-4216-b3c1-3f224ea0b1fe', p636='e27e14db-9fd1-4baf-922c-3f235b2bb141', p637='d2e5675b-d267-461f-85e2-3f23f0545c9f', p638='f2932538-7ef1-4052-bcd8-3f2427cca70c', p639='fcf33f1a-24a7-4efa-8c83-3f243ce1dba9', p640='cd2e4347-f214-4ab9-a383-3f25c16ed937', p641='da095e4a-d438-4438-900b-3f2683d36a0e', p642='7a0b6dcf-e4ce-4abf-bcc6-3f27fedcbf2a', p643='f2a8918b-5048-4f14-8b40-3f293dd013d6', p644='c2eda1ee-f57c-411f-804e-3f2a31d90b2b', p645='5ecdbdc8-393c-4d6e-aee5-3f2b29a545b0', p646='3ae4189e-f644-4c29-96b5-3f2b7b95a22f', p647='12512f3b-fb3b-4110-86d6-3f2d7949857b', p648='86229d63-2247-44ef-b5aa-3f2ddad9157c', p649='20871983-1aab-4596-b2a7-3f2eaa0703c9', p650='641206b9-5519-4993-88c3-3f2ebbfddc47', p651='bbe6c57c-cac9-474c-92cc-3f2f18066d6a', p652='8e47fb91-0deb-4247-8a5f-3f2f289a1f49', p653='a4d4127a-255c-4358-aa1f-3f305aedb9d9', p654='b9b883ad-3863-42ef-a425-3f315346ca67', p655='3091ad9b-c823-4267-bc57-3f319fffc0dd', p656='c384a18c-3506-4cae-829a-3f3394a417fd', p657='ec715c7b-0435-40f9-85ae-3f34279c4cad', p658='b787a424-8704-4155-be02-3f343bef7a19', p659='3394c70d-bcb1-4b5b-b823-3f354dc2f23d', p660='09468280-e769-4613-b7f0-3f35504770e9', p661='dd5a310b-6a8b-4ffc-a27a-3f36bed6da76', p662='63687f1e-95f6-4e60-9114-3f379c34b933', p663='41ab04f8-b8ea-4802-a9cc-3f37cd4ad431', p664='f0dd6c44-9d1b-4f0f-9672-3f38f880c3b7', p665='5a0ba096-ef57-4f6f-b380-3f3965cbd91c', p666='184780b9-7d3c-4a51-bcdf-3f3a5cdbb2c2', p667='be936e36-9c02-4ffd-a456-3f3a6c60a26a', p668='082abec2-ea81-4dee-910a-3f3adbdc83d3', p669='36847131-e497-4302-b5df-3f3e1251e7bd', p670='27f666ac-356d-4f26-b3cf-3f3e904216c2', p671='2b619a1e-0b08-48f2-967f-3f3edd5d714d', p672='8a355451-6d75-4a70-9a93-3f3f2199e5b9', p673='f30e6fc6-2ac7-46b1-82f6-3f3f5f245900', p674='17b041fb-0ea7-462f-a5c8-3f40089f9e79', p675='c2f8801f-078a-46e6-a4c7-3f401ccd51b5', p676='3d4f5e57-28dd-4247-bcae-3f4271a366e5', p677='a9516034-18e9-449b-a82d-3f4342913ec4', p678='b045ca60-d805-45a2-811c-3f4345d5e265', p679='cb7216e3-63da-42c5-a2f4-3f4523b23bb6', p680='aa90495a-738d-4089-9f00-3f453e035924', p681='2892f385-4d05-446f-bbea-3f45a24bdd31', p682='196a1793-a6b8-46c9-a5b9-3f45da094dbc', p683='1b196d54-9d2c-44bf-bbed-3f467a91164b', p684='010aa8e8-69d6-48cd-8933-3f4784a57fa3', p685='f0d7dc0f-3bb8-47ba-af71-3f478fdb0728', p686='5991134d-6b75-469a-bd41-3f484a4d2ae7', p687='1769b62e-172d-44a9-a7e8-3f4854313dee', p688='40843f50-4183-48f9-b6eb-3f486041433c', p689='9f83c3f6-33fb-48d8-8d1d-3f48df48e85c', p690='b6e4f127-4a06-4629-a0b5-3f48eb5c713d', p691='8d9fdf13-de1b-483a-a0a7-3f494d0de377', p692='88920c7c-7727-4203-86f8-3f495dfb98d0', p693='dc073325-c99f-46c8-8382-3f4b2466e2db', p694='43b510d0-c165-44a6-9c70-3f4bc44bd0b6', p695='5599b9ea-a129-4583-bbc2-3f4bdbfa9874', p696='eaef928b-7780-4cc3-9811-3f4c1984b8f4', p697='bdd43d64-36f0-48de-82aa-3f4c5cbfb92c', p698='43d5e991-fe35-4159-a133-3f4c5da92c26', p699='df10093d-8008-447a-89a7-3f4d70a8105a', p700='b0e99e47-c821-4c1b-8eae-3f4daf209afc', p701='85dff7e1-73b6-4d75-a0c3-3f4e43eec940', p702='19b6f165-5f83-494d-8e23-3f4e8165d80c', p703='71b99a90-c29c-4da0-930e-3f4ecfb86dde', p704='f86b838d-aef6-4396-9cea-3f4ed3962d03', p705='7027b5b9-a920-4ed0-80b9-3f4ede77705e', p706='f56a1d60-02b3-47ed-97d3-3f4f27816ee1', p707='188d4af2-e3a8-4a86-bc20-3f4fdae80195', p708='5468de1e-5b77-42b7-acc7-3f501a3a5ed8', p709='4608c4c2-f7ee-413e-9192-3f509a6354b3', p710='0ea0864d-2cef-47c5-83f2-3f50ed41fb1c', p711='b2e565bb-ab6d-42e1-b74c-3f51d242f50d', p712='36d31d48-35cb-4bd4-9cc2-3f52027064e7', p713='10ac497a-ffaa-4921-afaa-3f5215b758b7', p714='b2a27eb7-bcf7-4cda-b292-3f53f01b7f8a', p715='8fcf09cb-dd1b-469b-8628-3f55cf5ca4c2', p716='d8a57eaa-9613-4494-8a42-3f561ef99417', p717='336a6d0e-8af7-4146-b4d9-3f56424fbe86', p718='b36660f1-2fc0-4c7f-b54c-3f56dec1b732', p719='0a9c07bf-920f-436b-9e62-3f576b070adb', p720='d154a849-b69f-49a1-827f-3f57a5351903', p721='3cda4d5a-5f9a-4eb6-a80e-3f57e8f348e3', p722='eb2e1245-07d3-42f1-9ac2-3f5840888513', p723='f543d949-c45f-4e99-9373-3f58768b347d', p724='29027735-9852-4dda-a5a2-3f5913c61af6', p725='f50d9e88-a5d3-46e2-a882-3f5a90a94eeb', p726='c3716c48-3496-4307-8382-3f5b7260c0d8', p727='b0bccf70-e948-42f3-a46f-3f5b81d213eb', p728='f7395668-7a37-48cb-9882-3f5bab56f44c', p729='7b6ba68a-572e-4236-97f2-3f5bf4929ee1', p730='63a8ca8d-d597-4db6-ad09-3f5c861ec1a5', p731='73bd8a96-209f-47d2-863f-3f5d28ef3bf0', p732='a54f4940-1502-4dd1-a446-3f5dc409599a', p733='d1d18e15-e38c-4545-bb3b-3f5eb531176a', p734='5070dd0e-6615-4070-9c06-3f5eede05a5a', p735='74344c4d-773c-429c-9b5e-3f5f2587569b', p736='727de2db-1f8f-4388-aeda-3f5fde7a2f1f', p737='0ef2e930-ec40-4239-8361-3f60d69a2e8f', p738='a27ce5ba-3194-4564-b259-3f61fc23db0b', p739='78e3bfc7-ae20-4870-bbf1-3f620971859f', p740='aea7cf2a-c017-4bef-9e6d-3f622aea5908', p741='38bd9221-89fa-488b-b175-3f64132cedae', p742='096a135b-5e51-4748-8f49-3f64cc7a6069', p743='50dd18a5-7be9-4f49-adb6-3f659a59fa42', p744='a120521d-c397-484e-acac-3f65d8047eba', p745='9e6035ba-b9e3-452c-83c1-3f6601b1dfea', p746='6dce6f05-566c-46ff-8c94-3f660927342c', p747='9f00c789-0268-47c4-8a70-3f66f792be75', p748='f0de6500-9713-4646-a4dc-3f6713f93f78', p749='ce36d441-6a60-470e-b8c1-3f675bb2495a', p750='173aa975-6ae8-467e-b47f-3f6794310890', p751='9713deb1-b10c-4ab9-8785-3f67e791de34', p752='38465562-ee7f-4611-8e65-3f6893046568', p753='e01cba95-7571-46d7-a06e-3f68d2c15691', p754='35706148-f81e-40c6-a604-3f6935872ca5', p755='85881deb-6fc9-490e-a007-3f69b4a6e10b', p756='f8be2507-ff5d-42f7-8f13-3f69c7d62c74', p757='0980d2a3-daa5-4d28-84b7-3f6a10d1512a', p758='0729b62f-6406-4adb-b08c-3f6be0d981af', p759='fd8b89e5-1fd0-453d-8300-3f6c20d1d2a3', p760='54a93e8d-f04d-4442-be96-3f6c338455ef', p761='1104f8e2-445e-4c3c-a5fa-3f6c4dbcb86c', p762='f77e9d8c-4bcc-4bdf-a500-3f6cf9f82bc4', p763='813bd4f7-429b-4d20-a3a6-3f6d9825e867', p764='148aff92-29c5-4e47-b0fa-3f6df3b08768', p765='0807ba04-4255-483f-adb0-3f6ea7a1bfa9', p766='5d1c7f0b-1e95-4cda-b439-3f6f54f13ecb', p767='4f95aa3a-4fa6-441c-9bf8-3f6f6f8f5db4', p768='431a313f-e54e-4f9e-bcfa-3f6f7d13a564', p769='5bf847d0-7bf5-43fb-b08a-3f6fab860766', p770='25b4f7ec-f55e-404c-9cbb-3f6fe88c2b69', p771='9bd34ca0-df95-4dbc-921f-3f7047796046', p772='1a320040-3ebc-47b6-bb1b-3f709affd7d4', p773='54c24967-a113-42de-a600-3f710a35d6c8', p774='1fe2398f-4c15-4c72-bef8-3f7128fa0f0d', p775='dad5e90c-c276-4100-b56a-3f71a54cb35c', p776='194e466c-0e82-4b05-8799-3f71ba2bf208', p777='0d50f7b8-d6cb-4c0d-ac18-3f71dd28ada1', p778='afb10f88-5747-483c-ac56-3f7347ec5367', p779='4a387d68-aa2c-422b-bb3c-3f73f3d66302', p780='7ac6b68d-c2ec-45c0-bd7a-3f748a23549b', p781='fe267faf-ebed-4d11-aa5d-3f74db8cd132', p782='8e4348a5-5fc1-495e-954e-3f7512455e6a', p783='ca591467-6f1e-484a-b642-3f757b5acac6', p784='ba7a2333-720f-49f1-bf75-3f76050dc9bf', p785='3f630c46-4bed-4f95-bc71-3f76bc8c7376', p786='e08c8e52-1e38-4239-80d9-3f7719769220', p787='cc318813-b62b-47e3-b0f2-3f7760d242a1', p788='fb06594c-5782-4243-8758-3f7ac14d96ce', p789='be888f36-453f-4f38-b4e1-3f7c0544f66d', p790='f1093fe0-efa9-400a-b059-3f7c623b8591', p791='287d40e9-1aac-4bf8-8178-3f7c67f7c8d5', p792='ea0d6ec2-1914-44de-bf4d-3f7dea7d895f', p793='6d5d3f94-8491-4958-994c-3f7ec72d308e', p794='544f3e0c-e8bd-4b91-84f6-3f7f39af0dec', p795='b4a13ecf-f38f-4826-92dd-3f7f607057a2', p796='7485d9b6-8fb4-4f99-8de6-3f7fbdb7258e', p797='0c52e0a2-c5f6-4589-b542-3f81ae3f5dad', p798='d35bca2d-eb8a-4d5b-b4cd-3f8292169b83', p799='9a826bd6-cae5-4159-9b2a-3f831b5e6af4', p800='62ef971a-1743-4bd8-b64c-3f845b808cb6', p801='429b5e8a-0386-4f1a-b3dd-3f84edd6d81d', p802='aad6a4f6-e496-4af0-8a5e-3f8716bc1b40', p803='8c0fbfd9-06b9-4092-adeb-3f87d97721ba', p804='9ad3851d-ac82-4df7-b9f6-3f891071c3a9', p805='f0f37bc9-61e5-482b-8b5e-3f8a3803feba', p806='02e42ce0-502b-494c-95ea-3f8ae33a0679', p807='3a87d0dd-608a-4001-bf37-3f8b130a36f7', p808='5f9fe72b-c9c4-4221-89b0-3f8ca09805c7', p809='2a193488-89dd-4c84-b240-3f8cc587c334', p810='c827b003-1482-4c77-8acf-3f8d2e5cff9e', p811='1e7bb329-f1df-487b-9f79-3f8e15e9ef3a', p812='d9d020b6-7e88-46d3-bf2f-3f8ea832b796', p813='c4fadf5c-d24d-4ba2-be24-3f8ebdf242be', p814='9ba58661-da03-49d9-a7fa-3f8ee4772f59', p815='7497c441-642e-4cca-8373-3f8f788230cc', p816='cfa1c13d-b104-464c-aaa6-3f8f8cce35f1', p817='4fcd73dd-0888-4378-ad6c-3f8fa861b1f6', p818='4e60a63b-e23d-4f9b-9c87-3f9127633101', p819='b889931c-b7f7-404a-84b6-3f919e899485', p820='f60f412e-e747-4d0a-878a-3f91eab252be', p821='c3bfc4df-1c51-4feb-9233-3f91f0a39911', p822='242122e5-0ed9-4c43-a9b9-3f92e48e9fac', p823='521780e7-79cb-4482-919c-3f948b063b0d', p824='98219edf-e959-410e-ad4c-3f95cca392c8', p825='270aa3a5-21c3-4fe5-be7f-3f96efeb4201', p826='423306a8-90e2-4402-811d-3f96f586e52e', p827='206d99e6-5987-4731-b451-3f97c9c5c01b', p828='ef52ef1c-4b6e-44d7-ac08-3f989215717f', p829='c3e47657-80bf-4145-b957-3f9903c82a4d', p830='1cc61d3f-6206-442f-a366-3f992e18d7a4', p831='5ec84f13-8a0d-4bb4-9c50-3f99ed420096', p832='6aa2d837-bf02-4ca3-91ea-3f9aa858cf4c', p833='89c7ae50-3d8d-4a57-8bc8-3f9ae9a29a14', p834='411635f3-86ad-4d57-8c1a-3f9b582c4d38', p835='30ada4eb-c58c-411d-b1d4-3f9bb055ac27', p836='8601d107-dc22-4e59-9f74-3f9c71074baf', p837='5ee2083c-fc82-4f72-9b70-3f9d745b4c13', p838='16f0ffc8-cc89-43e8-a41e-3f9ea9ac0ffa', p839='1f73d9d3-80ca-470c-a66a-3f9f5036226f', p840='b66dd0e5-80b1-46af-96fe-3f9fda479edd', p841='2444133b-23b1-4b77-a51d-3fa067fd6033', p842='215b3b28-8c18-4011-8691-3fa3d38c3954', p843='1855621d-0bf1-4944-87d1-3fa3e3e4efb2', p844='8512aa78-a9b9-42de-a7f0-3fa3ec6f8053', p845='b94c9ab0-16b1-49a6-b65e-3fa44554da65', p846='214e689f-497d-4cfc-bcea-3fa481ce80dc', p847='77358445-00a0-4f5e-ad7b-3fa4b7dafefe', p848='2bc027e6-2b50-4547-843d-3fa4bb067aeb', p849='df197e53-b24d-4375-bac1-3fa4d0cb2f19', p850='745b2844-3843-4dc9-a633-3fa52c6dfe54', p851='dd62512a-5ce9-41f7-aadb-3fa52f188f67', p852='7c4a8ebe-40bd-4c65-b717-3fa5ef305bb8', p853='9ed41420-3b7c-47a5-847f-3fa6086c96ad', p854='bda0b911-043a-478d-b43d-3fa754e5feab', p855='e28e4a85-0ed9-419c-9b41-3fa853eeab95', p856='27e3c013-69c4-4010-a3b9-3fa973fedcd2', p857='fc0a5c81-87d7-48b6-91e1-3faa2b0f8e77', p858='f7f482ce-5b53-4c0b-8890-3fab144bb7a8', p859='c8c090e8-9dcf-435d-b50a-3fabc1608989', p860='b6188155-c0a0-4c86-8f1d-3fabc1ae5a69', p861='4a0fde87-fc6a-4213-bc72-3facd7efe5b4', p862='2a6b19a1-a815-46d5-8798-3fadd70abb4b', p863='cc38a8ec-70eb-40ec-be67-3fadf64088b7', p864='7ef9e8a3-c64f-4093-bfda-3faef2a9e4a8', p865='26c77b12-f0ac-4e62-b407-3faf19f82970', p866='4f2f40f2-821a-4efc-b91f-3fb0f56b8f07', p867='6da87605-8f24-47dc-ae74-3fb191b6f0df', p868='2a19660c-9b52-4ebb-b003-3fb249141019', p869='df55378c-1fa8-41ac-919f-3fb2a65c57c5', p870='59a194f0-4df9-4964-ab1e-3fb356479519', p871='d823af22-87d6-4fcf-a989-3fb3bd150f1d', p872='4ed57741-28a6-42bb-a315-3fb43fc391b1', p873='f3cf6563-b741-4c61-b7fe-3fb485bf885f', p874='09e60bd7-a4a5-4332-8f83-3fb4ddfc8c59', p875='738c3dcf-8d9b-484d-858f-3fb53db3d2d1', p876='42d463dd-265b-4e36-8467-3fb56ad8afc7', p877='a7813eeb-b1c2-417a-abb2-3fb6177bb2b1', p878='a0722a50-4934-4c2a-a4f9-3fb63e61e5ba', p879='5fb915e3-e05f-4e0c-8072-3fb8939cfd67', p880='cf76136d-a8bd-4f2f-bac8-3fb93ebcac9c', p881='4dfadea1-85c7-45bd-826e-3fb9ae3ad12a', p882='85a1bdd7-dc55-44a8-bf39-3fba6f4093e0', p883='def5fb97-384b-4164-94f4-3fbaad44f533', p884='01c113ed-1761-4ef9-a6eb-3fbb0fab0c33', p885='30e334e0-d256-4136-a979-3fbb444acf5a', p886='895e8afc-14d3-418a-92c8-3fbba59d2788', p887='0fe82b7f-9c9c-4f09-9521-3fbcb2b2d16c', p888='3c44a645-9dc0-4908-9f53-3fbd7aadb460', p889='5dee486a-6b73-4538-9338-3fbecc17d40d', p890='c938df5f-65a3-48b1-ba1e-3fbf0c8996bf', p891='0488efe5-5771-40d0-8f65-3fbff624e2cc', p892='351e4507-aa0c-419a-b140-3fc0006c0038', p893='a295d967-5835-439b-a9c6-3fc02b87eed2', p894='ed4f42a0-12c9-4231-8eb3-3fc0a499598b', p895='d36569f0-37f0-4127-a29e-3fc1df245b3c', p896='36d8b439-502e-43ee-81dd-3fc2334a46c1', p897='6a70261e-95fe-4aed-92c2-3fc26d6a57c3', p898='00f28e2b-7fb3-4461-8ab9-3fc26dde6f8d', p899='85d698df-69fb-4fac-9765-3fc30c75e35e', p900='1cf7b4aa-abdd-4707-87e3-3fc321e4a5f4', p901='08c6c934-b438-4fe3-802e-3fc38caef1e6', p902='b0073f75-82de-4bc8-9dca-3fc3f01667dc', p903='829cf891-7a02-4174-b16e-3fc4542baf82', p904='71ec1727-c3c9-4708-92d9-3fc4eee59cde', p905='2db08e64-d234-4f0e-9b13-3fc5ab1c3e30', p906='aa5c1d3d-02cd-45bf-9cfd-3fc6390b1436', p907='280124ba-5b85-4b45-bbe1-3fc6b7497b21', p908='4db00e26-15df-4181-9965-3fc76c451c45', p909='1da0d4a1-25cb-482d-96fb-3fc8efc7deba', p910='8912705c-03b5-4296-bb0d-3fc9cd0a79df', p911='6face501-08e8-4e86-9dd2-3fc9ee4b2901', p912='78aa015c-6efa-4a0e-99bf-3fca0f13f1f4', p913='da559175-c260-4b4b-acca-3fca640ff40a', p914='e3bad576-5215-413c-ae8a-3fcb0b3df303', p915='9d280db9-8a19-4cc4-9d25-3fcb43f70839', p916='1f00163e-e9f5-4f06-9b25-3fcb6aafbebe', p917='6ffbca3d-046e-448a-bfc1-3fcb8051ba56', p918='be436aa9-e524-468f-b0b4-3fcbfaf4492c', p919='1396b080-88b9-4cbc-8a6a-3fce31fd2cd4', p920='7d866cf1-1f50-42f6-b99d-3fcecee1373f', p921='90449056-a4d9-485f-bf82-3fcf10615238', p922='8d1856af-0e12-40e5-a3b5-3fcf116cc7a2', p923='707cb852-b051-4ecf-8d06-3fcf4d2d5158', p924='3e2ccf65-00ed-42a2-a478-3fcff1ce74ba', p925='d60a103c-15c5-4fb9-b7f9-3fd0a35bfc79', p926='1b91ee8a-fd05-460f-8a14-3fd163509360', p927='762ec1b6-b3bd-4a2c-97fa-3fd1e05c1fa1', p928='d947e751-e1fc-44b3-831a-3fd217a2338c', p929='25c9b86f-d6fb-4c83-a8c9-3fd3c99da131', p930='9e73bb36-0834-48dd-b6e9-3fd3e1d64c6b', p931='43ff0e42-a55b-47d5-a791-3fd3fd59b768', p932='2aed1525-4cab-4d02-8ee9-3fd4882b8966', p933='1bafb6a2-dba8-4c5f-b544-3fd49eae4aea', p934='754368d9-799b-42e3-a280-3fd4c3cd243a', p935='30f497d9-ee1a-4d08-8e14-3fd51c42763f', p936='cc7b1e36-8e6b-4366-8189-3fd540358055', p937='cef249ae-b582-4a1e-94bb-3fd5cadf42ae', p938='a48cf601-2113-45cd-9afd-3fd64ddb18d0', p939='6b10e621-3a5b-4907-8d58-3fd67aaf2e9b', p940='0529740a-1997-4882-8ebf-3fd6bca3bfa4', p941='06205f5b-c2ac-4511-bc95-3fd729b9edaf', p942='e88180c1-5432-4d2e-b78f-3fd8cc2ef873', p943='6ae5d61e-7e2a-457e-89a2-3fd990fc7126', p944='eaef42a0-1bc9-4903-a7dc-3fd9ed12a12c', p945='1349ada5-1724-47fc-9971-3fdab68c60b7', p946='28b12cec-6239-4b64-966e-3fdac9b89b7d', p947='8ab52f4d-88d8-477c-85c0-3fdbdbe71a08', p948='52518f4e-3fcd-4c2b-a7bf-3fdbe1bb187a', p949='72013960-2cec-466d-a59f-3fdbf826c782', p950='8590218e-253d-4b02-9a22-3fdc2e6f8de5', p951='d7ec2ce8-bddc-4ac2-8e3b-3fdcbf4f3336', p952='255ac13b-430c-4b30-af1c-3fdd3ac4e421', p953='c1fc33dc-d94d-48db-be63-3fddb45bee42', p954='1eca2028-9d3d-411e-b266-3fde46542f41', p955='e933c88a-5be5-48b5-a7de-3fde6ada5cae', p956='1598d87c-39d8-4563-8285-3fdf3687d99a', p957='2e91d1e1-b72b-458f-b4b4-3fdff6bd0807', p958='651bf708-9877-48c4-9d9f-3fe00b5632e0', p959='a82cc2c1-cc08-4118-b863-3fe03333e04e', p960='8ab3c250-7bcb-490d-9037-3fe147afe5f6', p961='d0992849-e870-43ba-b2fe-3fe1b91a13a6', p962='af46b3e5-af88-4e2c-b0ef-3fe263ab4d29', p963='e87d159e-a4c6-4a99-aceb-3fe2ab84acfb', p964='f402fbfd-417c-4522-954d-3fe30de22627', p965='df137120-2742-413c-8dae-3fe40ed3d7e4', p966='3aad5b53-f487-47b6-b613-3fe4292ec69f', p967='544bc92b-e0fb-4c29-9c3b-3fe525e815ee', p968='0b5c3d40-64df-4f5f-b9d8-3fe5d9408a07', p969='e0945f4f-86c8-44cb-8392-3fe5f04b61ae', p970='adbfc7cc-c054-4d4c-879f-3fe66c1520cc', p971='8b62531a-4042-4e51-b48e-3fe69e34f4c9', p972='282b80b4-da14-4124-bcb5-3fe903c5b68c', p973='e7c21f5a-7645-427e-ba1d-3fea7b0cb085', p974='469c51b9-38a4-4043-8718-3feb22420506', p975='bafa211d-be9e-4a17-947c-3feb441a686d', p976='9d122846-b1d3-4933-9ccb-3febb039ff20', p977='71f18acd-593d-4d7e-b51f-3febdf52cf95', p978='dca46870-e3b1-4852-b482-3fec98f51358', p979='eccb7ae4-27b1-4983-9a90-3fed7e5fb249', p980='c5a211c2-652b-4ec5-823a-3fee9cce9673', p981='d4b11467-a2e5-4e4c-9670-3ff0fd03259c', p982='d02b67fc-77a2-4fe7-8d6e-3ff11e58559a', p983='21df0247-c3fe-4f1b-8465-3ff177c29386', p984='37e60cab-33e6-4ba8-9fc9-3ff17df0f205', p985='a6f1f020-77aa-4026-82fa-3ff28b291b1c', p986='76aabf22-9d01-45d5-9f46-3ff41940d63c', p987='2b044108-78a1-4c08-baf8-3ff5c6f25a9b', p988='081c6e3f-33ca-445a-a622-3ff666384c19', p989='0afcaefb-5555-4cfb-97f6-3ff6a35bfaaf', p990='37eb8b70-3b81-4fdb-a161-3ff6f4c22227', p991='6a65192a-a7a5-49ec-a67a-3ff917e15111', p992='d3e0c969-44fd-4623-a38f-3ff94eb0d517', p993='a8380bfb-e2f2-4825-a951-3ff9dab20db4', p994='2f2896aa-d77a-4b00-ac32-3ffa8edcadea', p995='4b3c5c03-7737-45fa-a3b0-3ffaaab3038b', p996='2a3803b6-4409-4daa-96ea-3ffb3e09672f', p997='376ad446-5aca-4f8f-8cc6-3ffb80fe321e', p998='44413ec9-0278-4ff7-8fe7-3ffd5af56c48', p999='707193e0-5da9-4015-b490-3ffe23fc7913'], CommandType='Text', CommandTimeout='50000']
      SELECT * FROM Products WHERE [Key] IN (@P0, @P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10, @P11, @P12, @P13, @P14, @P15, @P16, @P17, @P18, @P19, @P20, @P21, @P22, @P23, @P24, @P25, @P26, @P27, @P28, @P29, @P30, @P31, @P32, @P33, @P34, @P35, @P36, @P37, @P38, @P39, @P40, @P41, @P42, @P43, @P44, @P45, @P46, @P47, @P48, @P49, @P50, @P51, @P52, @P53, @P54, @P55, @P56, @P57, @P58, @P59, @P60, @P61, @P62, @P63, @P64, @P65, @P66, @P67, @P68, @P69, @P70, @P71, @P72, @P73, @P74, @P75, @P76, @P77, @P78, @P79, @P80, @P81, @P82, @P83, @P84, @P85, @P86, @P87, @P88, @P89, @P90, @P91, @P92, @P93, @P94, @P95, @P96, @P97, @P98, @P99, @P100, @P101, @P102, @P103, @P104, @P105, @P106, @P107, @P108, @P109, @P110, @P111, @P112, @P113, @P114, @P115, @P116, @P117, @P118, @P119, @P120, @P121, @P122, @P123, @P124, @P125, @P126, @P127, @P128, @P129, @P130, @P131, @P132, @P133, @P134, @P135, @P136, @P137, @P138, @P139, @P140, @P141, @P142, @P143, @P144, @P145, @P146, @P147, @P148, @P149, @P150, @P151, @P152, @P153, @P154, @P155, @P156, @P157, @P158, @P159, @P160, @P161, @P162, @P163, @P164, @P165, @P166, @P167, @P168, @P169, @P170, @P171, @P172, @P173, @P174, @P175, @P176, @P177, @P178, @P179, @P180, @P181, @P182, @P183, @P184, @P185, @P186, @P187, @P188, @P189, @P190, @P191, @P192, @P193, @P194, @P195, @P196, @P197, @P198, @P199, @P200, @P201, @P202, @P203, @P204, @P205, @P206, @P207, @P208, @P209, @P210, @P211, @P212, @P213, @P214, @P215, @P216, @P217, @P218, @P219, @P220, @P221, @P222, @P223, @P224, @P225, @P226, @P227, @P228, @P229, @P230, @P231, @P232, @P233, @P234, @P235, @P236, @P237, @P238, @P239, @P240, @P241, @P242, @P243, @P244, @P245, @P246, @P247, @P248, @P249, @P250, @P251, @P252, @P253, @P254, @P255, @P256, @P257, @P258, @P259, @P260, @P261, @P262, @P263, @P264, @P265, @P266, @P267, @P268, @P269, @P270, @P271, @P272, @P273, @P274, @P275, @P276, @P277, @P278, @P279, @P280, @P281, @P282, @P283, @P284, @P285, @P286, @P287, @P288, @P289, @P290, @P291, @P292, @P293, @P294, @P295, @P296, @P297, @P298, @P299, @P300, @P301, @P302, @P303, @P304, @P305, @P306, @P307, @P308, @P309, @P310, @P311, @P312, @P313, @P314, @P315, @P316, @P317, @P318, @P319, @P320, @P321, @P322, @P323, @P324, @P325, @P326, @P327, @P328, @P329, @P330, @P331, @P332, @P333, @P334, @P335, @P336, @P337, @P338, @P339, @P340, @P341, @P342, @P343, @P344, @P345, @P346, @P347, @P348, @P349, @P350, @P351, @P352, @P353, @P354, @P355, @P356, @P357, @P358, @P359, @P360, @P361, @P362, @P363, @P364, @P365, @P366, @P367, @P368, @P369, @P370, @P371, @P372, @P373, @P374, @P375, @P376, @P377, @P378, @P379, @P380, @P381, @P382, @P383, @P384, @P385, @P386, @P387, @P388, @P389, @P390, @P391, @P392, @P393, @P394, @P395, @P396, @P397, @P398, @P399, @P400, @P401, @P402, @P403, @P404, @P405, @P406, @P407, @P408, @P409, @P410, @P411, @P412, @P413, @P414, @P415, @P416, @P417, @P418, @P419, @P420, @P421, @P422, @P423, @P424, @P425, @P426, @P427, @P428, @P429, @P430, @P431, @P432, @P433, @P434, @P435, @P436, @P437, @P438, @P439, @P440, @P441, @P442, @P443, @P444, @P445, @P446, @P447, @P448, @P449, @P450, @P451, @P452, @P453, @P454, @P455, @P456, @P457, @P458, @P459, @P460, @P461, @P462, @P463, @P464, @P465, @P466, @P467, @P468, @P469, @P470, @P471, @P472, @P473, @P474, @P475, @P476, @P477, @P478, @P479, @P480, @P481, @P482, @P483, @P484, @P485, @P486, @P487, @P488, @P489, @P490, @P491, @P492, @P493, @P494, @P495, @P496, @P497, @P498, @P499, @P500, @P501, @P502, @P503, @P504, @P505, @P506, @P507, @P508, @P509, @P510, @P511, @P512, @P513, @P514, @P515, @P516, @P517, @P518, @P519, @P520, @P521, @P522, @P523, @P524, @P525, @P526, @P527, @P528, @P529, @P530, @P531, @P532, @P533, @P534, @P535, @P536, @P537, @P538, @P539, @P540, @P541, @P542, @P543, @P544, @P545, @P546, @P547, @P548, @P549, @P550, @P551, @P552, @P553, @P554, @P555, @P556, @P557, @P558, @P559, @P560, @P561, @P562, @P563, @P564, @P565, @P566, @P567, @P568, @P569, @P570, @P571, @P572, @P573, @P574, @P575, @P576, @P577, @P578, @P579, @P580, @P581, @P582, @P583, @P584, @P585, @P586, @P587, @P588, @P589, @P590, @P591, @P592, @P593, @P594, @P595, @P596, @P597, @P598, @P599, @P600, @P601, @P602, @P603, @P604, @P605, @P606, @P607, @P608, @P609, @P610, @P611, @P612, @P613, @P614, @P615, @P616, @P617, @P618, @P619, @P620, @P621, @P622, @P623, @P624, @P625, @P626, @P627, @P628, @P629, @P630, @P631, @P632, @P633, @P634, @P635, @P636, @P637, @P638, @P639, @P640, @P641, @P642, @P643, @P644, @P645, @P646, @P647, @P648, @P649, @P650, @P651, @P652, @P653, @P654, @P655, @P656, @P657, @P658, @P659, @P660, @P661, @P662, @P663, @P664, @P665, @P666, @P667, @P668, @P669, @P670, @P671, @P672, @P673, @P674, @P675, @P676, @P677, @P678, @P679, @P680, @P681, @P682, @P683, @P684, @P685, @P686, @P687, @P688, @P689, @P690, @P691, @P692, @P693, @P694, @P695, @P696, @P697, @P698, @P699, @P700, @P701, @P702, @P703, @P704, @P705, @P706, @P707, @P708, @P709, @P710, @P711, @P712, @P713, @P714, @P715, @P716, @P717, @P718, @P719, @P720, @P721, @P722, @P723, @P724, @P725, @P726, @P727, @P728, @P729, @P730, @P731, @P732, @P733, @P734, @P735, @P736, @P737, @P738, @P739, @P740, @P741, @P742, @P743, @P744, @P745, @P746, @P747, @P748, @P749, @P750, @P751, @P752, @P753, @P754, @P755, @P756, @P757, @P758, @P759, @P760, @P761, @P762, @P763, @P764, @P765, @P766, @P767, @P768, @P769, @P770, @P771, @P772, @P773, @P774, @P775, @P776, @P777, @P778, @P779, @P780, @P781, @P782, @P783, @P784, @P785, @P786, @P787, @P788, @P789, @P790, @P791, @P792, @P793, @P794, @P795, @P796, @P797, @P798, @P799, @P800, @P801, @P802, @P803, @P804, @P805, @P806, @P807, @P808, @P809, @P810, @P811, @P812, @P813, @P814, @P815, @P816, @P817, @P818, @P819, @P820, @P821, @P822, @P823, @P824, @P825, @P826, @P827, @P828, @P829, @P830, @P831, @P832, @P833, @P834, @P835, @P836, @P837, @P838, @P839, @P840, @P841, @P842, @P843, @P844, @P845, @P846, @P847, @P848, @P849, @P850, @P851, @P852, @P853, @P854, @P855, @P856, @P857, @P858, @P859, @P860, @P861, @P862, @P863, @P864, @P865, @P866, @P867, @P868, @P869, @P870, @P871, @P872, @P873, @P874, @P875, @P876, @P877, @P878, @P879, @P880, @P881, @P882, @P883, @P884, @P885, @P886, @P887, @P888, @P889, @P890, @P891, @P892, @P893, @P894, @P895, @P896, @P897, @P898, @P899, @P900, @P901, @P902, @P903, @P904, @P905, @P906, @P907, @P908, @P909, @P910, @P911, @P912, @P913, @P914, @P915, @P916, @P917, @P918, @P919, @P920, @P921, @P922, @P923, @P924, @P925, @P926, @P927, @P928, @P929, @P930, @P931, @P932, @P933, @P934, @P935, @P936, @P937, @P938, @P939, @P940, @P941, @P942, @P943, @P944, @P945, @P946, @P947, @P948, @P949, @P950, @P951, @P952, @P953, @P954, @P955, @P956, @P957, @P958, @P959, @P960, @P961, @P962, @P963, @P964, @P965, @P966, @P967, @P968, @P969, @P970, @P971, @P972, @P973, @P974, @P975, @P976, @P977, @P978, @P979, @P980, @P981, @P982, @P983, @P984, @P985, @P986, @P987, @P988, @P989, @P990, @P991, @P992, @P993, @P994, @P995, @P996, @P997, @P998, @P999)

I still would consider the performance as good

@roji
Copy link
Member

roji commented Dec 7, 2022

@mkalinski93 I'm a bit confused - your latest benchmarks tests a single query with 1000 parameterized values, whereas the original one seems to test multiple queries with a far larger number. If you're trying to see how parameterization affects performance, you really need to compare two pieces of code which do exactly the same thing, except for one parameterizing and one not.

In addition, in the 1st sample you seem to have quite a bit of code interacting with EF's local view - but apparently not in the 2nd (that again invalidates any comparison). If you're interested in the effect of parameterization, I'd recommend focusing on that and removing any local view-related code.

To summarize, when doing any performance measurements, it's usually a good idea to isolate exactly what it is that you want to measure, and remove anything else.

@mkalinski93
Copy link
Author

mkalinski93 commented Dec 7, 2022

hey @roji,

it´s literally the same code, except the part I´ve attached above. I´m sorry for not including the entirety of the code.
Here you are.

Initial Code

public virtual async ValueTask<ICollection<TEntity>> GetObjectsByKeysAsync<TEntity>(ICollection keys, bool asNoTracking, CancellationToken cancellationToken = default) where TEntity : BaseEntity, new() {
        
        //Check for local entries first and exclude them from the query
        LocalView<TEntity> localSet = _context.Set<TEntity>().Local;
        List<TEntity> localEntities = localSet.Where(x => keys.OfType<object>().Any(y => x.KeyValue.Equals(y))).ToList();
        List<object> missingKeys = keys.OfType<object>().Where(x => !localEntities.Any(y => y.KeyValue.Equals(x))).ToList();
        if (!missingKeys.Any())
            return localEntities;

        //some keys are still missing
        string primaryKeyName = _sessionConfigurationProvider.MetadataStore.GetKeyName<TEntity>();
        List<TEntity> retrievedValues = new List<TEntity>();
        
        //this chunk is irrelevant to the query, because it seems that efcore generates multiple queries when reaching a certain amount of objects
        //I´ve kept it, because otherwise at around 100.000 objects, the dbcommand runs into a timeout
        IEnumerable<object[]> keyChunk = missingKeys.Chunk(50000);
        foreach (object[] objects in keyChunk) {
            Expression<Func<TEntity, bool>> expression = ExpressionTreeResolver.GenerateWhereInExpression<TEntity>(objects,primaryKeyName);
            retrievedValues.AddRange(await _context.Set<TEntity>().AsNoTracking(asNoTracking).Where(expression).ToListAsync(cancellationToken));    
        }

        return retrievedValues;
    }

Prototyped code for parameters (current)

    public virtual async ValueTask<ICollection<TEntity>> GetObjectsByKeysAsync<TEntity>(ICollection keys, bool asNoTracking, CancellationToken cancellationToken = default) where TEntity : BaseEntity, new() {
        //Check for local entries first and exclude them from the query
        LocalView<TEntity> localSet = _context.Set<TEntity>().Local;
        List<TEntity> localEntities = localSet.Where(x => keys.OfType<object>().Any(y => x.KeyValue.Equals(y))).ToList();
        List<object> missingKeys = keys.OfType<object>().Where(x => !localEntities.Any(y => y.KeyValue.Equals(x))).ToList();
        if (!missingKeys.Any())
            return localEntities;

        //some keys are still missing
        string primaryKeyName = _sessionConfigurationProvider.MetadataStore.GetKeyName<TEntity>();
        string tableName = _sessionConfigurationProvider.MetadataStore.GetTableName<TEntity>();
        List<TEntity> retrievedValues = new List<TEntity>();
        
        //this chunk is irrelevant to the query, because it seems that EfCore generates multiple queries when reaching a certain amount of objects
        //I´ve kept it, because otherwise at around 100.000 objects, the DbCommand runs into a timeout
        
        
        IEnumerable<object[]> keyChunk = missingKeys.Chunk(2000);
        foreach (object[] objects in keyChunk) {
            string query = $"SELECT * FROM {tableName} WHERE [{primaryKeyName}] IN ({string.Join(", ", objects.Select((t, i) => $"@P{i}"))})";
            retrievedValues.AddRange(await _context.Set<TEntity>().FromSqlRaw(query, objects).AsNoTracking(asNoTracking).ToListAsync(cancellationToken: cancellationToken));
            
            //Expression<Func<TEntity, bool>> expression = ExpressionTreeResolver.GenerateWhereInExpression<TEntity>(objects,primaryKeyName);
            //retrievedValues.AddRange(await _context.Set<TEntity>().AsNoTracking(asNoTracking).Where(expression).ToListAsync(cancellationToken));    
        }

        return retrievedValues;
    }

I´m still using the same values, the same amount and so on.
When you read my comment "Generated Query for a single batch (I don´t know why it is limited to 1000 - even though I have a chunk size of 2000)" - You can see that I´m kind off surprised by the fact, that even I´ve had 2.000 parameters/request, the generated sql produces just 1000 parameters in total. I will check out why this is happening.
I didn´t wanted to copy/paste the entire generated sql statement in here, because it is quiet long and repeating the same structure with different values.

Basically this was just a reaction to ErikEj's comment.

@roji
Copy link
Member

roji commented Dec 7, 2022

So am I understanding you correctly that you're seeing the parameterized query performing worse than the non-parameterized one, where both are exactly the same except for the parameterization?

@ajcvickers
Copy link
Contributor

@roji Note that in the benchmarks in the attached project, the context is never actually tracking any entities, so while the code to look up local values would probably be quite slow, it is not measured in these benchmarks, which essentially just do a single no-tracking query with a big Contains.

I was going to talk about this with the team in triage. :-)

@ajcvickers
Copy link
Contributor

parameterized query performing worse

This perf benefit is why we don't parameterize, even though both would cause cache pollution. :-) Remember you were going to look into this.

@roji
Copy link
Member

roji commented Dec 7, 2022

Yeah, that's why I'm surprised here... In my mental model there's no reason for a parameter to perform worse than a context (but apparently my mental model is wrong, at least for SQL Server...). I definitely want to play around with this a bit to see.

@roji
Copy link
Member

roji commented Dec 7, 2022

(though this may no longer be relevant specifically for the IN problem (#13617), assuming we go with a string/JSON inner join...

@mkalinski93
Copy link
Author

So am I understanding you correctly that you're seeing the parameterized query performing worse than the non-parameterized one, where both are exactly the same except for the parameterization?

Generally speaking, I´m not saying that x is faster than y. I´m just trying to implement a function and hope to achieve a good balance between performance and "low wtf count". As I´ve achieved the speed, I was surprised - this is why I´ve created this issue in the first place. To be precise, I´m no expert in any way. I can just test something and have an opinion. But this opinion can be flawed - this is why I´m asking you. Erik commented and pointed out that it produces cache pollution. So I was digging into it and tried to alter the code to see some differences. That´s why I´ve posted the previous comments.

@roji Note that in the benchmarks in the attached project, the context is never actually tracking any entities, so while the code to look up local values would probably be quite slow, it is not measured in these benchmarks, which essentially just do a single no-tracking query with a big Contains.
I was going to talk about this with the team in triage. :-)

It actually should be tracked

This is the benchmark

[Benchmark]
    public async Task FORM_GetByKeys25000Async() {
        await EfCoreUnitOfWork.GetObjectsByKeysAsync<Product>(KeysProvider.TestKeys25000, false //asNoTracking);
    }

In the GetObjectsByKeys method there is this line

//AsNoTracking is false
retrievedValues.AddRange(await _context.Set<TEntity>().AsNoTracking(asNoTracking).Where(expression).ToListAsync(cancellationToken));

It is using an extension method

namespace GGM.ORM.Extensions; 

public static class IQueryableExtensions {
    public static IQueryable<TEntity> AsNoTracking<TEntity>(this IQueryable<TEntity> queryable, bool value) where TEntity : BaseEntity {
        //if value is true, then use AsNoTracking() - otherwise don´t
        return value ? queryable.AsNoTracking() : queryable;
    }
}

The reason I´m checking for local entities is that I want to extend this method in the future.
My approach is to reduce roundtrips to the datastore and if I´ve already loaded certain keys into the local set, then why not returning them. But this behaviour will be enabled/disabled explicitely by the dev.

@roji
Copy link
Member

roji commented Dec 7, 2022

@mkalinski93 sure thing - and thanks for your comments (I wasn't trying to imply anything was wrong/problematic in what you wrote).

I think we went off on a tangent here with the parameterization question, which doesn't seem to have anything to do with your original question. I'll do some minimal benchmarking specifically for the parameterization, but we should concentrate on your original code, whether it's correct and whether the performance indicates anything to be concerned about.

@roji
Copy link
Member

roji commented Dec 7, 2022

Final note on the parameterization: I did the benchmarking and posted all the results in #13617 (comment). tl;dr in SQL Server parameterization indeed has a significant negative impact in this scenario.

@ErikEJ
Copy link
Contributor

ErikEJ commented Dec 7, 2022

@roji
Copy link
Member

roji commented Dec 7, 2022

Thanks @ErikEJ, I forgot about that - will rerun the benchmarks for SQL Server with and without that flag.

@ajcvickers
Copy link
Contributor

I have filed #29841 for the parameter optimization. Thanks, Erik!

@mkalinski93 A couple of observations after discussing with the team:

@ErikEJ
Copy link
Contributor

ErikEJ commented Dec 13, 2022

@mkalinski93
Copy link
Author

Hey @ajcvickers,

thank you for your response.
I think we will stick to it until #13617 is resolved.
We won´t use it often and it´s likely a rare scenario to actually load such amount of data. Fingers crossed.

The linear search on the tracked entities however, can be refactored to be more efficient. I have got a few ideas in mind already.

@mkalinski93
Copy link
Author

@mkalinski93 There is also the STRING_SPLIT option: https://erikej.github.io/efcore/sqlserver/2021/11/22/efcore-sqlserver-cache-pollution.html

thanks, I´m going to look into it, maybe this can help - at least for mssql.

@ajcvickers ajcvickers added the closed-no-further-action The issue is closed and no further action is planned. label Dec 13, 2022
@ajcvickers ajcvickers closed this as not planned Won't fix, can't repro, duplicate, stale Dec 13, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
closed-no-further-action The issue is closed and no further action is planned. customer-reported
Projects
None yet
Development

No branches or pull requests

4 participants