我有两张员工和出勤表。
employee:empID,empName
出勤率:出勤率,出勤率,日期,时间,出门时间
我需要在网格中显示这些数据,其中左侧是员工姓名,然后是日期。所以列标题就像Emp Name,1,2,3,4 ....,30,有或没有数据,需要打印一个月中的天数。
我意识到了三种方法。
通过empID以联接查询顺序获取出勤和员工数据。然后循环遍历数据并在它与当前日期匹配时打印它。这将一直持续到当前循环中的empID更改。
循环通过员工,然后在当月循环几天,每个记录都会从特定员工和特定日期的数据库中获取。
persistentDataPath
为了提高性能,我们尝试最小化数据库连接和不必要的循环。我喜欢实现第二种方式,因为它具有最小的条件和循环,代码是干净的。但它每天都在为每个员工进行数据库检索。有人可以指出一些事实来表现。
答案 0 :(得分:3)
在单个查询中获取记录并循环浏览更好。因为它必须一次调用数据库服务器。对于第二种方式 - 它必须多次调用数据库服务器,这更昂贵。
然后从数据中创建一个关联array
。索引将是empID
。
生成array
后,您可以根据需要使用它。
答案 1 :(得分:1)
尝试此查询
$sql="SELECT employee.empName AS empName, attendance.date AS date FROM employee,attendance WHERE employee.empID=attendance.empID";
答案 2 :(得分:0)
正如@Sougata建议的那样,在单个查询中获取记录并在其中循环更好。但请记住,查询性能应该增加如下:
避免单个查询中的多个联接 尽量避免使用包含外连接,交叉应用,外部应用和其他复杂子查询的多个连接来编写SQL查询。它减少了Optimizer决定连接顺序和连接类型的选择。有时,优化器被迫使用嵌套循环连接,而不管对于过度复杂的交叉应用或子查询的查询的性能影响
避免使用非相关标量子查询 您可以重新编写查询以将非相关标量子查询作为单独的查询而不是主查询的一部分进行删除,并将输出存储在变量中,该变量可在主查询或批处理的后续部分中引用。这将为优化器提供更好的选项,这可能有助于返回准确的基数估计值以及更好的计划。
创建和使用索引 我们意识到Index可以神奇地减少数据检索时间,但会对DML操作产生相反的影响,这可能会降低查询性能。有了这个事实,索引是一项具有挑战性的任务,但可以帮助提高SQL查询性能并为您提供最佳的查询响应时间。
创建高度选择性指数 选择性定义表中符合条件的行的百分比(限定行数/总行数)。如果符合条件的行数与总行数的比率较低,则索引具有高选择性并且最有用。如果比率大约为5%或更小,则非聚集索引最有用,这意味着如果索引可以从考虑中消除95%的行。如果索引返回表中超过5%的行,则可能不会使用它;要么选择或创建不同的索引,要么扫描表格。
在索引中放置列 索引中列的顺序或位置对于提高SQL查询性能也起着至关重要的作用。如果查询条件与索引键中最左侧的列匹配,则索引可以帮助提高SQL查询性能。作为最佳实践,大多数选择性列应位于非聚集索引的键的最左侧。