Sql server 数据提取问题,更快的数据提取工具
在我的查询中,我使用索引,但数据获取结果的时间是5分钟,有时是7分钟。 我在一个表中有4284399770条记录。 是否有任何工具可以使用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
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进行查询,但仍然面临一个问题:您为什么“需要”它?如果你真的“需要”它,我建议只需要针对一个,或者你应该在批处理级别设置隔离级别;不是针对每个表。请尝试添加选项(重新编译)
查询提示并删除索引提示。