Why are parameters slower than literal values in a where clause?

夙愿已清 提交于 2019-12-05 21:24:58

Do data types of parameter and column match? They don't it appears so datatype precedence applies

The column is smallint, but you send int. The column will be converted to int because it has a higher precedence. So it won't use an index.

Does it make any difference if you declare the b variable to be a short instead of int? Does it make any difference if you explicitly specify the types of the parameters? Does it make any difference if you use "where a=@a and b=@b" instead of the comma form?

I agree this does sound odd, and I wouldn't really expect any of these changes to help, but it's probably worth a try.

You may tell SQL Server which index to use for a query. Use the WITH (INDEX = INDEX_ID) option where INDEX_ID is the ID of the index.

Get index ID's with:

SELECT i.indid, i.name FROM sysindexes i
INNER JOIN sysobjects o ON o.ID = i.id
WHERE o.Name = 'table'

So try then:

SELECT * FROM table(NOLOCK) WITH (INDEX = 1) WHERE a=@a and b=@b

As @gbn said, setting the data type should make it easy for you.

string where =
  String.Format("a='{0}' and b={1}", a, b);

In the example above, you are telling SQL to treat parameter a as char.
Whereas, in other example it will be treated as a varchar.

Use SQL profiler to see what is the SQL that gets executed in both the cases. That should clear it for you.

In the first case you are adding SqlParameter classes to the command. When the command is executed it is most likely generating DECLARE statements with the wrong data type. (You can verify this with a SQL trace.) If this is the case, the optimizer cannot select the correct index and falls back to a table scan.

If you use a stored proc instead, you would be forcing the parameters into the data types you declare. However, you can still do this from code if you specify the SqlDbType on the parameters.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!