Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于参数化查询的Sql server索引_Sql_Sql Server_Indexing_Sql Server 2012 - Fatal编程技术网

用于参数化查询的Sql server索引

用于参数化查询的Sql server索引,sql,sql-server,indexing,sql-server-2012,Sql,Sql Server,Indexing,Sql Server 2012,我想为sql查询创建最佳索引。用户可以在UI上选择选项,从中生成查询。以下是表格和查询: 创建表[dbo]。[MyTable] [Id][nvarchar]32不为空, [SomeKey][int]不为空, [Col1][nvarchar]最大空值, [Col2][nvarchar]最大空值, [NumCol1][int]不为空, [NumCol2][int]不为空, [BitCol1][bit]不为空, [BitCol2][bit]不为空, [已创建][日期时间]不为空 约束[PK_dbo.M

我想为sql查询创建最佳索引。用户可以在UI上选择选项,从中生成查询。以下是表格和查询:

创建表[dbo]。[MyTable] [Id][nvarchar]32不为空, [SomeKey][int]不为空, [Col1][nvarchar]最大空值, [Col2][nvarchar]最大空值, [NumCol1][int]不为空, [NumCol2][int]不为空, [BitCol1][bit]不为空, [BitCol2][bit]不为空, [已创建][日期时间]不为空 约束[PK_dbo.MyTable]主键聚集 [Id]ASC 在PAD\u INDEX=OFF、STATISTICS\u norecocomputer=OFF、IGNORE\u DUP\u KEY=OFF、ALLOW\u ROW\u LOCKS=ON、ALLOW\u PAGE\u LOCKS=ON[PRIMARY]的情况下 在[PRIMARY]文本上图像在[PRIMARY]上 查询如下:

ALTER PROCEDURE[dbo].[MyTable] @SomeKey INT、@Col1位、@Col2位、@BitCol1位、@BitCol2位、, @NumCol1 INT、@NumCol2 INT、@offset INT、@take INT 像 声明@sql NVARCHARMAX,@paramlist nvarchar4000 SET@sql='从MyTable中选择[Id]、[SomeKey]、[Col1]、[Col2]、[NumCol1]、[NumCol2]、[BitCol1]、[BitCol2],其中SomeKey=@SomeKey' 如果@NumCol1不为NULL,请选择@sql=@sql+'和NumCol1=@NumCol1' 如果@NumCol2不为NULL,请选择@sql=@sql+'和NumCol2>@NumCol2' 如果@Col1不为NULL,请选择@sql=@sql+'和Col1=或Col1为NULL' 如果@Col2不为NULL,请选择@sql=@sql+'和Col2=或Col2为NULL' 如果@BitCol1不为NULL,请选择@sql=@sql+'和BitCol1=1' 如果@BitCol2不为NULL,请选择@sql=@sql+'和BitCol2=1' 选择@sql=@sql+“按创建的偏移量排序@OFFSET ROWS获取下一个@take ROWS ONLY” 选择@paramlist='@SomeKey INT,@Col1 INT,….' EXEC sp_executesql@sql、@paramlist、@SomeKey、@Col1、@Col2、。。。 希望你明白我的意思。我正在数据库中构建查询字符串,并执行它。如果我发送param Col1=true,这意味着我希望db中的所有Col1都为空。从应用程序中,我确保准备好所有参数。我希望其余的都是不言自明的,但请随时在评论中提出任何问题

如何对此表/查询建立索引,以避免索引扫描或类似的“慢速”搜索?而且,我只是一个web开发人员,所以这种高级索引对我来说是新事物!Db是SQL Server 2012

更新:使用场景 表的最大行数为100k到10m-20m。行数不会更新。当应用程序运行时,插入将以500SQLBulkCopy c类为单位,每5-10分钟或更长时间插入一次,但不总是运行。每周一次,根据SomeKey列删除两行。
应用程序不会同时有很多用户,可能很少,最多10个,所以不要期望每秒有很多查询,每5-10秒查询一次,但我希望它能以毫秒为单位快速测量,而不是以秒为单位。

索引是一种折衷。它必须根据表中的数据更改进行更新,因此要小心使用插入和更新量很大的表

在SQLServerManagementStudio中,您可以看到查询的执行过程。在“查询”菜单下有相应的选项。您将能够看到在查询执行过程中花费的时间最多的是什么

另一个选项是Tuning advisor,可从菜单工具>数据库引擎Tuning advisor访问。它将建议创建索引

搜索中的任何变量,比如WHERE,都是一个很好的索引候选变量

索引不是会杀死你的东西。您可以使用它来找到最佳解决方案,并且可以在生产过程中进行更改,而不会出现重大问题。不幸的是,是否需要索引不仅取决于表设计,还取决于该表中的数据量、数据多样性以及对该表执行的操作的性质

更新:

什么可以帮助您:

关于你的执行计划,我建议你读一下


索引扫描通常是从给定列中检索大量数据的结果。

最佳解决方案实际上取决于我们正在处理的资源—表中有多少行,可用的内存/空间有多少,使用动态参数的频率有多高,表中读多于写的典型使用模式是什么

我的赌注是首先在总是被引用的某个键上添加索引,然后尝试添加创建的索引,因为总是使用排序。您还可以通过使位列静态过滤来改进逻辑—它们总是这样或那样—您知道所有可能的值,然后将它们添加到SomeKey和Created之间的索引中

最后,您可以尝试添加INT列作为键的包含列,以查看添加的索引大小是否与较少的磁盘读取相偏移


这是因为一切都取决于您的典型工作负载。做相应的测试。

这是我的实际查询计划,我不喜欢这个索引扫描。但我现在在黑暗中拍摄,希望得到某种专家的答案。