相关疑难解决方法(0)

“SARGable”这个词的真正含义是什么?

SQL Server 用户使用术语“sargable”。我想知道“sargable”是否有一个客观的、与实现无关的永恒定义。

例如,WHERE foo LIKE '%bar%'很多人说它不可 sargable 的,但一些 RDBMS能够在此类查询上使用索引。那么“不可以”是什么意思呢?

其他参考

terminology

37
推荐指数
3
解决办法
1万
查看次数

为什么我的查询搜索日期时间不匹配?

select * 
from A 
where posted_date >= '2015-07-27 00:00:00.000' 
  and posted_date  <= '2015-07-27 23:59:59.999'
Run Code Online (Sandbox Code Playgroud)

但是结果中包含了今天posted_date 的记录:2015-07-28。我的数据库服务器不在我的国家。问题是什么 ?

sql-server datetime

21
推荐指数
4
解决办法
4万
查看次数

在 T-SQL 中使用 CAST 的性能下降

我们有一个 SQL 生成器,它通常为指定的字段发出 SQL 条件语句(为了讨论:我们将标记为myField)。

如果myField是类型的NVARCHAR,我们能做到说场对像这样的字符串的比较:myField = 'foo'

但是,这不适用于类型为 的字段NTEXT。因此,我们必须与演员表进行比较: CAST(myField as NVARCHAR(MAX)) = 'foo'。如果myFieldNVARCHAR或类型,这实际上会起作用NTEXT

已经是类型的字段上进行上述演员表的性能影响是什么NVARCHAR?我希望 SQL Server 足够聪明,可以动态识别myField已经是类型的NVARCHAR(有效地将其CAST转换为无操作)。

performance sql-server type-conversion

12
推荐指数
3
解决办法
2万
查看次数

加速对 1100 万行表的聚合查询

我有一个要加速的查询:

SELECT 
  sum(case when FlagDTD = 1 then Success else 0 end)   as SuccessDTD
, sum(case when FlagDTD = 1 then [Error] else 0 end)   as ErrorDTD
, round(sum(case when FlagDTD = 1 then Success else 0 end) * 100.0 / sum(FlagDTD),2) 
    as RateDTD
, sum(case when FlagYTD = 1 then Success else 0 end)   as SuccessYTD
, sum(case when FlagYTD = 1 then [Error] else 0 end)   as ErrorYTD
, round(sum(case when FlagYTD = 1 then Success else 0 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012 query-performance

6
推荐指数
1
解决办法
9981
查看次数

WHERE 子句中的优化日期比较,转换还是 datediff=0?

在我的查询中,我比较了WHERE子句中的两个日期

一旦使用CONVERT

CONVERT(day,InsertedOn) = CONVERT(day,GETDATE())
Run Code Online (Sandbox Code Playgroud)

另一个使用DATEDIFF

DATEDIFF(day,InsertedOn,GETDATE()) = 0
Run Code Online (Sandbox Code Playgroud)

这是执行计划

对于第一个使用 CONVERT 在此处输入图片说明

对于第二个使用 DATEDIFF 在此处输入图片说明

的数据类型InsertedOndatetime

哪个更优化?

performance sql-server execution-plan query-performance

5
推荐指数
1
解决办法
1万
查看次数

如何提高选择速度?

我有一个这样设置的表:

DB 有 10B 行。

CREATE TABLE [Tick].[X_H](
       [utcDT] [datetime2](7) NOT NULL,
       [Symbol] [nvarchar](50) NOT NULL,
       [Bid] [float] NULL,
       [Ask] [float] NULL,
       [BidSize] [float] NULL,
       [AskSize] [float] NULL
) ON [PRIMARY] 


ALTER TABLE [Tick].[X_H] ADD  CONSTRAINT [PK_Master] PRIMARY KEY CLUSTERED 
(
       [utcDT] ASC,
       [Symbol] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
Run Code Online (Sandbox Code Playgroud)

我想为特定符号选择一天的数据。我在用:

SELECT *  
FROM [Tick].[X_H] 
WHERE [Symbol] = 'DONKEY' 
AND CONVERT(Date, [utcDT]) = …
Run Code Online (Sandbox Code Playgroud)

performance sql-server query-performance

4
推荐指数
1
解决办法
280
查看次数

我应该使用强制转换或范围将日期时间加入日期吗?

这个问题是从这里提出的优秀问题中提取出来的:

迄今为止的演员阵容是可以讨论的,但这是一个好主意吗?

就我而言,我不关心该WHERE子句,而是关心加入具有类型列的事件表DATE

一个表有DATETIME2,另一个有DATE......所以我可以有效地JOIN使用aCAST( AS DATE)或者我可以使用“传统”范围查询(>=日期和<日期+1)。

我的问题是哪个更可取?这些DATETIME几乎永远不会与谓词DATE值匹配。

我希望保持在 200 万行DATETIME和 5000行以下DATE(如果这个考虑有所不同)

我是否应该期望在JOIN使用该WHERE子句时具有相同的行为?我应该更喜欢哪个通过缩放来保持性能?答案是否随 MSSQL 2012 而改变?

我的通用用例是将我的事件表视为日历表

SELECT
    events.columns
    ,SOME_AGGREGATIONS(tasks.column)
FROM
    events
LEFT OUTER JOIN
    tasks
        --This appropriately states my intent clearer
        ON CAST(tasks.datetimecolumn AS DATE) = events.datecolumn 
        --But is this more effective/scalable?
        --ON tasks.datetimecolumn >= events.datecolumn 
        --AND tasks.datetimecolumn < DATEADD(day,1,events.datecolumn)
GROUP BY
    events.columns
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2008-r2 sql-server-2012 datetime

3
推荐指数
1
解决办法
3万
查看次数

在 DATETIME 列上连接表时优化 SQL Server 查询

我正在使用 SQL Server,我有两个表,table1并且table2. 两个表都有一个DATETIME表示为 的列dt。我不仅需要根据某些条件连接这些表,还要确保匹配的行具有相同的日期(此处不考虑时间)dt

这是我当前使用的查询:

select *
From table1 a inner join table2 b
    on a.id = b.a_id
    and convert(date, a.dt) = convert(date, b.dt)
Run Code Online (Sandbox Code Playgroud)

该查询可以获取我需要的结果,但我担心它的性能,尤其是当表大小增加时。

我想知道是否有更高效的方法可以达到相同的结果?是否有技术或 SQL Server 功能可以帮助我优化此查询,尤其是日期比较部分?

任何意见或建议将不胜感激。先感谢您。

join sql-server datetime date

3
推荐指数
1
解决办法
1485
查看次数

在 where 子句中使用日期时间和日期数据类型时是否有截止时间?

我有一个标题为reached_date的列。在我的查询中,该列的大部分值是2016-09-30 23:59:59.997

然后我有一个 where 子句,内容如下:

WHERE achieved_date between '20160901' and '20160930'
Run Code Online (Sandbox Code Playgroud)

具有 2016-09-30 23:59:59.997 值的记录没有包含在我应该包含的结果中。我的意思是交易记录在 9 月 30 日。

如果这是一个奇怪的数据类型问题,有什么想法吗?

sql-server datatypes t-sql datetime date

2
推荐指数
1
解决办法
106
查看次数

只需要根据日期查询记录(给出示例查询)

sSQL = "
SELECT ordID, ordName, ordDate, ordShipping, ordStateTax, 
       ordHandling, ordTotal, ordDiscount, ordPrivateStatus 
FROM orders 
WHERE (ordStatus = 7)
"
Run Code Online (Sandbox Code Playgroud)

我想将昨天收到的订单显示为我正在构建的每日报告脚本

我该怎么办?

SQL Server 2005

ordDate 有这种格式: 2015-01-28 14:58:49.000

sql-server-2005 sql-server

1
推荐指数
1
解决办法
1195
查看次数