我在应用程序中遇到性能问题 我隔离了导致问题的查询,并且是参数查询。 查询是这个查询(由NHibernate生成)
declare @p8 as varchar(4000);
set @p8 = 'AT0703%';
SELECT sum(Movimenti.Importo)
FROM Movimenti
WHERE (IDConto LIKE @p8)
此查询导致表Movimenti的表扫描 Movimenti.IDConto是一个varchar(15)
以这种方式更改查询
declare @p8 as varchar(4000);
set @p8 = 'AT0703%';
SELECT sum(Movimenti.Importo)
FROM Movimenti
WHERE (IDConto LIKE 'AT0703%')
使用索引。
我试图插入
option (optimize for unknown)
和
option (optimize for (@p8 unknown))
在查询结束时但没有改变结果。
有没有解决方案?
答案 0 :(得分:1)
使用OPTIMIZE FOR (@p8 = 'AT%')
以便SQL Server将使用示例模式来确定它是否可以/应该使用索引。不以%
开头的LIKE条件可以使用索引。
有关更深入的信息,例如看这篇文章:
https://www.mssqltips.com/sqlservertip/1354/optimize-parameter-driven-queries-with-sql-server-optimize-for-hint/
我不知道你是否可以让NHibernate提供这个提示。
答案 1 :(得分:0)
使用动态SQL:
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
const double COUNTY_TAX = 0.02;
const double STATE_TAX = 0.04;
double totalSales;
void Taxes();
int main ()
{
cout << "Please enter the total dollar amount of sales: $";
cin >> totalSales;
Taxes();
return 0;
}
void Taxes()
{
double countyTax, stateTax, total;
countyTax = totalSales * COUNTY_TAX;
stateTax = totalSales * STATE_TAX;
total = countyTax + stateTax;
cout << "The County Tax is: $" << fixed << setprecision(2) << countyTax << endl;
cout << "The State Tax is: $" << fixed << setprecision(2) << stateTax << endl;
cout << "The total is: $" << fixed << setprecision(2) << total << endl;
}
答案 2 :(得分:0)
我无法证实这一点,但你可以!您的第二个查询是可以查询的,而您的第一个查询可能不是,请尝试执行此操作
WHERE (IDConto LIKE @p8 + '%')