Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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 Server_Database - Fatal编程技术网

Sql server 数据提取问题,更快的数据提取工具

Sql server 数据提取问题,更快的数据提取工具,sql-server,database,Sql Server,Database,在我的查询中,我使用索引,但数据获取结果的时间是5分钟,有时是7分钟。 我在一个表中有4284399770条记录。 是否有任何工具可以使用SQL server更快地获取数据? 请推荐任何快速获取数据的工具或服务 Declare @FromDate Datetime ='2019-06-27 16:57:01.000' Declare @Todate Datetime = '2019-06-28 16:29:19.000' Declare @regist

在我的查询中,我使用索引,但数据获取结果的时间是5分钟,有时是7分钟。 我在一个表中有4284399770条记录。 是否有任何工具可以使用SQL server更快地获取数据? 请推荐任何快速获取数据的工具或服务

  Declare @FromDate Datetime  ='2019-06-27 16:57:01.000'        
Declare @Todate Datetime =    '2019-06-28 16:29:19.000'        
Declare @register_ID int =-9999    
Declare @location_number int =-9999    
Declare @receipt_number int =-9999    
Declare @VenueID int =-9999  
Declare @MediaType int =-9999
select        
 EJTable.register_ID'Terminal ID'        
,EJTable.location_number         
,EJTable.receipt_number        
,EJTable.VenueID'clerk NO'        
,EJTable.Sale_Total        
,EJTable.Receipt_date_time        
,EJTable.SQLPostDate        
from  EJTable WITH (NOLOCK,INDEX( IX_Receipt_Date_Time))  
INNER JOIN EJMediaTable WITH (NOLOCK ,INDEX (IX_MediaType) ) ON EJMediaTable.Transaction_Number = EJTable.Transaction_Number 
where          
(EJTable.Receipt_date_time between @FromDate and @Todate)      
and    
(isnull (@register_ID ,-9999)=-9999 or  EJTable.register_ID=@register_ID)    
and     
(isnull (@location_number , -9999)=-9999 or  EJTable.location_number=@location_number)    
and    
(isnull (@receipt_number ,-9999)=-9999 or  EJTable.receipt_number=@receipt_number)    
and    
(isnull (@VenueID ,-9999)=-9999 or  EJTable.VenueID=@VenueID) 
and
(isnull (@MediaType ,-9999)=-9999 or  EJMediaTable.MediaType=@MediaType)

我个人会在这里创建一个动态查询。您可以使用
选项(重新编译)
,但是,由于您可以在这里运行各种不同的查询(由于有5个
NULL
able参数),我觉得使用动态方法,仅使用
WHERE
中需要的子句,就可以为RDBMS提供最好的机会

正如我和古兹曼都提到的,我也删除了这两个暗示;由于不同的原因,这些措施可能弊大于利
NOLOCK
,因为查询可能返回错误的结果,
INDEX
提示,因为该索引不太可能对将要运行的15个左右不同的查询有帮助

我无法测试此查询,因为没有示例数据,但您可以使用您最好的朋友调试任何错误:

DECLARE@FromDate-datetime='2019-06-27T16:57:01.000',
@Todate datetime='2019-06-28T16:29:19.000',
@寄存器\u ID int,-使用NULL,而不是随机非NULL值
@位置号int,--使用NULL,而不是随机非NULL值
@收据编号int,-使用空值,而不是随机非空值
@VenueID int,--使用NULL,而不是随机非NULL值
@中间型int--使用NULL,而不是随机的非NULL值
声明@SQL nvarchar(最大值),
@CRLF-nchar(2)=nchar(13)+nchar(10);
设置@SQL=N'选择EJT.register_ID为[Terminal ID],'+@CRLF+
位置号“+@CRLF”+
EJT.收据编号“+@CRLF”+
N'EJT.VenueID作为[办事员编号],'+@CRLF+
总销售额,+@CRLF+
N'EJT.收据日期时间,'+@CRLF+
N'EJT.SQLPostDate'+@CRLF+
N'FROM dbo.EJTable EJT'+@CRLF+--删除了提示,它们很可能在这里有所帮助
N'JOIN dbo.EJMediaTable EJMT ON EJT.Transaction_Number=EJTM.Transaction_Number'+@CRLF+--实际上更可能导致性能下降

N'WHERE EJT.Receipt\u date\u time>=@FromDate和EJT.Receipt\u date\u time您拥有的是一个“全面”或“厨房水槽”查询。这些需要不同的写入方法,以确保它们针对不同的参数集执行。Bertrand和Shaw在这些方面都写了一些很棒的文章:还有,你真的需要
NOLOCK
?你明白它的使用意味着什么吗?而且,您很少需要告诉RDBMS需要使用什么索引;我怀疑在这里说出来会有帮助,事实上也可能有害。@Larnu是的,先生,我需要诺洛克。先生,我也使用sp_executesql进行查询,但仍然面临一个问题:您为什么“需要”它?如果你真的“需要”它,我建议只需要针对一个,或者你应该在批处理级别设置隔离级别;不是针对每个表。请尝试添加
选项(重新编译)
查询提示并删除索引提示。