我有一个存储在1个表格中的电视节目列表.另一张桌子展示了流派(动作,浪漫,喜剧).
大多数节目通常都有超过1种类型,所以只有一个tv_genre列并将类型ID放在那里就不是一个选择.
我可以创建一个查找表来存储电视节目id +流派id,我可以为每个与节目相关的流派插入1行.
当我想要输出索引上的节目列表以及与电视节目相关的流派名称时,事情变得模糊.如何将3个表组合成1个有效的查询(而不是为索引上的每个项运行单独的查询,获取其类型).
就本文而言,表格如下
TV Show Table
- tv_id
- tv_name
Genre Table
- genre_id
- genre_name
Run Code Online (Sandbox Code Playgroud)
谢谢!
这更像是一种偏好,但我想知道人们认为什么是最佳选择.我有一个问题,答案和点(因为我需要跟踪哪个用户指出了这一点)
表转储
Question:
id
title
Answer:
id
question_id
user_id
response
Point_Answer:
id
answer_id
user_id
points
Run Code Online (Sandbox Code Playgroud)
因此,在此布局中获取Top Answer将需要复杂的连接序列.
SELECT t2.id, t2.user_id, t2.response, MAX(points)
FROM Question as t1,
(SELECT qa.*, SUM(pa.points) as points
FROM answer as qa, Point_Answer as pa
WHERE qa.id = pa.answer_id
GROUP BY qa.id) as t2
WHERE t1.id = %s AND t1.id = t2.question_id
Run Code Online (Sandbox Code Playgroud)
如果我这样改变它:
Question:
id
title
Answer:
id
question_id
user_id
response
points
Point_Answer:
id
answer_id
user_id
points
Run Code Online (Sandbox Code Playgroud)
查询的负担会减轻
SELECT A.id, A.user_id, A.response, MAX(points)
FROM Question as Q, …Run Code Online (Sandbox Code Playgroud) 我试图尽快将记录从一个表复制到另一个表.
目前我有一个类似于此的简单光标循环:
FOR rec IN source_cursor LOOP
INSERT INTO destination (a, b) VALUES (rec.a, rec.b)
END LOOP;
Run Code Online (Sandbox Code Playgroud)
我想加快它的速度,所以我正在尝试一些BULK操作(BULK FETCH,然后是FORALL插入):
这是我对批量选择/ forall插入的内容.
DECLARE
TYPE t__event_rows IS TABLE OF _event%ROWTYPE;
v__event_rows t__event_rows;
CURSOR c__events IS
SELECT * FROM _EVENT ORDER BY MESSAGE_ID;
BEGIN
OPEN c__events;
LOOP
FETCH c__events BULK COLLECT INTO v__event_rows LIMIT 10000; -- limit to 10k to avoid out of memory
EXIT WHEN c__events%NOTFOUND;
FORALL i IN 1..v__event_rows.COUNT SAVE EXCEPTIONS
INSERT INTO destinatoin
( col1, col2, a_sequence)
VALUES
( v__event_rows(i).col1, …Run Code Online (Sandbox Code Playgroud) 可以优化和缩小此样本函数吗?我怎么能这样做?
$(function () {
$("#options").change(function () {
var message_index = $("#options").val();
if (message_index == 0) {
$("#display_image").show();
$("#display_flash, #display_youtube, #display_google").hide();
} else if (message_index == 1) {
$("#display_flash").show();
$("#display_image, #display_youtube, #display_google").hide();
} else if (message_index == 2) {
$("#display_youtube").show();
$("#display_image, #display_flash, #display_google").hide();
} else if (message_index == 3) {
$("#display_google").show();
$("#display_image, #display_flash, #display_youtube").hide();
} else {
$("#display_image, #display_flash, #display_youtube, #display_google").hide();
}
});
});
Run Code Online (Sandbox Code Playgroud) 我有一个翻译表(MySQL MyISAM)用于单词(现在是空的,但一旦插入单词就会变得很大).
只有两种SELECT可以在该表上请求信息:
SELECT translation FROM table WHERE lang_original='en' AND lang_target='de' AND word = 'house'
//this will return 'Haus'
Run Code Online (Sandbox Code Playgroud)
SELECT lang_original,translation FROM table WHERE lang_target='de' AND word = 'house'
//this will return 'en','Haus'
Run Code Online (Sandbox Code Playgroud)
通常我会将这些字段与单独的索引:
但是,我刚刚阅读了另一个线程中的组合索引,但我仍然对如何使用它们有一些疑问.
我应该只有3个索引吗?
那些组合索引应该是UNIQUE还是INDEX类型?为什么?
我是否还需要为lang_original,lang_target和word设置分离的索引,尽管它们不会被自己过滤掉?
更新1 fixed =而不是LIKE
我的应用程序中有一个非常宽且非常高的多个表.宽度有时是10-20列,包含各种数据类型varchar/nvarchar以及char/bigint/int/decimal.我的理解是SQL中的默认页面大小是8k,但可以手动更改.此外,varchar/nvarchar列除此限制外,它们通常(始终?)移动到一个单独的位置,即一个名为Row_Overflow的进程.Evenso,MS文档指出,行溢出数据会降低性能."查询和执行其他选择操作,例如对包含行溢出数据的大型记录进行排序或连接会减慢处理时间,因为这些记录是同步处理的,而不是异步处理的"
他们建议将大列移动到可连接的元数据表中."然后可以在异步JOIN操作中查询".
我的问题是,是否值得扩大页面大小以容纳宽列,是否还会出现其他性能问题?如果我没有这样做,而是将表分成一个或多个元数据表,并且表格在100MM记录范围内变得"大",那么加入分区表是否会远远超过好处?此外,如果SQL Server在单个核心机器上(或在SQL Azure上),我的理解是并行性被禁用,那么这也会消除移动表介绍分区的好处,因为连接将不再是异步的?您推荐的其他策略是什么?
编辑:根据下面的好评和一些额外的阅读(我本来应该做的),你不能手动改变SQL Server页面大小.另外,相关SO帖子:我们如何更改SQL Server的页面大小?.来自@ remus-rusanu的其他很棒的答案
我在接受采访时被问到,Select * from TableA如果需要花费大量时间来执行,我可以使用这些方法来优化查询.(TableA)可以是具有大量数据的任何表.面试官没有给我任何选择,如选择几列或使用"WHERE"条款而不是他希望我为主题查询提供解决方案.
如何优化此SQL查询?
(SELECT SUM (same_field) FROM same_table WHERE other_same_field = '0') AS a,
(SELECT SUM (same_field) FROM same_table WHERE other_same_field = '1') AS b,
(SELECT SUM (same_field) FROM same_table WHERE other_same_field = '2') AS c
Run Code Online (Sandbox Code Playgroud) 我正在使用Flask进行我正在使用的一个应用程序,以及用于存储数据的sqlalchemy和MySQL数据库.Jinja2用于模板化.在开发过程中,一切都很好,但是现在当使用更大的数据集时,我对包含大量数据的一些网页的呈现速度非常慢.例如,此代码处理用户列表:
def users():
q = Users.query.all()
out = []
for i in q:
try:
something_i_need = Table.query.filter_by(email=i.email).order_by(Table.date).first().id
except:
something_i_need = 0
out.append({
'id': i.id,
'last_name': i.last_name,
'first_name': i.first_name,
'middle_name': i.middle_name,
'phone': i.phone,
'team': i.team,
'status': i.status,
'needed': something_i_need,
'some_more_data': i.some_more_data
})
return render_template('users.html', list_of_users=out)
Run Code Online (Sandbox Code Playgroud)
数据有点简化,因为列表中有更多字段.对此位置的调用(一次查询大约2000个用户)需要10秒以上,然后页面的负载也需要10-20.该表由以下主题函数包装,来自此链接的第一个表,虽然在某些列上禁用排序功能有帮助,但它仍然非常慢.
所以,我想知道,我如何优化此过程或生成模板以使其更快?我在Amazon EC2实例上运行它Python 2.7.3 and mod_wsgi, Flask 0.9, Flask-SQLAlchemy=0.16, Jinja2==2.7, MySQL-python=1.2.4, SQLAlchemy=0.8.1.一个"明显"的解决方案,一次分页并返回100个左右的记录将真正起作用,因为列表必须包含所有用户以进行排序(主要是日期),因此该解决方案将是最后的手段.
提前致谢!
我想避免我的查询有一些冗余的代码.这是一个非常简单的id-like做的例子:
SELECT
p.id,
p.NOM,
CONCAT(p.NANE,'_2') AS CLONE ,
(SELECT id FROM person WHERE NAME = CONCAT(p.NOM,'_2') )
FROM person p
Run Code Online (Sandbox Code Playgroud)
我有2次相同的代码:
CONCAT(PERSON.NAME,'_CLONE')
Run Code Online (Sandbox Code Playgroud)
它不容易维护(上面的代码只是我正在尝试做的一个简单的例子).
是否有解决方案可以获得相同的结果(在MySQL中运行(使用v14.14测试)):
SELECT
p.id,
p.name,
CONCAT(p.name,'_clone') as CLONE ,
(SELECT ID FROM person WHERE name = CLONE) AS CLONE_ID
FROM person p
Run Code Online (Sandbox Code Playgroud)
此代码不适用于Oracle 11.2.0.2.0我是oracle的新手,所以我不知道上面的MySQL SQL代码的翻译是什么:s
你能帮我找一个好的写作方式吗?
sql ×5
mysql ×4
oracle ×2
sql-server ×2
bulkinsert ×1
flask ×1
indexing ×1
jinja2 ×1
jquery ×1
optimization ×1
plsql ×1
t-sql ×1