SQL Server(2016)不使用带参数查询的索引

时间:2017-02-02 15:50:14

标签: sql sql-server nhibernate sql-server-2016

我在应用程序中遇到性能问题 我隔离了导致问题的查询,并且是参数查询。 查询是这个查询(由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))

在查询结束时但没有改变结果。
有没有解决方案?

3 个答案:

答案 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 + '%')