标签: query-optimization

或SQL运算符短路

我想咨询SQL Server OR短路

码:

   DECLARE @tempTable table
      (
         id int
      )
      INSERT @tempTable(id) values(1)

      DECLARE @id varchar(10)
      SET @id = 'x'
      SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully
      SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int
Run Code Online (Sandbox Code Playgroud)

为什么?1 = 1且@ id ='x'为真.

SQL Server OR运算符:是否有短路功能?

谢谢

t-sql sql-server query-optimization short-circuiting

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

如何使JOIN查询使用索引?

我有两张桌子:

CREATE TABLE `articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(1000) DEFAULT NULL,
  `last_updated` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `last_updated` (`last_updated`),
) ENGINE=InnoDB AUTO_INCREMENT=799681 DEFAULT CHARSET=utf8 

CREATE TABLE `article_categories` (
  `article_id` int(11) NOT NULL DEFAULT '0',
  `category_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`article_id`,`category_id`),
  KEY `category_id` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
Run Code Online (Sandbox Code Playgroud)

这是我的查询:

SELECT a.*
FROM
    articles AS a,
    article_categories AS c
WHERE
    a.id = c.article_id
    AND c.category_id = 78
    AND a.comment_cnt > 0
    AND a.deleted …
Run Code Online (Sandbox Code Playgroud)

mysql sql join query-optimization

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

对于自动增量字段:MAX(ID)vs TOP 1 ID ORDER BY ID DESC

我想从字段中找到最高的AutoIncremented值.(它不会在我可以使用的插入后获取@@SCOPE_IDENTITY等)这两个查询中的哪一个会运行得更快或提供更好的性能. Id是主要的关键和autoincrement领域Table1.这适用于Sql Server 2005.

SELECT MAX(Id) FROM Table1

SELECT TOP 1 Id FROM Table1 ORDER BY Id DESC
Run Code Online (Sandbox Code Playgroud)

[编辑]
在这种情况下,Id是我已定义聚簇索引的字段.
如果索引是ID DESC那么..
是的,如果
1. Id是聚簇索引+主键,那么知道如何影响性能会很好.
2. Id是聚簇索引而不是主键.
3. Id是非聚集索引ASC +主键.
4. Id是非聚集索引ASC而不是主键.
5. Id是非聚集索引DESC +主键.
6. Id是非聚集索引DESC而不是主键.
我只是AutoIncrement

希望它不是一个很高的命令!

sql sql-server sql-server-2005 query-optimization

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

与WHERE子句一起使用时优化Oracle CONNECT BY

在同一查询中应用条件之前应用Oracle START WITH ... CONNECT BY子句.因此,WHERE约束无助于优化.WHERECONNECT BY

例如,以下查询可能会执行全表扫描(忽略选择性dept_id):

SELECT * FROM employees 
WHERE dept_id = 'SALE'
START WITH manager_id is null
CONNECT BY PRIOR employee_id = manager_id
Run Code Online (Sandbox Code Playgroud)

我尝试通过两种方式提高性能:

查询A:

SELECT * FROM employees 
START WITH manager_id is null AND dept_id = 'SALE'
CONNECT BY PRIOR employee_id = manager_id
Run Code Online (Sandbox Code Playgroud)

查询B:

SELECT * FROM (
               SELECT * FROM employees 
                WHERE dept_id = 'SALE'
              )
START WITH manager_id is null
CONNECT BY PRIOR employee_id = manager_id …
Run Code Online (Sandbox Code Playgroud)

sql oracle performance select query-optimization

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

T-SQL Where子句案例语句优化(StoredProc的可选参数)

我一直在争夺这一个.我有一个存储过程,它接受3个用于过滤的参数.如果传入特定值,我想对其进行过滤.如果传入-1,请全部给我.

我试过以下两种方式:

第一种方式:

SELECT field1, field2...etc  
FROM my_view  
WHERE  
parm1 = CASE WHEN @PARM1= -1 THEN parm1  ELSE @PARM1 END  
AND parm2 = CASE WHEN @PARM2 = -1 THEN parm2  ELSE @PARM2 END  
AND parm3 = CASE WHEN @PARM3 = -1 THEN parm3  ELSE @PARM3 END
Run Code Online (Sandbox Code Playgroud)

第二种方式:

SELECT field1, field2...etc  
FROM my_view  
WHERE  
(@PARM1 = -1 OR parm1 = @PARM1)  
AND (@PARM2 = -1 OR parm2 = @PARM2)  
AND (@PARM3 = -1 OR parm3 = @PARM3)  
Run Code Online (Sandbox Code Playgroud)

我读到某处,第二种方式会短路,如果是真的话,永远不会评估第二种方式.我的DBA说它强制进行表扫描.我还没有验证这一点,但在某些情况下似乎运行速度较慢.

此视图选择的主表有大约150万条记录,并且视图继续加入大约15个其他表以收集大量其他信息.

这两种方法都很慢......把我从瞬间带到2-40秒的任何地方,这在我的情况下是完全不可接受的.

是否有更好的方法不涉及将其分解为特定vs …

t-sql sql-server case query-optimization where-clause

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

MySQL Join子句与WHERE子句

以下两种方式完成条款的区别是什么?

SELECT * FROM table1 INNER JOIN table2 ON (
    table2.col1 = table1.col2 AND
    table2.member_id = 4
)
Run Code Online (Sandbox Code Playgroud)

我已将它们与基本查询进行比较,EXPLAIN EXTENDED并且没有看到差异.我想知道这里是否有人发现了一个更复杂/处理密集的环境的差异.

SELECT * FROM table1 INNER JOIN table2 ON (
    table2.col1 = table1.col2
)
WHERE table2.member_id = 4
Run Code Online (Sandbox Code Playgroud)

mysql query-optimization

16
推荐指数
2
解决办法
5982
查看次数

mysql修复使用where;

我的SQL查询:

SELECT *
FROM updates_cats
WHERE uid =118697835834
ORDER BY created_date ASC
Run Code Online (Sandbox Code Playgroud)

目前指数:

index1(uid, created_date)
Run Code Online (Sandbox Code Playgroud)

EXPLAIN EXTENDED结果:

1 SIMPLE updates_cats ref index1 index1 8 const 2 100.00 Using where
Run Code Online (Sandbox Code Playgroud)

如何修复Extra字段使用哪里可以使用索引?

编辑:显示创建表:

CREATE TABLE `updates_cats` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `u_cat_id` bigint(20) NOT NULL DEFAULT '0',
 `uid` bigint(20) NOT NULL,
 `u_cat_name` text COLLATE utf8_unicode_ci NOT NULL,
 `total_updates` int(11) unsigned NOT NULL DEFAULT '0',
 `created_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 PRIMARY KEY (`id`),
 KEY `index1` (`uid`,`created_date`)
) ENGINE=MyISAM AUTO_INCREMENT=23522 …
Run Code Online (Sandbox Code Playgroud)

mysql sql indexing query-optimization where

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

持久性数据库(MySQL/MongoDB/Cassandra/BigTable/BigData)与非持久性数组(PHP/PYTHON)

它将如何有益的是使用Python/PHP非持久阵列存储6GB +数据超过800万分美元排在RAM中,而不是使用MySQL /的MongoDB /卡桑德拉/ BigTable的/ BigData(持久性数据库)数据库,当谈到速度,简单的查询执行/延迟?

例如,在1秒内找到800多万行中的一个名称:是否可能?有没有人有处理超过1-2亿行数据集的经验,并在1秒内获得简单搜索查询的结果?

是否有更好的,经过验证的方法来处理数十亿行?

python optimization query-optimization bigdata mongodb

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

为什么SQL Server不使用计算列上的索引?

在SQL Server 2014 DB中给出以下内容:

create table t 
(
    c1 int primary key,
    c2 datetime2(7),
    c3 nvarchar(20),
    c4 as cast(dbo.toTimeZone(c2, c3, 'UTC') as date) persisted
);

create index i on t (c4);

declare @i int = 0;

while @i < 10000 
begin
    insert into t (c1, c2, c3) values
        (@i, dateadd(day, @i, '1970-01-02 03:04:05:6'), 'Asia/Manila');
    set @i = @i + 1;
end;
Run Code Online (Sandbox Code Playgroud)

toTimeZone是一个CLR UDF,它将datetime2时区转换为datetime2另一个时区.

当我运行以下查询时:

select c1 
from t 
where c4 >= '1970-01-02'
    and c4 <= …
Run Code Online (Sandbox Code Playgroud)

sql-server performance query-optimization database-performance sql-server-2014

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

当使用索引时,Mysql解释查询类型为"ALL"

我在Mysql中运行了一个查询,如下所示:

EXPLAIN
SELECT *
FROM(
        SELECT *  # Select Number 2
        FROM post
        WHERE   parentid = 13
        ORDER BY time, id
        LIMIT 1, 10
    ) post13_childs
JOIN post post13_childs_childs
ON post13_childs_childs.parentid = post13_childs.id
Run Code Online (Sandbox Code Playgroud)

结果是:

id |select_type  |table               |type |possible_keys  |key      |key_len  |ref              |rows    |Extra
1  |PRIMARY      |<derived2>          |ALL  | NULL          | NULL    |NULL     |NULL             |10      |
1  |PRIMARY      |post13_childs_childs|ref  |parentid       |parentid |9        |post13_childs.id |10      |Using where
2  |DERIVED      |post                |ALL  |parentid       |parentid |9        |                 |153153  |Using where; Using filesort
Run Code Online (Sandbox Code Playgroud)

这意味着它使用了索引, …

mysql sql indexing query-optimization explain

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