From 7dd6839dc43cdaf0157207afd56781be6c4a59c2 Mon Sep 17 00:00:00 2001 From: iyusupov Date: Tue, 22 Oct 2019 23:50:18 +0500 Subject: [PATCH 1/3] Avoid parameter sniffing for exists subquery --- QueryBuilder/Base.Where.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/QueryBuilder/Base.Where.cs b/QueryBuilder/Base.Where.cs index 749d5ae8..b991addc 100644 --- a/QueryBuilder/Base.Where.cs +++ b/QueryBuilder/Base.Where.cs @@ -527,8 +527,7 @@ public Q WhereExists(Query query) // remove unneeded components query = query.Clone().ClearComponent("select") - .SelectRaw("1") - .Limit(1); + .SelectRaw("1"); return AddComponent("where", new ExistsCondition { @@ -690,4 +689,4 @@ public Q OrWhereNotTime(string column, object value) #endregion } -} \ No newline at end of file +} From 4d769065e50d43c8b54b5eebac98002df01ab237 Mon Sep 17 00:00:00 2001 From: iyusupov Date: Wed, 23 Oct 2019 00:13:11 +0500 Subject: [PATCH 2/3] Avoid parameter sniffing for exists subquery, fix tests --- QueryBuilder.Tests/SqlServer/NestedSelectTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs b/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs index fcdfbfa9..9495751d 100644 --- a/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs +++ b/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs @@ -56,7 +56,7 @@ public void SqlCompile_QueryLimitAndNestedLimit_BindingValue() // var q = new Query().From("Foo").Where("C", "c").WhereExists(n).Where("A", "a"); var actual = compiler.Compile(q).ToString(); - Assert.Contains("SELECT * FROM [Foo] WHERE [x] = true AND NOT EXISTS (SELECT TOP (1) 1 FROM [Bar])", + Assert.Contains("SELECT * FROM [Foo] WHERE [x] = true AND NOT EXISTS (SELECT 1 FROM [Bar])", actual); // Assert.Contains("SELECT * FROM [Foo] WHERE [C] = 'c' AND EXISTS (SELECT TOP (1) 1 FROM [Bar]) AND [A] = 'a'", actual); } From de085733b036b5753772131036959bbf83b8b623 Mon Sep 17 00:00:00 2001 From: iyusupov Date: Wed, 23 Oct 2019 00:21:55 +0500 Subject: [PATCH 3/3] Avoid parameter sniffing for exists subquery, fix tests --- QueryBuilder.Tests/DefineTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QueryBuilder.Tests/DefineTest.cs b/QueryBuilder.Tests/DefineTest.cs index b3e63030..a68af920 100644 --- a/QueryBuilder.Tests/DefineTest.cs +++ b/QueryBuilder.Tests/DefineTest.cs @@ -306,7 +306,7 @@ public void Test_Define_WhereExists() ); var c = Compile(query); - Assert.Equal("SELECT * FROM [Customers] WHERE EXISTS (SELECT TOP (1) 1 FROM [Orders] WHERE [ShipPostalCode] = '8200')", c[EngineCodes.SqlServer]); + Assert.Equal("SELECT * FROM [Customers] WHERE EXISTS (SELECT 1 FROM [Orders] WHERE [ShipPostalCode] = '8200')", c[EngineCodes.SqlServer]); }